diff --git a/knative-build/runtimes/java/core/java8/proxy/profiles/base/profile.properties b/knative-build/runtimes/java/core/java8/proxy/profiles/base/profile.properties
new file mode 100644
index 0000000..b7a7e77
--- /dev/null
+++ b/knative-build/runtimes/java/core/java8/proxy/profiles/base/profile.properties
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+
+compile.gson=com.google.code.gson:gson:2.6.2
diff --git a/knative-build/runtimes/java/core/java8/proxy/profiles/spring/profile.properties b/knative-build/runtimes/java/core/java8/proxy/profiles/spring/profile.properties
new file mode 100644
index 0000000..b7a7e77
--- /dev/null
+++ b/knative-build/runtimes/java/core/java8/proxy/profiles/spring/profile.properties
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+
+compile.gson=com.google.code.gson:gson:2.6.2
diff --git a/knative-build/runtimes/java/gradlew b/knative-build/runtimes/java/gradlew
index cccdd3d..d4ee78f 100755
--- a/knative-build/runtimes/java/gradlew
+++ b/knative-build/runtimes/java/gradlew
@@ -1,5 +1,21 @@
 #!/usr/bin/env sh
 
+#
+# Copyright 2015 the original author or authors.
+#
+# 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.
+#
+
 ##############################################################################
 ##
 ##  Gradle start up script for UN*X
@@ -28,7 +44,7 @@
 APP_BASE_NAME=`basename "$0"`
 
 # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8'
 
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
diff --git a/knative-build/runtimes/java/gradlew.bat b/knative-build/runtimes/java/gradlew.bat
deleted file mode 100644
index e95643d..0000000
--- a/knative-build/runtimes/java/gradlew.bat
+++ /dev/null
@@ -1,84 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/knative-build/runtimes/java/settings.gradle b/knative-build/runtimes/java/settings.gradle
index 464ae37..3f317f7 100644
--- a/knative-build/runtimes/java/settings.gradle
+++ b/knative-build/runtimes/java/settings.gradle
@@ -18,7 +18,7 @@
 include 'tests'
 
 include 'core:java8'
-include 'core:java8:proxy'
+//include 'core:java8:proxy'
 
 rootProject.name = 'runtime-java'
 
diff --git a/knative-build/runtimes/java/tests/build.gradle b/knative-build/runtimes/java/tests/build.gradle
deleted file mode 100644
index 1ae5a4b..0000000
--- a/knative-build/runtimes/java/tests/build.gradle
+++ /dev/null
@@ -1,44 +0,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.
- */
-
-apply plugin: 'scala'
-apply plugin: 'eclipse'
-compileTestScala.options.encoding = 'UTF-8'
-
-repositories {
-    mavenCentral()
-    mavenLocal()
-}
-
-tasks.withType(Test) {
-    testLogging {
-        events "passed", "skipped", "failed"
-        showStandardStreams = true
-        exceptionFormat = 'full'
-    }
-    outputs.upToDateWhen { false } // force tests to run every time
-}
-
-dependencies {
-    compile "org.scala-lang:scala-library:${gradle.scala.version}"
-    compile "org.apache.openwhisk:openwhisk-tests:${gradle.openwhisk.version}:tests"
-    compile "org.apache.openwhisk:openwhisk-tests:${gradle.openwhisk.version}:test-sources"
-}
-
-tasks.withType(ScalaCompile) {
-    scalaCompileOptions.additionalParameters = gradle.scala.compileFlags
-}
diff --git a/knative-build/runtimes/java/tests/src/test/resources/application.conf b/knative-build/runtimes/java/tests/src/test/resources/application.conf
deleted file mode 100644
index c448e38..0000000
--- a/knative-build/runtimes/java/tests/src/test/resources/application.conf
+++ /dev/null
@@ -1,22 +0,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.
-#
-
-whisk.spi {
-  SimpleSpi = whisk.spi.SimpleSpiImpl
-  MissingSpi = whisk.spi.MissingImpl
-  MissingModule = missing.module
-}
diff --git a/knative-build/runtimes/java/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala b/knative-build/runtimes/java/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
deleted file mode 100644
index a990f33..0000000
--- a/knative-build/runtimes/java/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
+++ /dev/null
@@ -1,417 +0,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.
- */
-
-package actionContainers
-
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-import common.WskActorSystem
-import spray.json.DefaultJsonProtocol._
-import spray.json._
-import actionContainers.ResourceHelpers.JarBuilder
-import actionContainers.ActionContainer.withContainer
-
-@RunWith(classOf[JUnitRunner])
-class JavaActionContainerTests extends BasicActionRunnerTests with WskActorSystem {
-
-  // Helpers specific to java actions
-  override def withActionContainer(env: Map[String, String] = Map.empty)(
-    code: ActionContainer => Unit): (String, String) = withContainer("java8action", env)(code)
-
-  behavior of "Java action"
-
-  override val testNoSourceOrExec = {
-    TestConfig("")
-  }
-
-  override val testNotReturningJson = {
-    // skip this test since and add own below (see Nuller)
-    TestConfig("", skipTest = true)
-  }
-
-  override val testEnv = {
-    TestConfig(
-      JarBuilder.mkBase64Jar(
-        Seq("example", "HelloWhisk.java") ->
-          """
-          | package example;
-          |
-          | import com.google.gson.JsonObject;
-          |
-          | public class HelloWhisk {
-          |     public static JsonObject main(JsonObject args) {
-          |         JsonObject response = new JsonObject();
-          |         response.addProperty("api_host", System.getenv("__OW_API_HOST"));
-          |         response.addProperty("api_key", System.getenv("__OW_API_KEY"));
-          |         response.addProperty("namespace", System.getenv("__OW_NAMESPACE"));
-          |         response.addProperty("action_name", System.getenv("__OW_ACTION_NAME"));
-          |         response.addProperty("activation_id", System.getenv("__OW_ACTIVATION_ID"));
-          |         response.addProperty("deadline", System.getenv("__OW_DEADLINE"));
-          |         return response;
-          |     }
-          | }
-        """.stripMargin.trim),
-      main = "example.HelloWhisk")
-  }
-
-  override val testEcho = {
-    TestConfig(
-      JarBuilder.mkBase64Jar(
-        Seq("example", "HelloWhisk.java") ->
-          """
-          | package example;
-          |
-          | import com.google.gson.JsonObject;
-          |
-          | public class HelloWhisk {
-          |     public static JsonObject main(JsonObject args) {
-          |         System.out.println("hello stdout");
-          |         System.err.println("hello stderr");
-          |         return args;
-          |     }
-          | }
-        """.stripMargin.trim),
-      "example.HelloWhisk")
-  }
-
-  override val testUnicode = {
-    TestConfig(
-      JarBuilder.mkBase64Jar(
-        Seq("example", "HelloWhisk.java") ->
-          """
-          | package example;
-          |
-          | import com.google.gson.JsonObject;
-          |
-          | public class HelloWhisk {
-          |     public static JsonObject main(JsonObject args) {
-          |         String delimiter = args.getAsJsonPrimitive("delimiter").getAsString();
-          |         JsonObject response = new JsonObject();
-          |          String str = delimiter + " ☃ " + delimiter;
-          |          System.out.println(str);
-          |          response.addProperty("winter", str);
-          |          return response;
-          |     }
-          | }
-        """.stripMargin),
-      "example.HelloWhisk")
-  }
-
-  def echo(main: String = "main") = {
-    JarBuilder.mkBase64Jar(
-      Seq("example", "HelloWhisk.java") ->
-        s"""
-        | package example;
-        |
-        | import com.google.gson.JsonObject;
-        |
-        | public class HelloWhisk {
-        |     public static JsonObject $main(JsonObject args) {
-        |         return args;
-        |     }
-        | }
-      """.stripMargin.trim)
-  }
-
-  override val testInitCannotBeCalledMoreThanOnce = {
-    TestConfig(echo(), "example.HelloWhisk")
-  }
-
-  override val testEntryPointOtherThanMain = {
-    TestConfig(echo("naim"), "example.HelloWhisk#naim")
-  }
-
-  override val testLargeInput = {
-    TestConfig(echo(), "example.HelloWhisk")
-  }
-
-  Seq("", "x", "!", "#", "#main", "#bogus").foreach { m =>
-    it should s"report an error if explicit 'main' is not found ($m)" in {
-      val (out, err) = withActionContainer() { c =>
-        val (initCode, out) = c.init(initPayload(echo("hello"), s"example.HelloWhisk$m"))
-        initCode shouldBe 502
-
-        out shouldBe {
-          val error = m match {
-            case c if c == "x" || c == "!" => s"java.lang.ClassNotFoundException: example.HelloWhisk$c"
-            case "#bogus"                  => "java.lang.NoSuchMethodException: example.HelloWhisk.bogus(com.google.gson.JsonObject)"
-            case _                         => "java.lang.NoSuchMethodException: example.HelloWhisk.main(com.google.gson.JsonObject)"
-          }
-          Some(JsObject("error" -> s"An error has occurred (see logs for details): $error".toJson))
-        }
-      }
-
-      checkStreams(out, err, {
-        case (o, e) =>
-          o shouldBe empty
-          e should not be empty
-      })
-    }
-  }
-
-  it should "fail to initialize with bad code" in {
-    val (out, err) = withActionContainer() { c =>
-      // This is valid zip file containing a single file, but not a valid
-      // jar file.
-      val brokenJar = ("UEsDBAoAAAAAAPxYbkhT4iFbCgAAAAoAAAANABwAbm90YWNsYXNzZmlsZVV" +
-        "UCQADzNPmVszT5lZ1eAsAAQT1AQAABAAAAABzYXVjaXNzb24KUEsBAh4DCg" +
-        "AAAAAA/FhuSFPiIVsKAAAACgAAAA0AGAAAAAAAAQAAAKSBAAAAAG5vdGFjb" +
-        "GFzc2ZpbGVVVAUAA8zT5lZ1eAsAAQT1AQAABAAAAABQSwUGAAAAAAEAAQBT" +
-        "AAAAUQAAAAAA")
-
-      val (initCode, _) = c.init(initPayload(brokenJar, "example.Broken"))
-      initCode should not be (200)
-    }
-
-    // Somewhere, the logs should contain an exception.
-    checkStreams(out, err, {
-      case (o, e) =>
-        (o + e).toLowerCase should include("exception")
-    })
-  }
-
-  it should "return some error on action error" in {
-    val (out, err) = withActionContainer() { c =>
-      val jar = JarBuilder.mkBase64Jar(
-        Seq("example", "HelloWhisk.java") ->
-          """
-            | package example;
-            |
-            | import com.google.gson.JsonObject;
-            |
-            | public class HelloWhisk {
-            |     public static JsonObject main(JsonObject args) throws Exception {
-            |         throw new Exception("noooooooo");
-            |     }
-            | }
-          """.stripMargin.trim)
-
-      val (initCode, _) = c.init(initPayload(jar, "example.HelloWhisk"))
-      initCode should be(200)
-
-      val (runCode, runRes) = c.run(runPayload(JsObject.empty))
-      runCode should not be (200)
-
-      runRes shouldBe defined
-      runRes.get.fields.get("error") shouldBe defined
-    }
-
-    checkStreams(out, err, {
-      case (o, e) =>
-        (o + e).toLowerCase should include("exception")
-    })
-  }
-
-  it should "support application errors" in {
-    val (out, err) = withActionContainer() { c =>
-      val jar = JarBuilder.mkBase64Jar(
-        Seq("example", "Error.java") ->
-          """
-            | package example;
-            |
-            | import com.google.gson.JsonObject;
-            |
-            | public class Error {
-            |     public static JsonObject main(JsonObject args) throws Exception {
-            |         JsonObject error = new JsonObject();
-            |         error.addProperty("error", "This action is unhappy.");
-            |         return error;
-            |     }
-            | }
-          """.stripMargin.trim)
-
-      val (initCode, _) = c.init(initPayload(jar, "example.Error"))
-      initCode should be(200)
-
-      val (runCode, runRes) = c.run(runPayload(JsObject.empty))
-      runCode should be(200) // action writer returning an error is OK
-
-      runRes shouldBe defined
-      runRes.get.fields.get("error") shouldBe defined
-    }
-
-    checkStreams(out, err, {
-      case (o, e) =>
-        o shouldBe empty
-        e shouldBe empty
-    })
-  }
-
-  it should "support main in default package" in {
-    val (out, err) = withActionContainer() { c =>
-      val jar = JarBuilder.mkBase64Jar(
-        Seq("", "HelloWhisk.java") ->
-          """
-            | import com.google.gson.JsonObject;
-            |
-            | public class HelloWhisk {
-            |     public static JsonObject main(JsonObject args) throws Exception {
-            |         return args;
-            |     }
-            | }
-          """.stripMargin.trim)
-
-      val (initCode, _) = c.init(initPayload(jar, "HelloWhisk"))
-      initCode should be(200)
-
-      val args = JsObject("a" -> "A".toJson)
-      val (runCode, runRes) = c.run(runPayload(args))
-      runCode should be(200)
-      runRes shouldBe Some(args)
-    }
-
-    checkStreams(out, err, {
-      case (o, e) =>
-        o shouldBe empty
-        e shouldBe empty
-    })
-  }
-
-  it should "survive System.exit" in {
-    val (out, err) = withActionContainer() { c =>
-      val jar = JarBuilder.mkBase64Jar(
-        Seq("example", "Quitter.java") ->
-          """
-            | package example;
-            |
-            | import com.google.gson.*;
-            |
-            | public class Quitter {
-            |     public static JsonObject main(JsonObject main) {
-            |         System.exit(1);
-            |         return new JsonObject();
-            |     }
-            | }
-          """.stripMargin.trim)
-
-      val (initCode, _) = c.init(initPayload(jar, "example.Quitter"))
-      initCode should be(200)
-
-      val (runCode, runRes) = c.run(runPayload(JsObject.empty))
-      runCode should not be (200)
-
-      runRes shouldBe defined
-      runRes.get.fields.get("error") shouldBe defined
-    }
-
-    checkStreams(out, err, {
-      case (o, e) =>
-        (o + e).toLowerCase should include("system.exit")
-    })
-  }
-
-  it should "enforce that the user returns an object" in {
-    val (out, err) = withActionContainer() { c =>
-      val jar = JarBuilder.mkBase64Jar(
-        Seq("example", "Nuller.java") ->
-          """
-            | package example;
-            |
-            | import com.google.gson.*;
-            |
-            | public class Nuller {
-            |     public static JsonObject main(JsonObject args) {
-            |         return null;
-            |     }
-            | }
-          """.stripMargin.trim)
-
-      val (initCode, _) = c.init(initPayload(jar, "example.Nuller"))
-      initCode should be(200)
-
-      val (runCode, runRes) = c.run(runPayload(JsObject.empty))
-      runCode should not be (200)
-
-      runRes shouldBe defined
-      runRes.get.fields.get("error") shouldBe defined
-    }
-
-    checkStreams(out, err, {
-      case (o, e) =>
-        (o + e).toLowerCase should include("the action returned null")
-    })
-  }
-
-  val dynamicLoadingJar = JarBuilder.mkBase64Jar(
-    Seq(
-      Seq("example", "EntryPoint.java") ->
-        """
-          | package example;
-          |
-          | import com.google.gson.*;
-          | import java.lang.reflect.*;
-          |
-          | public class EntryPoint {
-          |     private final static String CLASS_NAME = "example.DynamicClass";
-          |     public static JsonObject main(JsonObject args) throws Exception {
-          |         String cl = args.getAsJsonPrimitive("classLoader").getAsString();
-          |
-          |         Class d = null;
-          |         if("local".equals(cl)) {
-          |             d = Class.forName(CLASS_NAME);
-          |         } else if("thread".equals(cl)) {
-          |             d = Thread.currentThread().getContextClassLoader().loadClass(CLASS_NAME);
-          |         }
-          |
-          |         Object o = d.newInstance();
-          |         Method m = o.getClass().getMethod("getMessage");
-          |         String msg = (String)m.invoke(o);
-          |
-          |         JsonObject response = new JsonObject();
-          |         response.addProperty("message", msg);
-          |         return response;
-          |     }
-          | }
-        """.stripMargin.trim,
-      Seq("example", "DynamicClass.java") ->
-        """
-          | package example;
-          |
-          | public class DynamicClass {
-          |     public String getMessage() {
-          |         return "dynamic!";
-          |     }
-          | }
-        """.stripMargin.trim))
-
-  def classLoaderTest(param: String) = {
-    val (out, err) = withActionContainer() { c =>
-      val (initCode, _) = c.init(initPayload(dynamicLoadingJar, "example.EntryPoint"))
-      initCode should be(200)
-
-      val (runCode, runRes) = c.run(runPayload(JsObject("classLoader" -> JsString(param))))
-      runCode should be(200)
-
-      runRes shouldBe defined
-      runRes.get.fields.get("message") shouldBe Some(JsString("dynamic!"))
-    }
-
-    checkStreams(out, err, {
-      case (o, e) =>
-        o shouldBe empty
-        e shouldBe empty
-    })
-  }
-
-  it should "support loading classes from the current classloader" in {
-    classLoaderTest("local")
-  }
-
-  it should "support loading classes from the Thread classloader" in {
-    classLoaderTest("thread")
-  }
-}
