diff --git a/actions/account-actions/create-database.js b/actions/account-actions/create-database.js
index eeda689..96dd970 100755
--- a/actions/account-actions/create-database.js
+++ b/actions/account-actions/create-database.js
@@ -6,13 +6,13 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
 
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
   if (!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
 
   var promise = createDatabase(cloudant, dbName);
@@ -44,16 +44,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/account-actions/delete-database.js b/actions/account-actions/delete-database.js
index f4e414f..37a0fb4 100755
--- a/actions/account-actions/delete-database.js
+++ b/actions/account-actions/delete-database.js
@@ -6,13 +6,13 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
 
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
   if (!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
 
   return destroyDatabase(cloudant, dbName);
@@ -42,16 +42,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/account-actions/list-all-databases.js b/actions/account-actions/list-all-databases.js
index da44b1d..3f0b19c 100755
--- a/actions/account-actions/list-all-databases.js
+++ b/actions/account-actions/list-all-databases.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
 
@@ -18,7 +18,7 @@
     cloudant.db.list(function(error, response) {
       if (!error) {
         console.log('success', response);
-        //Response is an array and only JSON objects can be passed to whisk.done
+        //Response is an array and only JSON objects can be passed
         var responseObj = {};
         responseObj.all_databases = response;
         resolve(responseObj);
@@ -40,16 +40,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/account-actions/read-database.js b/actions/account-actions/read-database.js
index 6744c97..fb8cd48 100755
--- a/actions/account-actions/read-database.js
+++ b/actions/account-actions/read-database.js
@@ -6,12 +6,12 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
   if (!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
 
   return readDatabase(cloudant, dbName);
@@ -41,16 +41,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/account-actions/read-updates-feed.js b/actions/account-actions/read-updates-feed.js
index 24ad092..e7f48f7 100755
--- a/actions/account-actions/read-updates-feed.js
+++ b/actions/account-actions/read-updates-feed.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var params = {};
@@ -17,7 +17,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -48,16 +48,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/changes.js b/actions/changes.js
index e50f6fa..5301a73 100644
--- a/actions/changes.js
+++ b/actions/changes.js
@@ -25,36 +25,23 @@
     if (lifecycleEvent === 'CREATE') {
 
     	// check for parameter errors
-        var paramError;
         if (msg.includeDoc) {
-            paramError = 'cloudant trigger feed: includeDoc parameter is no longer supported';
-            console.log(paramError, '[error:]', whisk.error(paramError));
-            return;
+            return Promise.reject('cloudant trigger feed: includeDoc parameter is no longer supported');
         }
         if (!dbname) {
-        	paramError = 'cloudant trigger feed: missing dbname parameter - ' + dbname;
-            console.log(paramError, '[error:]', whisk.error(paramError));
-            return;
+        	return Promise.reject('cloudant trigger feed: missing dbname parameter - ' + dbname);
         }
         if (!host) {
-        	paramError = 'cloudant trigger feed: missing host parameter - ' + host;
-            console.log(paramError, '[error:]', whisk.error(paramError));
-            return;
+        	return Promise.reject('cloudant trigger feed: missing host parameter - ' + host);
         }
         if (!user) {
-        	paramError = 'cloudant trigger feed: missing username parameter - ' + user;
-            console.log(paramError, '[error:]', whisk.error(paramError));
-            return;
+        	return Promise.reject('cloudant trigger feed: missing username parameter - ' + user);
         }
         if (!pass) {
-        	paramError = 'cloudant trigger feed: missing password parameter - ' + pass;
-            console.log(paramError, '[error:]', whisk.error(paramError));
-            return;
+        	return Promise.reject('cloudant trigger feed: missing password parameter - ' + pass);
         }
         if (namespace === "_") {
-            paramError = 'You must supply a non-default namespace.';
-            console.log(paramError, '[error:]', whisk.error(paramError));
-            return;
+            return Promise.reject('You must supply a non-default namespace.');
         }
 
         // auth key for trigger
@@ -81,7 +68,7 @@
 
         return cloudantHelper(provider_endpoint, 'delete', replaceNameTrigger, jsonOptions);
     } else {
-    	return whisk.error('operation is neither CREATE or DELETE');
+    	return Promise.reject('operation is neither CREATE or DELETE');
     }
 }
 
diff --git a/actions/database-actions/create-document.js b/actions/database-actions/create-document.js
index 9de6c85..a935790 100755
--- a/actions/database-actions/create-document.js
+++ b/actions/database-actions/create-document.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -14,10 +14,10 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!doc) {
-    return whisk.error('doc is required.');
+    return Promise.reject('doc is required.');
   }
 
   if (typeof message.doc === 'object') {
@@ -26,10 +26,10 @@
     try {
       doc = JSON.parse(message.doc);
     } catch (e) {
-      return whisk.error('doc field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('doc field cannot be parsed. Ensure it is valid JSON.');
     }
   } else {
-    return whisk.error('doc field is ' + (typeof doc) + ' and should be an object or a JSON string.');
+    return Promise.reject('doc field is ' + (typeof doc) + ' and should be an object or a JSON string.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -39,7 +39,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -73,16 +73,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/create-query-index.js b/actions/database-actions/create-query-index.js
index 2507e6b..1bcec17 100755
--- a/actions/database-actions/create-query-index.js
+++ b/actions/database-actions/create-query-index.js
@@ -6,17 +6,17 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
   var index = message.index;
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!index) {
-    return whisk.error('index is required.');
+    return Promise.reject('index is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -26,7 +26,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -57,16 +57,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/create-update-attachment.js b/actions/database-actions/create-update-attachment.js
index de9e110..54e0ff6 100755
--- a/actions/database-actions/create-update-attachment.js
+++ b/actions/database-actions/create-update-attachment.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -17,19 +17,19 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   if(!attName) {
-    return whisk.error('attachmentname is required.');
+    return Promise.reject('attachmentname is required.');
   }
   if(!att) {
-    return whisk.error('attachment is required.');
+    return Promise.reject('attachment is required.');
   }
   if(!contentType) {
-    return whisk.error('contenttype is required.');
+    return Promise.reject('contenttype is required.');
   }
   //Add document revision to query if it exists
   if(typeof message.docrev !== 'undefined') {
@@ -43,7 +43,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -60,7 +60,7 @@
         console.log("success", response);
         resolve(response);
       } else {
-        console.log("error", error)
+        console.log("error", error);
         reject(error);
       }
     });
@@ -77,16 +77,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/delete-attachment.js b/actions/database-actions/delete-attachment.js
index dacb951..767b22c 100755
--- a/actions/database-actions/delete-attachment.js
+++ b/actions/database-actions/delete-attachment.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -15,19 +15,19 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   if(!attName) {
-    return whisk.error('attachmentname is required.');
+    return Promise.reject('attachmentname is required.');
   }
   //Add document revision to query if it exists
   if(typeof message.docrev !== 'undefined') {
     params.rev = message.docrev;
   } else {
-    return whisk.error('docrev is required.');
+    return Promise.reject('docrev is required.');
   }
 
   var cloudantDb = cloudant.use(dbName);
@@ -38,7 +38,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -55,7 +55,7 @@
         console.log("success", response);
         resolve(response);
       } else {
-        console.log("error", error)
+        console.log("error", error);
         reject(error);
       }
     });
@@ -72,16 +72,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/delete-document.js b/actions/database-actions/delete-document.js
index 7448e65..1204b3f 100755
--- a/actions/database-actions/delete-document.js
+++ b/actions/database-actions/delete-document.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -14,13 +14,13 @@
   var docRev = message.docrev;
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   if(!docRev) {
-    return whisk.error('docrev is required.');
+    return Promise.reject('docrev is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -55,16 +55,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/delete-query-index.js b/actions/database-actions/delete-query-index.js
index 522be2e..bd95c79 100755
--- a/actions/database-actions/delete-query-index.js
+++ b/actions/database-actions/delete-query-index.js
@@ -8,7 +8,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -17,16 +17,16 @@
   var indexType = message.indextype;
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   if(!indexName) {
-    return whisk.error('indexname is required.');
+    return Promise.reject('indexname is required.');
   }
   if(!indexType) {
-    return whisk.error('indextype is required.');
+    return Promise.reject('indextype is required.');
   }
 
   return deleteIndexFromDesignDoc(cloudant, docId, indexName, indexType, dbName);
@@ -65,16 +65,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/delete-view.js b/actions/database-actions/delete-view.js
index ae018be..5a5b387 100755
--- a/actions/database-actions/delete-view.js
+++ b/actions/database-actions/delete-view.js
@@ -8,7 +8,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -17,15 +17,15 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
   if(!viewName) {
-    return whisk.error('viewname is required.');
+    return Promise.reject('viewname is required.');
   }
   if (typeof message.params === 'object') {
     params = message.params;
@@ -33,7 +33,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -77,7 +77,7 @@
         console.log('success', response);
         resolve(response);
       } else {
-        console.log('error', error)
+        console.log('error', error);
         reject(error);
       }
     });
@@ -94,16 +94,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/exec-query-find.js b/actions/database-actions/exec-query-find.js
index 2c85b1e..8038bd0 100755
--- a/actions/database-actions/exec-query-find.js
+++ b/actions/database-actions/exec-query-find.js
@@ -6,17 +6,17 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
   var query = message.query;
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!query) {
-    return whisk.error('query field is required.');
+    return Promise.reject('query field is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -26,10 +26,10 @@
     try {
       query = JSON.parse(message.query);
     } catch (e) {
-      return whisk.error('query field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('query field cannot be parsed. Ensure it is valid JSON.');
     }
   } else {
-    return whisk.error('query field is ' + (typeof query) + ' and should be an object or a JSON string.');
+    return Promise.reject('query field is ' + (typeof query) + ' and should be an object or a JSON string.');
   }
 
   return queryIndex(cloudantDb, query);
@@ -60,16 +60,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/exec-query-search.js b/actions/database-actions/exec-query-search.js
index 75d4f92..ce9cea0 100755
--- a/actions/database-actions/exec-query-search.js
+++ b/actions/database-actions/exec-query-search.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -15,16 +15,16 @@
   var search = message.search;
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   if(!indexName) {
-    return whisk.error('indexname is required.');
+    return Promise.reject('indexname is required.');
   }
   if(!search) {
-    return whisk.error('search query is required.');
+    return Promise.reject('search query is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -35,10 +35,10 @@
     try {
       search = JSON.parse(message.search);
     } catch (e) {
-      return whisk.error('search field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('search field cannot be parsed. Ensure it is valid JSON.');
     }
   } else {
-    return whisk.error('search field is ' + (typeof search) + ' and should be an object or a JSON string.');
+    return Promise.reject('search field is ' + (typeof search) + ' and should be an object or a JSON string.');
   }
 
   return querySearch(cloudantDb, docId, indexName, search);
@@ -68,16 +68,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/exec-query-view.js b/actions/database-actions/exec-query-view.js
index dc1a611..f719310 100755
--- a/actions/database-actions/exec-query-view.js
+++ b/actions/database-actions/exec-query-view.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -15,13 +15,13 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   if(!viewName) {
-    return whisk.error('viewname is required.');
+    return Promise.reject('viewname is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -31,7 +31,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -65,16 +65,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/list-design-documents.js b/actions/database-actions/list-design-documents.js
index 8cd60eb..c5a2741 100755
--- a/actions/database-actions/list-design-documents.js
+++ b/actions/database-actions/list-design-documents.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -14,7 +14,7 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   var cloudantDb = cloudant.use(dbName);
   //Add start and end key to get _design docs
@@ -58,16 +58,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/list-documents.js b/actions/database-actions/list-documents.js
index 1a576de..6f7401b 100755
--- a/actions/database-actions/list-documents.js
+++ b/actions/database-actions/list-documents.js
@@ -6,14 +6,14 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -23,7 +23,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -57,16 +57,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/list-query-indexes.js b/actions/database-actions/list-query-indexes.js
index b91fc98..d3ee9cf 100755
--- a/actions/database-actions/list-query-indexes.js
+++ b/actions/database-actions/list-query-indexes.js
@@ -6,13 +6,13 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -43,16 +43,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/manage-bulk-documents.js b/actions/database-actions/manage-bulk-documents.js
index e99851c..42e1aa9 100755
--- a/actions/database-actions/manage-bulk-documents.js
+++ b/actions/database-actions/manage-bulk-documents.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -14,10 +14,10 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docs) {
-    return whisk.error('docs is required.');
+    return Promise.reject('docs is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -27,7 +27,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -37,10 +37,10 @@
     try {
       docs = JSON.parse(message.docs);
     } catch (e) {
-      return whisk.error('docs field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('docs field cannot be parsed. Ensure it is valid JSON.');
     }
   } else {
-    return whisk.error('docs field is ' + (typeof docs) + ' and should be an object or a JSON string.');
+    return Promise.reject('docs field is ' + (typeof docs) + ' and should be an object or a JSON string.');
   }
 
   return bulk(cloudantDb, docs, params);
@@ -72,16 +72,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/read-attachment.js b/actions/database-actions/read-attachment.js
index a4827af..bcff416 100755
--- a/actions/database-actions/read-attachment.js
+++ b/actions/database-actions/read-attachment.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -15,13 +15,13 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   if(!attName) {
-    return whisk.error('attachmentname is required.');
+    return Promise.reject('attachmentname is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -31,12 +31,12 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
   //Add document revision to query if it exists
-  if(typeof message.docrev != 'undefined') {
+  if(typeof message.docrev !== 'undefined') {
     params.rev = message.docrev;
   }
 
@@ -70,16 +70,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/read-changes-feed.js b/actions/database-actions/read-changes-feed.js
index 256ff04..c28bad0 100755
--- a/actions/database-actions/read-changes-feed.js
+++ b/actions/database-actions/read-changes-feed.js
@@ -6,14 +6,14 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
 
   if (typeof message.params === 'object') {
@@ -22,7 +22,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -53,16 +53,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/read-document.js b/actions/database-actions/read-document.js
index ea12a7c..00e8ff9 100755
--- a/actions/database-actions/read-document.js
+++ b/actions/database-actions/read-document.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -14,10 +14,10 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
   if(!docId) {
-    return whisk.error('docid is required.');
+    return Promise.reject('docid is required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -27,7 +27,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -58,16 +58,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
diff --git a/actions/database-actions/update-document.js b/actions/database-actions/update-document.js
index 6486502..7d00783 100755
--- a/actions/database-actions/update-document.js
+++ b/actions/database-actions/update-document.js
@@ -6,7 +6,7 @@
 function main(message) {
   var cloudantOrError = getCloudantAccount(message);
   if (typeof cloudantOrError !== 'object') {
-    return whisk.error('getCloudantAccount returned an unexpected object type.');
+    return Promise.reject(cloudantOrError);
   }
   var cloudant = cloudantOrError;
   var dbName = message.dbname;
@@ -14,7 +14,7 @@
   var params = {};
 
   if(!dbName) {
-    return whisk.error('dbname is required.');
+    return Promise.reject('dbname is required.');
   }
 
   if (typeof message.doc === 'object') {
@@ -23,13 +23,13 @@
     try {
       doc = JSON.parse(message.doc);
     } catch (e) {
-      return whisk.error('doc field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('doc field cannot be parsed. Ensure it is valid JSON.');
     }
   } else {
-    return whisk.error('doc field is ' + (typeof doc) + ' and should be an object or a JSON string.');
+    return Promise.reject('doc field is ' + (typeof doc) + ' and should be an object or a JSON string.');
   }
   if(!doc || !doc.hasOwnProperty("_rev")) {
-    return whisk.error('doc and doc._rev are required.');
+    return Promise.reject('doc and doc._rev are required.');
   }
   var cloudantDb = cloudant.use(dbName);
 
@@ -39,7 +39,7 @@
     try {
       params = JSON.parse(message.params);
     } catch (e) {
-      return whisk.error('params field cannot be parsed. Ensure it is valid JSON.');
+      return Promise.reject('params field cannot be parsed. Ensure it is valid JSON.');
     }
   }
 
@@ -56,7 +56,7 @@
         console.log('success', response);
         resolve(response);
       } else {
-        console.log('error', error)
+        console.log('error', error);
         reject(error);
       }
     });
@@ -73,16 +73,13 @@
     cloudantUrl = message.url;
   } else {
     if (!message.host) {
-      whisk.error('cloudant account host is required.');
-      return;
+      return 'cloudant account host is required.';
     }
     if (!message.username) {
-      whisk.error('cloudant account username is required.');
-      return;
+      return 'cloudant account username is required.';
     }
     if (!message.password) {
-      whisk.error('cloudant account password is required.');
-      return;
+      return 'cloudant account password is required.';
     }
 
     cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
