Configure as stand-alone repo
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..78105b3
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,32 @@
+sudo: required
+group: deprecated-2017Q3
+language: scala
+scala:
+- 2.11.8
+services:
+- docker
+before_install:
+- "./tools/travis/setup.sh"
+install: true
+script:
+- "./tools/travis/build.sh && ./tools/travis/build_sdk.sh && ./tools/travis/deploy.sh && ./tools/travis/test.sh"
+before_deploy:
+- "./tools/travis/rename_sdk.sh ${TRAVIS_TAG%@*} ${TRAVIS_TAG##*@}"
+deploy:
+- provider: script
+  script: "./tools/travis/publish.sh csantanapr ${TRAVIS_TAG%@*} ${TRAVIS_TAG##*@}"
+  on:
+    tags: true
+    all_branches: true
+    condition: "${TRAVIS_TAG%@*} = dockerskeleton"
+- provider: releases
+  api_key:
+    secure: "q8erbGUKDQcrEe4H1DT0UDHnbTb7eNP4RkM3K6VIT+lfLRHJBKlVLW5MepQugyLVdJGAuvKR60pEAjTzTeRf6yy/fARvq+CQk4Kqy5rBJdvbCkCIAL+kvdFx1HJ/4YZ0rNFQf41uNpONf4bAv7fX7E2KprXgLSZ0HSEuMLD5v4FGQ8OaxOMmFVSEFOYuzUD/UdX/xTx6XMmmwIXu3NxNQeOxbOlcZMalF4NQS+tOIFVDPfprRFIyVkORfdS+yfhEZ8PjtyZ9h+oDvRiqxIP/8LVcNuuxSnShPN/hx55rE79XJc6OC74LSOa2aKRvKlcYnSZBMj+FtIj4/VCjkcSb5tEvr96243lXzg0nKCaEY9dQZ1mk0Qbw7mSo5abXqOSNqVR5y6zEw1Tc/n+h1YGoanacw4a9goueOn8cGygHvncIi4G9ctnyQ3Q6q46eMR6E1x6OCxwDmcokze//NFSflU25E2Dcq2VWE2NStofUyjETIo0JBzxbuQpMmbMQDafLh2bYLirKDE0L6O3H5cr6bCZsPfatsDjR3YGi4uIE79IdWT9hEHTDlIE4Bs48Y/+fZqOJwGiIJwk3H5KI9exXsjFS0K/njW3RP/EeYAB6sBF3+H9HhR1nZo8BZvh6cGPy8iBjwuodlvmCuklXsZKnW25V0a8bEAMFSwxWF5rhKvU="
+  overwrite: true
+  skip_cleanup: true
+  file: "./build/blackbox-${TRAVIS_TAG##*@}.tar.gz"
+  on:
+    tags: true
+    all_branches: true
+    condition: "${TRAVIS_TAG%@*} = sdk"
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8e874c2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,81 @@
+# Apache OpenWhisk runtimes for nodejs
+[![Build Status](https://travis-ci.org/apache/incubator-openwhisk-runtime-docker.svg?branch=master)](https://travis-ci.org/apache/incubator-openwhisk-runtime-docker)
+
+
+### Give it a try today
+Create a zip action with a `exec` in the root of the zip
+```
+echo \
+'#!/bin/bash
+echo "{\"messag\":\"Hello World\"}"' > exec
+```
+```
+chmod +x exec
+zip myAction.zip exec
+```
+
+Create the action using the docker image for the runtime
+```
+wsk action update myAction myAction.zip --docker openwhisk/dockerskeleton:1.0.0
+```
+
+This works on any deployment of Apache OpenWhisk
+
+### To use on a deployment that contains the runtime deployed
+
+Create action using `--native`
+```
+wsk action update myAction myAction.zip --native
+```
+
+### Local development
+```
+./gradlew :core:actionProxy:distDocker :sdk:docker:distDocker
+```
+This will produce the image `whisk/dockerskeleton`
+
+Build and Push image
+```
+docker login
+./gradlew core:actionProxy:distDocker -PdockerImagePrefix=$prefix-user -PdockerRegistry=docker.io 
+```
+
+Deploy OpenWhisk using ansible environment that contains the runtime of type `blackboxes` with name `dockerskeleton`
+Assuming you have OpenWhisk already deploy localy and `OPENWHISK_HOME` pointing to root directory of OpenWhisk core repository.
+
+Set `ROOTDIR` to the root directory of this repository.
+
+Redeploy OpenWhisk
+```
+cd $OPENWHISK_HOME/ansible
+ANSIBLE_CMD="ansible-playbook -i ${ROOTDIR}/ansible/environments/local"
+$ANSIBLE_CMD setup.yml
+$ANSIBLE_CMD couchdb.yml
+$ANSIBLE_CMD initdb.yml
+$ANSIBLE_CMD wipe.yml
+$ANSIBLE_CMD openwhisk.yml
+```
+
+Or you can use `wskdev` and create a soft link to the target ansible environment, for example:
+```
+ln -s ${ROOTDIR}/ansible/environments/local ${OPENWHISK_HOME}/ansible/environments/local-docker
+wskdev fresh -t local-docker
+```
+
+To use as docker action push to your own dockerhub account
+```
+docker tag whisk/dockerskeleton $user_prefix/dockerskeleton
+docker push $user_prefix/dockerskeleton
+```
+Then create the action using your image from dockerhub
+```
+wsk action update myAction myAction.zip --docker $user_prefix/dockerskeleton
+```
+The `$user_prefix` is usually your dockerhub user id.
+
+
+
+# License
+[Apache 2.0](LICENSE.txt)
+
+
diff --git a/ansible/environments/local/group_vars/all b/ansible/environments/local/group_vars/all
new file mode 100755
index 0000000..3ba8955
--- /dev/null
+++ b/ansible/environments/local/group_vars/all
@@ -0,0 +1,38 @@
+whisk_version_name: local
+config_root_dir: /tmp
+whisk_logs_dir: /tmp/wsklogs
+docker_registry: ""
+docker_dns: ""
+
+db_prefix: whisk_local_
+
+# Auto lookup to find the db credentials
+db_provider: "{{ lookup('ini', 'db_provider section=db_creds file={{ playbook_dir }}/db_local.ini') }}"
+db_username: "{{ lookup('ini', 'db_username section=db_creds file={{ playbook_dir }}/db_local.ini') }}"
+db_password: "{{ lookup('ini', 'db_password section=db_creds file={{ playbook_dir }}/db_local.ini') }}"
+db_protocol: "{{ lookup('ini', 'db_protocol section=db_creds file={{ playbook_dir }}/db_local.ini') }}"
+db_host: "{{ lookup('ini', 'db_host section=db_creds file={{ playbook_dir }}/db_local.ini') }}"
+db_port: "{{ lookup('ini', 'db_port section=db_creds file={{ playbook_dir }}/db_local.ini') }}"
+
+# API GW connection configuration
+apigw_auth_user: ""
+apigw_auth_pwd: ""
+apigw_host_v2: "http://{{ groups['apigateway']|first }}:{{apigateway.port.api}}/v2"
+
+controller_arguments: '-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1098'
+invoker_arguments: "{{ controller_arguments }}"
+
+invoker_allow_multiple_instances: true
+
+runtimes_manifest:
+  defaultImagePrefix: "openwhisk"
+  defaultImageTag: "latest"
+  runtimes:
+    nodejs:
+    - kind: "nodejs:6"
+      default: true
+      image:
+        name: "nodejs6action"
+      deprecated: false
+  blackboxes:
+    - name: "dockerskeleton"
diff --git a/ansible/environments/local/hosts b/ansible/environments/local/hosts
new file mode 100644
index 0000000..c99f195
--- /dev/null
+++ b/ansible/environments/local/hosts
@@ -0,0 +1,26 @@
+; the first parameter in a host is the inventory_hostname
+
+; used for local actions only
+ansible ansible_connection=local
+
+[edge]
+172.17.0.1          ansible_host=172.17.0.1 ansible_connection=local
+
+[controllers]
+controller0         ansible_host=172.17.0.1 ansible_connection=local
+
+[kafka]
+172.17.0.1          ansible_host=172.17.0.1 ansible_connection=local
+
+[invokers]
+invoker0            ansible_host=172.17.0.1 ansible_connection=local
+
+; db group is only used if db_provider is CouchDB
+[db]
+172.17.0.1          ansible_host=172.17.0.1 ansible_connection=local
+
+[redis]
+172.17.0.1          ansible_host=172.17.0.1 ansible_connection=local
+
+[apigateway]
+172.17.0.1          ansible_host=172.17.0.1 ansible_connection=local
diff --git a/sdk/docker/build_tgz.sh b/sdk/docker/build_tgz.sh
new file mode 100755
index 0000000..57c6c9e
--- /dev/null
+++ b/sdk/docker/build_tgz.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+set -ex
+
+SCRIPTDIR=$(cd $(dirname "$0") && pwd)
+ROOTDIR="${SCRIPTDIR}/../.."
+BUILDOUTPUTDIR="${ROOTDIR}/build"
+BUILDOUTPUT=$1
+BUILDOUTPUT=${BUILDOUTPUT:="blackbox-0.1.0.tar.gz"}
+
+BUILDTMPDIR=`mktemp -d`
+mkdir -p ${BUILDTMPDIR}/dockerSkeleton
+
+cp -a \
+${SCRIPTDIR}/buildAndPush.sh \
+${SCRIPTDIR}/Dockerfile \
+${SCRIPTDIR}/example.c \
+${SCRIPTDIR}/README.md \
+${BUILDTMPDIR}/dockerSkeleton
+
+
+sed -i -e 's/FROM dockerskeleton/FROM openwhisk\/dockerskeleton/' ${BUILDTMPDIR}/dockerSkeleton/Dockerfile
+cat ${BUILDTMPDIR}/dockerSkeleton/Dockerfile
+chmod +x ${BUILDTMPDIR}/dockerSkeleton/buildAndPush.sh
+
+mkdir -p ${BUILDOUTPUTDIR}
+pushd ${BUILDTMPDIR}
+tar -czf ${BUILDOUTPUTDIR}/${BUILDOUTPUT} dockerSkeleton
+ls ${BUILDTMPDIR}/dockerSkeleton
+ls -lh ${BUILDOUTPUTDIR}/${BUILDOUTPUT}
+
diff --git a/settings.gradle b/settings.gradle
index 9a27b31..87ddbf3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,26 +1,20 @@
-include 'common:scala'
+def owPath = System.getenv("OPENWHISK_HOME") ?: '../open'
+def owDirectory = new File(owPath)
 
-include 'core:controller'
-include 'core:invoker'
-include 'core:nodejsActionBase'
-include 'core:nodejs6Action'
-include 'core:actionProxy'
-include 'core:pythonAction'
-include 'core:python2Action'
-include 'core:swift3Action'
-include 'core:swift3.1.1Action'
-include 'core:javaAction'
-include 'core:php7.1Action'
-
-include 'tools:cli'
-
-include 'sdk:docker'
+include 'common:scala'; project(':common:scala').projectDir = new File(owDirectory, 'common/scala')
+include 'core:controller'; project(':core:controller').projectDir = new File(owDirectory, 'core/controller')
+include 'core:invoker'; project(':core:invoker').projectDir = new File(owDirectory, 'core/invoker')
+include 'whisktests'; project(':whisktests').projectDir = new File(owDirectory, 'tests')
 
 include 'tests'
+
+include 'sdk:docker'
+include 'core:actionProxy'
+
 include 'tests:dat:blackbox:badaction'
 include 'tests:dat:blackbox:badproxy'
 
-rootProject.name = 'openwhisk'
+rootProject.name = 'runtime-docker'
 
 gradle.ext.scala = [
     version: '2.11.8',
diff --git a/tests/build.gradle b/tests/build.gradle
index 6fa5a66..d95b884 100644
--- a/tests/build.gradle
+++ b/tests/build.gradle
@@ -2,13 +2,13 @@
 apply plugin: 'eclipse'
 compileTestScala.options.encoding = 'UTF-8'
 
+evaluationDependsOn(':whisktests')
+
 repositories {
     mavenCentral()
 }
 
 tasks.withType(Test) {
-    systemProperties(System.getProperties())
-
     testLogging {
         events "passed", "skipped", "failed"
         showStandardStreams = true
@@ -17,63 +17,18 @@
     outputs.upToDateWhen { false } // force tests to run every time
 }
 
-task testLean(type: Test) {
-    exclude '**/*Swift*'
-    exclude '**/*Python*'
-    exclude '**/*Java*'
-    exclude '**/*ThrottleTests*'
-    exclude '**/MaxActionDurationTests*'
-    exclude '**/*ApiGwTests*'
-}
-
 // Add all images needed for local testing here
 test.dependsOn([
-    ':core:nodejs6Action:distDocker',
-    ':core:actionProxy:distDocker',
-    ':core:pythonAction:distDocker',
-    ':core:python2Action:distDocker',
-    ':core:javaAction:distDocker',
-    ':core:swift3Action:distDocker',
-    ':core:swift3.1.1Action:distDocker',
-    ':sdk:docker:distDocker',
     ':tests:dat:blackbox:badaction:distDocker',
     ':tests:dat:blackbox:badproxy:distDocker'
 ])
 
 dependencies {
     compile "org.scala-lang:scala-library:${gradle.scala.version}"
-    compile 'org.apache.commons:commons-lang3:3.3.2'
-    compile 'org.apache.httpcomponents:httpclient:4.5.2:tests'
-    compile 'org.apache.httpcomponents:httpmime:4.3.6'
-    compile 'junit:junit:4.11'
-    compile 'com.jayway.restassured:rest-assured:2.6.0'
-    compile 'org.scalatest:scalatest_2.11:3.0.1'
-    compile 'com.typesafe.akka:akka-testkit_2.11:2.5.4'
-    compile 'com.google.code.gson:gson:2.3.1'
-    compile 'org.scalamock:scalamock-scalatest-support_2.11:3.4.2'
-    compile 'com.typesafe.akka:akka-testkit_2.11:2.4.16'
-    compile 'com.typesafe.akka:akka-http-testkit_2.11:10.0.10'
-    compile 'com.github.java-json-tools:json-schema-validator:2.2.8';
-
-    compile project(':common:scala')
-    compile project(':core:controller')
-    compile project(':core:invoker')
+    compile project(':whisktests')
+    compile project(':whisktests').sourceSets.test.output
 }
 
 tasks.withType(ScalaCompile) {
     scalaCompileOptions.additionalParameters = gradle.scala.compileFlags
 }
-
-def keystorePath = new File(sourceSets.test.scala.outputDir, 'keystore')
-task deleteKeystore(type: Delete) {
-    delete keystorePath
-}
-task createKeystore(dependsOn: deleteKeystore) {
-    doLast {
-        Properties props = new Properties()
-        props.load(new FileInputStream(file('../whisk.properties')))
-        def cmd = ['keytool', '-import', '-alias', 'Whisk', '-noprompt', '-trustcacerts', '-file', file(props['whisk.ssl.cert']), '-keystore', keystorePath, '-storepass', 'openwhisk']
-        cmd.execute().waitForProcessOutput(System.out, System.err)
-    }
-}
-compileTestScala.finalizedBy createKeystore
diff --git a/tests/src/test/scala/actionContainers/ActionContainer.scala b/tests/src/test/scala/actionContainers/ActionContainer.scala
index 94f6763..56aa131 100644
--- a/tests/src/test/scala/actionContainers/ActionContainer.scala
+++ b/tests/src/test/scala/actionContainers/ActionContainer.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package actionContainers
+package runtime.actionContainers
 
 import java.io.ByteArrayOutputStream
 import java.io.File
diff --git a/tests/src/test/scala/actionContainers/ActionProxyContainerTests.scala b/tests/src/test/scala/actionContainers/ActionProxyContainerTests.scala
index 1ec8e9f..1471d12 100644
--- a/tests/src/test/scala/actionContainers/ActionProxyContainerTests.scala
+++ b/tests/src/test/scala/actionContainers/ActionProxyContainerTests.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package actionContainers
+package runtime.actionContainers
 
 import java.io.File
 import java.util.Base64
diff --git a/tests/src/test/scala/actionContainers/DockerExampleContainerTests.scala b/tests/src/test/scala/actionContainers/DockerExampleContainerTests.scala
index 5fd85d3..83949f3 100644
--- a/tests/src/test/scala/actionContainers/DockerExampleContainerTests.scala
+++ b/tests/src/test/scala/actionContainers/DockerExampleContainerTests.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package actionContainers
+package runtime.actionContainers
 
 import java.util.concurrent.TimeoutException
 
diff --git a/tests/src/test/scala/actionContainers/ResourceHelpers.scala b/tests/src/test/scala/actionContainers/ResourceHelpers.scala
index 3041e0e..08f46e4 100644
--- a/tests/src/test/scala/actionContainers/ResourceHelpers.scala
+++ b/tests/src/test/scala/actionContainers/ResourceHelpers.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package actionContainers
+package runtime.actionContainers
 
 import java.net.URI
 import java.net.URLClassLoader
diff --git a/tools/travis/build.sh b/tools/travis/build.sh
new file mode 100755
index 0000000..8e3331e
--- /dev/null
+++ b/tools/travis/build.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+set -ex
+
+# Build script for Travis-CI.
+
+SCRIPTDIR=$(cd $(dirname "$0") && pwd)
+ROOTDIR="$SCRIPTDIR/../.."
+WHISKDIR="$ROOTDIR/../openwhisk"
+
+export OPENWHISK_HOME=$WHISKDIR
+
+IMAGE_PREFIX="testing"
+
+# Build runtime
+cd $ROOTDIR
+TERM=dumb ./gradlew \
+:core:actionProxy:distDocker \
+:sdk:docker:distDocker \
+-PdockerImagePrefix=${IMAGE_PREFIX}
+
+
+# Build OpenWhisk
+cd $WHISKDIR
+
+#pull down images
+docker pull openwhisk/controller
+docker tag openwhisk/controller ${IMAGE_PREFIX}/controller
+docker pull openwhisk/invoker
+docker tag openwhisk/invoker ${IMAGE_PREFIX}/invoker
+docker pull openwhisk/nodejs6action
+docker tag openwhisk/nodejs6action ${IMAGE_PREFIX}/nodejs6action
+
+#Build CLI
+TERM=dumb ./gradlew \
+:tools:cli:distDocker \
+-PdockerImagePrefix=${IMAGE_PREFIX}
+
+
+
diff --git a/tools/travis/build_sdk.sh b/tools/travis/build_sdk.sh
new file mode 100755
index 0000000..e20716b
--- /dev/null
+++ b/tools/travis/build_sdk.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -ex
+
+# Build script for Travis-CI.
+
+SCRIPTDIR=$(cd $(dirname "$0") && pwd)
+ROOTDIR="$SCRIPTDIR/../.."
+
+#Build SDK TGZ
+${ROOTDIR}/sdk/docker/build_tgz.sh blackbox.tar.gz
diff --git a/tools/travis/deploy.sh b/tools/travis/deploy.sh
new file mode 100755
index 0000000..bf30063
--- /dev/null
+++ b/tools/travis/deploy.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+set -ex
+
+# Build script for Travis-CI.
+
+SCRIPTDIR=$(cd $(dirname "$0") && pwd)
+ROOTDIR="$SCRIPTDIR/../.."
+WHISKDIR="$ROOTDIR/../openwhisk"
+
+export OPENWHISK_HOME=$WHISKDIR
+
+IMAGE_PREFIX="testing"
+
+# Deploy OpenWhisk
+cd $WHISKDIR/ansible
+ANSIBLE_CMD="ansible-playbook -i ${ROOTDIR}/ansible/environments/local -e docker_image_prefix=${IMAGE_PREFIX}"
+$ANSIBLE_CMD setup.yml
+$ANSIBLE_CMD prereq.yml
+$ANSIBLE_CMD couchdb.yml
+$ANSIBLE_CMD initdb.yml
+$ANSIBLE_CMD wipe.yml
+$ANSIBLE_CMD openwhisk.yml
+
+docker images
+docker ps
+
+cat $WHISKDIR/whisk.properties
+curl -s -k https://172.17.0.1 | jq .
+curl -s -k https://172.17.0.1/api/v1 | jq .
+
+#Deployment
+WHISK_APIHOST="172.17.0.1"
+WHISK_AUTH=`cat ${WHISKDIR}/ansible/files/auth.guest`
+WHISK_CLI="${WHISKDIR}/bin/wsk -i"
+
+${WHISK_CLI} property set --apihost ${WHISK_APIHOST} --auth ${WHISK_AUTH} 
+${WHISK_CLI} property get
+
+
diff --git a/tools/travis/publish.sh b/tools/travis/publish.sh
new file mode 100755
index 0000000..d25bed7
--- /dev/null
+++ b/tools/travis/publish.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+set -eux
+
+# Build script for Travis-CI.
+
+SCRIPTDIR=$(cd $(dirname "$0") && pwd)
+ROOTDIR="$SCRIPTDIR/../.."
+WHISKDIR="$ROOTDIR/../openwhisk"
+
+export OPENWHISK_HOME=$WHISKDIR
+
+IMAGE_PREFIX=$1
+IMAGE_NAME=$2
+IMAGE_TAG=$3
+GRADLE_BUILD=":core:actionProxy:distDocker"
+
+if [ ${IMAGE_NAME} == "dockerskeleton" ]; then
+  if [[ ! -z ${DOCKER_USER} ]] && [[ ! -z ${DOCKER_PASSWORD} ]]; then
+    docker login -u "${DOCKER_USER}" -p "${DOCKER_PASSWORD}"
+  fi
+
+  if [[ ! -z ${GRADLE_BUILD} ]] && [[ ! -z ${IMAGE_PREFIX} ]] && [[ ! -z ${IMAGE_TAG} ]]; then
+    TERM=dumb ./gradlew \
+    ${GRADLE_BUILD} \
+    -PdockerRegistry=docker.io \
+    -PdockerImagePrefix=${IMAGE_PREFIX} \
+    -PdockerImageTag=${IMAGE_TAG}
+  fi
+fi
+
+
diff --git a/tools/travis/rename_sdk.sh b/tools/travis/rename_sdk.sh
new file mode 100755
index 0000000..7ae3479
--- /dev/null
+++ b/tools/travis/rename_sdk.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+set -ex
+
+# Build script for Travis-CI.
+
+SCRIPTDIR=$(cd $(dirname "$0") && pwd)
+ROOTDIR="$SCRIPTDIR/../.."
+BUILDOUTPUTDIR="${ROOTDIR}/build"
+
+BUILD_TYPE=$1
+BUILD_VERSION=$2
+
+if [ ${BUILD_TYPE} == "sdk" ]; then
+  find ${ROOTDIR}
+  ls ${BUILDOUTPUTDIR}/ 
+  mv ${BUILDOUTPUTDIR}/blackbox.tar.gz ${BUILDOUTPUTDIR}/blackbox-${BUILD_VERSION}.tar.gz
+fi
+
+
diff --git a/tools/travis/setup.sh b/tools/travis/setup.sh
new file mode 100755
index 0000000..adf859a
--- /dev/null
+++ b/tools/travis/setup.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+set -e
+
+# Build script for Travis-CI.
+
+SCRIPTDIR=$(cd $(dirname "$0") && pwd)
+ROOTDIR="$SCRIPTDIR/../.."
+HOMEDIR="$SCRIPTDIR/../../../"
+
+# OpenWhisk stuff
+cd $HOMEDIR
+git clone --depth=1 https://github.com/apache/incubator-openwhisk.git openwhisk
+cd openwhisk
+./tools/travis/setup.sh
+
diff --git a/tools/travis/test.sh b/tools/travis/test.sh
new file mode 100755
index 0000000..bdcc407
--- /dev/null
+++ b/tools/travis/test.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+set -ex
+
+# Build script for Travis-CI.
+
+SCRIPTDIR=$(cd $(dirname "$0") && pwd)
+ROOTDIR="$SCRIPTDIR/../.."
+WHISKDIR="$ROOTDIR/../openwhisk"
+
+export OPENWHISK_HOME=$WHISKDIR
+
+cd ${ROOTDIR}
+TERM=dumb ./gradlew :tests:checkScalafmtAll
+TERM=dumb ./gradlew :tests:test
+
+
+