diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..52ad81f
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - "6"
+  - "4"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..fcb1d0e
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,67 @@
+[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0)
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor 
+# license agreements.  See the NOTICE file distributed with this work for additional 
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this 
+# file except in compliance with the License.  You may obtain a copy of the License 
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed 
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+-->
+
+# Contributing to Apache OpenWhisk
+
+Anyone can contribute to the OpenWhisk project and we welcome your contributions.
+
+There are multiple ways to contribute: report bugs, improve the docs, and
+contribute code, but you must follow these prerequisites and guidelines:
+
+ - [Contributor License Agreement](#contributor-license-agreement)
+ - [Raising issues](#raising-issues)
+ - [Coding Standards](#coding-standards)
+
+### Contributor License Agreement
+
+All contributors must sign and submit an Apache CLA (Contributor License Agreement).
+
+Instructions on how to do this can be found here:
+[http://www.apache.org/licenses/#clas](http://www.apache.org/licenses/#clas)
+
+Once submitted, you will receive a confirmation email from the Apache Software Foundation (ASF) and be added to
+the following list: http://people.apache.org/unlistedclas.html. 
+
+Project committers will use this list to verify pull requests (PRs) come from contributors that have signed a CLA.
+
+We look forward to your contributions! 
+
+## Raising issues
+
+Please raise any bug reports on the respective project repository's GitHub issue tracker. Be sure to search the 
+list to see if your issue has already been raised.
+
+A good bug report is one that make it easy for us to understand what you were trying to do and what went wrong. 
+Provide as much context as possible so we can try to recreate the issue.
+
+### Discussion
+
+Please use the project's developer email list to engage our community:
+[dev@openwhisk.incubator.apache.org](dev@openwhisk.incubator.apache.org)
+
+In addition, we provide a "dev" Slack team channel for conversations at:
+https://openwhisk-team.slack.com/messages/dev/
+
+### Coding standards
+
+Please ensure you follow the coding standards used throughout the existing
+code base. Some basic rules include:
+
+ - all files must have the Apache license in the header.
+ - all PRs must have passing builds for all operating systems.
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..a2fe52f
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2015-2016  IBM Corporation
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README.md b/README.md
index ce20ce8..b9ee857 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,21 @@
 #OpenWhisk Playground
+
+## Usage
+
+This library provides functionality of executing
+a snippet of source code as OpenWhisk action for 
+OpenWhisk Xcode Source Editor Extension 
+in order to test Swift OpenWhisk functions quickly.
+More details in https://github.com/openwhisk/openwhisk-xcode
+
+## Development and testing
+
+```
+DEBUG=openwhisk-playground nodemon test.js
+```
+
+and with more debugging
+
+```
+DEBUG=openwhisk-playground-test,openwhisk-playground nodemon ./test.js
+```
diff --git a/hello-action.js b/hello-action.js
new file mode 100644
index 0000000..8377d6f
--- /dev/null
+++ b/hello-action.js
@@ -0,0 +1,10 @@
+function main() {
+    console.log('log action started')
+//   return {payload: 'Hello world'};
+    return new Promise(function(resolve, reject) {
+      setTimeout(function() {
+        console.log('log action finished')
+        resolve({ done: true, payload: 'result Hello world2' });
+      }, 1000);
+   })
+}
diff --git a/openwhisk-playground.js b/openwhisk-playground.js
new file mode 100644
index 0000000..8b7ccfe
--- /dev/null
+++ b/openwhisk-playground.js
@@ -0,0 +1,170 @@
+'use strict';
+
+const debug = require('debug')('openwhisk-playground')
+const openwhisk = require('openwhisk');
+const fs = require("fs");
+const path = require("path");
+const PropertiesReader = require('properties-reader');
+
+var loadDefaultAuth = function () {
+  //Expected cat ~/.wskprops
+  //APIHOST=openwhisk.ng.bluemix.net
+  //NAMESPACE=
+  //AUTH=8b6d8615-9
+  const userDir = process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'];
+  const wskFilePath = path.format({ dir: userDir, base: '.wskprops' });
+  var wskProperties = PropertiesReader(wskFilePath)
+  var auth = wskProperties.get('AUTH')
+  return auth
+}
+
+const DEFAULT_OW_API_URL = process.env.OW_API_URL || 'https://openwhisk.ng.bluemix.net/api/v1/'
+const DEFAULT_OW_NAMESPACE = process.env.OW_NAMESPACE || '_'
+const DEFAULT_OW_API_KEY = process.env.OW_API_KEY
+
+var playground = function (config) {
+  if (!config) {
+    config = {}
+  }
+  var api_key = config.api_key
+  if (!api_key) {
+    if (DEFAULT_OW_API_KEY) {
+      api_key = DEFAULT_OW_API_KEY
+    } else {
+      api_key = loadDefaultAuth()
+    }
+  }
+  var api = config.api
+  if (!api) {
+    api = DEFAULT_OW_API_URL
+  }
+  var api = config.api
+  if (!api) {
+    api = DEFAULT_OW_API_URL
+  }
+  var namespace = config.namespace
+  if (!namespace) {
+    namespace = DEFAULT_OW_NAMESPACE
+  }
+  //console.log('auth=' + auth)
+  this.owParams = { api: api, api_key: api_key, namespace: namespace }
+  this.ow = openwhisk(this.owParams)
+}
+
+playground.prototype.setInjectLogRetrievalFailure = function (inject) {
+  this.injectLogRetrievalFailure = inject;
+}
+
+playground.prototype.getEndpoint = function () {
+  return this.owParams.api;
+}
+
+playground.prototype.getApiKey = function () {
+  return this.owParams.api_key;
+}
+
+playground.prototype.getParameters = function () {
+  return this.owParams;
+}
+
+
+function merge(obj1, obj2) {
+  var obj3 = {};
+  if (obj1.constructor.name !== 'Object') {
+    obj3.name = obj1.constructor.name
+    obj3.message = "" + obj1
+  } else {
+    for (var attrName1 in obj1) {
+      obj3[attrName1] = obj1[attrName1]
+    }
+  }
+  for (var attrName2 in obj2) {
+    obj3[attrName2] = obj2[attrName2]
+  }
+  return obj3;
+}
+
+function MyBaseOperationError(message, error) {
+  Error.captureStackTrace(this, this.constructor);
+  this.name = this.constructor.name;
+  this.message = message;
+  this.error = error;
+}
+
+function timeout(duration) {
+  return new Promise(function (resolve) {
+    setTimeout(resolve, duration)
+  })
+}
+
+playground.prototype.evaluate = function (params, success, errors) {
+  const actionName = params.actionName
+  const kind = params.kind
+  const input_params = params.input_params
+  const default_params = params.default_params
+  const code = params.code
+  debug('evaluate invoking OW actionName=' + actionName + ' kind=' + kind + ' input_params=' + JSON.stringify(input_params) + ' default_params=' + JSON.stringify(default_params) + ' code=' + code)
+  //require('request-debug')(ow.actions.get_rp());
+  const options = {
+    actionName: actionName
+  };
+  options.action = {
+    parameters: default_params,
+    exec: { actionName: actionName, code: code, kind: kind }
+  }
+  //ow.actions.update({actionName: actionName, action: code, kind: kind, params: default_params }).then(result => {
+  const ow = this.ow
+  const pipelineResults = {}
+  pipelineResults.listOfResults = []
+  var activationId = null
+  ow.actions.update(options)
+    .then(result => {
+      pipelineResults.listOfResults.push(result)
+      debug("evaluate updated result=" + JSON.stringify(result));
+      return ow.actions.invoke({ actionName: actionName, params: input_params, blocking: true })
+    })
+    .then(invoke_result => {
+      pipelineResults.listOfResults.push(invoke_result)
+      debug("evaluate invoked invoke_result=" + JSON.stringify(invoke_result))
+      activationId = invoke_result.activationId
+      debug("evaluate activationId=" + activationId);
+      if (this.injectLogRetrievalFailure) {
+        throw new MyBaseOperationError('failed', null)
+      }
+      return ow.activations.get({ activation: activationId })
+    })
+    // .then(log_result => {
+    //pipelineResults.list.push(log_result)
+    //   console.log('evaluate activati o nget log_result=' + JSON.stringify(log_result))
+    //   return log_result
+    // })
+    .catch(err => {
+      if (activationId) {
+        const waitMs = 1000
+        debug('evaluate retry log retrieval after ' + waitMs + 'ms err=' + JSON.stringify(err))
+        return timeout(waitMs).then(function () {
+          debug('evaluate skipping err=' + err + ' to get logs for ' + activationId)
+          return ow.activations.get({ activation: activationId })
+        })
+      } else {
+        debug('evaluate re-throw err=' + err)
+        throw err
+      }
+    })
+    .then(result => {
+      //console.log('evaluate pipelineResults=' + JSON.stringify(pipelineResults, null, 2))
+      // console.log('evaluate final result=' + JSON.stringify(result, null, 2))
+      var mergedResult = merge(result, pipelineResults)
+      debug('evaluate final success mergedResult=' + JSON.stringify(mergedResult, null, 2))
+      success(mergedResult)
+    })
+    .catch(err => {
+      console.log('evaluate final err=' + err)     //pipelineResults.list.push(err)
+      var mergedResult = merge(err, pipelineResults)
+      debug('evaluate final errors mergedResult=' + JSON.stringify(mergedResult, null, 2))
+      errors(mergedResult)
+    })
+}
+
+module.exports = playground
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..164749b
--- /dev/null
+++ b/package.json
@@ -0,0 +1,32 @@
+{
+  "name": "openwhisk-playground",
+  "version": "1.0.0",
+  "description": "OpenWhisk Playground library",
+  "main": "openwhisk-playground.js",
+  "scripts": {
+    "start": "node test.js",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "engines": {
+    "node": "7.7.3",
+    "npm": "4.1.2"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/openwhisk/openwhisk-playground.git"
+  },
+  "keywords": [
+    "OpenWhisk",
+    "playground"
+  ],
+  "author": "Alek Slominski",
+  "license": "Apache-2.0",
+  "dependencies": {
+    "debug": "^2.6.4",
+    "openwhisk": "^2.6.0",
+    "properties-reader": "0.0.15"
+  },
+  "devDependencies": {
+    "nock": "^9.0.13"
+  }
+}
diff --git a/test-config.js b/test-config.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test-config.js
diff --git a/test.js b/test.js
new file mode 100644
index 0000000..d99dfdd
--- /dev/null
+++ b/test.js
@@ -0,0 +1,46 @@
+const debug = require('debug')('openwhisk-playground-test')  
+const assert = require('assert')
+
+var OpenWhiskPlayground = require("./openwhisk-playground.js")
+
+// const config = { }
+const playground = new OpenWhiskPlayground()
+
+debug('invoking endpoint=' + playground.getEndpoint())
+
+// code = load test-action-getnews.js
+var fs = require('fs')
+
+var sourceCode = fs.readFileSync('hello-action.js', 'utf-8')
+
+
+function test() {
+  const params = {
+    actionName: 'hello-action.js',
+    kind : 'nodejs:6',
+    input_params: {},
+    default_params: [],
+    code : sourceCode
+  }
+
+  debug('invoking with params=' + JSON.stringify(params, null, 2))
+
+  var success = function (result) {
+    debug('success=' + JSON.stringify(result, null, 2))
+  }
+
+  var error = function (err) {
+    debug('error=' + JSON.stringify(err, null, 2))
+    assert.ok(false, ' failed '+ JSON.stringify(err));
+  }
+
+
+  // evaluate
+  playground.setInjectLogRetrievalFailure(true)
+  playground.evaluate(params, success, error)
+
+}
+
+test()
+
+module.exports = test
\ No newline at end of file
diff --git a/test.sh b/test.sh
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test.sh
