diff --git a/build.gradle b/build.gradle
index ce47acb..b697be3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -318,6 +318,7 @@
         repository(url: stagingUrl, configureAuth)
         snapshotRepository(url: 'https://oss.sonatype.org/content/repositories/snapshots/', configureAuth)
     }
+    uploadArchives.onlyIf { !name.contains("grpc-gae-interop-testing") }
 
     [
       install.repositories.mavenInstaller,
diff --git a/gae-interop-testing/README.md b/gae-interop-testing/README.md
new file mode 100644
index 0000000..1f9bea3
--- /dev/null
+++ b/gae-interop-testing/README.md
@@ -0,0 +1,49 @@
+Google App Engine interop tests
+=====================================
+
+This directory contains interop tests that runs in Google App Engine
+as gRPC clients.
+
+Prerequisites
+==========================
+
+- Install the Google Cloud SDK and ensure that `gcloud` is in the path
+- Set up an [App Engine app](http://appengine.google.com) with your
+  choice of a PROJECT_ID.
+- Associate your `gcloud` environment with your app:
+  ```bash
+  # Log into Google Cloud
+  $ gcloud auth login
+
+  # Associate this codebase with a GAE project
+  $ gcloud config set project PROJECT_ID
+  ```
+
+Running the tests in GAE
+==========================
+
+You can run the gradle task to execute the interop tests.
+```bash
+# cd into either gae-jdk7 or gae-jdk8
+$ ./gradlew runInteropTestRemote
+
+# Or run one of these from the root gRPC Java directory:
+$ ./gradlew :grpc-gae-interop-testing-jdk7:runInteropTestRemote
+$ ./gradlew :grpc-gae-interop-testing-jdk8:runInteropTestRemote
+```
+
+Optional:
+
+You can also browse to `http://${PROJECT_ID}.appspot.google.com` to
+see the result of the interop test.
+
+
+Debugging
+==========================
+
+You can find the server side logs by logging into
+`http://appengine.google.com` and scrolling down to the section titled
+`Application Errors` and `Server Errors`.
+
+Click on the `/` URI to view the log entries for each test run.
+
diff --git a/gae-interop-testing/gae-jdk7/build.gradle b/gae-interop-testing/gae-jdk7/build.gradle
new file mode 100644
index 0000000..6d66246
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/build.gradle
@@ -0,0 +1,100 @@
+// Copyright 2017, gRPC Authors All rights reserved.
+//
+//  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.
+description = 'gRPC: gae interop testing (jdk7)'
+
+buildscript {    // Configuration for building
+  repositories {
+    jcenter()    // Bintray's repository - a fast Maven Central mirror & more
+    mavenCentral()
+  }
+  dependencies {
+    classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.3'
+    classpath 'com.squareup.okhttp:okhttp:2.5.0'
+  }
+}
+
+repositories {   // repositories for Jar's you access in your code
+  mavenLocal()
+  maven {
+    url 'https://maven-central.storage.googleapis.com'             // Google's mirror of Maven Central
+  }
+  jcenter()
+  mavenCentral()
+}
+
+apply plugin: 'java'                              // standard Java tasks
+apply plugin: 'war'                               // standard Web Archive plugin
+apply plugin: 'com.google.cloud.tools.appengine'  // App Engine tasks
+
+dependencies {
+  providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5'
+  compile 'com.google.appengine:appengine:+'
+  // Deps needed by all gRPC apps in GAE
+  compile libraries.google_api_protos
+  compile project(":grpc-okhttp")
+  compile project(":grpc-protobuf")
+  compile project(":grpc-stub")
+  compile (project(":grpc-interop-testing")) {
+    // We want the gRPC and service definitions but NOT grpc-netty for jdk7
+     exclude module: ":grpc-netty"
+  }
+}
+
+// [START model]
+appengine {  // App Engine tasks configuration
+  run {      // local (dev_appserver) configuration (standard environments only)
+    port = 8080                 // default
+  }
+
+  deploy {   // deploy configuration
+    stopPreviousVersion = true  // default - stop the current version
+    promote = true              // default - & make this the current version
+  }
+}
+// [END model]
+
+group = 'io.grpc'   // Generated output GroupId
+version = '1.0-SNAPSHOT'          // Version in generated output
+
+sourceCompatibility = 1.7
+targetCompatibility = 1.7
+
+def getAppName() {
+  def stream = new ByteArrayOutputStream()
+  exec {
+    executable 'gcloud'
+    args = ['config', 'get-value', 'project']
+    standardOutput = stream
+  }
+  return stream.toString().trim()
+}
+
+task runInteropTestRemote(dependsOn: 'appengineDeploy') {
+  doLast {
+    // give remote app some time to settle down
+    sleep(5000)
+
+    def appName = getAppName()
+    def client = new com.squareup.okhttp.OkHttpClient()
+    // The test suite can take a while to run
+    client.setReadTimeout(3, java.util.concurrent.TimeUnit.MINUTES)
+    // The '?jdk7' argument is ignored by the server, it exists only to tag the request log entry
+    def request = new com.squareup.okhttp.Request.Builder()
+            .url("http://${appName}.appspot.com/?jdk7").build()
+    def result = client.newCall(request).execute()
+    if (result.code() != 200) {
+      throw new GradleException("Interop test failed: " + result.body().string())
+    }
+  }
+}
diff --git a/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.jar b/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..736fb7d
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.properties b/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..52dd1f0
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip
diff --git a/gae-interop-testing/gae-jdk7/gradlew b/gae-interop-testing/gae-jdk7/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+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=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gae-interop-testing/gae-jdk7/gradlew.bat b/gae-interop-testing/gae-jdk7/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/gradlew.bat
@@ -0,0 +1,84 @@
+@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/gae-interop-testing/gae-jdk7/settings.gradle b/gae-interop-testing/gae-jdk7/settings.gradle
new file mode 100644
index 0000000..44b5ed8
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * This settings file was generated by the Gradle 'init' task.
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * In a single project build this file can be empty or even removed.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user guide at https://docs.gradle.org/4.2/userguide/multi_project_builds.html
+ */
+
+/*
+// To declare projects as part of a multi-project build use the 'include' method
+include 'shared'
+include 'api'
+include 'services:webservice'
+*/
+
+rootProject.name = 'gae-jdk7'
diff --git a/gae-interop-testing/gae-jdk7/src/main/java/io/grpc/testing/integration/OkHttpClientInteropServlet.java b/gae-interop-testing/gae-jdk7/src/main/java/io/grpc/testing/integration/OkHttpClientInteropServlet.java
new file mode 100644
index 0000000..0e9437f
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/src/main/java/io/grpc/testing/integration/OkHttpClientInteropServlet.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2017, gRPC Authors All rights reserved.
+ *
+ * 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.
+ */
+
+package io.grpc.testing.integration;
+
+import static junit.framework.TestCase.assertTrue;
+
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import io.grpc.okhttp.OkHttpChannelBuilder;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.internal.AssumptionViolatedException;
+
+/**
+ * This servlet communicates with {@code grpc-test.sandbox.googleapis.com}, which is a server
+ * managed by the gRPC team. For more information, see
+ * <a href="https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md">
+ *   Interoperability Test Case Descriptions</a>.
+ */
+@SuppressWarnings("serial")
+public final class OkHttpClientInteropServlet extends HttpServlet {
+  private static final String INTEROP_TEST_ADDRESS = "grpc-test.sandbox.googleapis.com:443";
+
+  @Override
+  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+    resp.setContentType("text/plain");
+    PrintWriter writer = resp.getWriter();
+    writer.println("Test invoked at: ");
+    writer.println(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss Z")
+        .format(Calendar.getInstance().getTime()));
+
+    // We can not use JUnit because it tries to spawn backgrounds threads.
+    // GAE+JDK7 does not allow arbitrary background threads.
+    // Let's use reflection to run test methods.
+    Tester tester = new Tester();
+    List<Method> befores = new ArrayList<>();
+    List<Method> afters = new ArrayList<>();
+    List<Method> testMethods = new ArrayList<>();
+    int ignored = 0;
+    for (Method method : tester.getClass().getMethods()) {
+      if (method.getAnnotation(Test.class) != null) {
+        if (method.getAnnotation(Ignore.class) != null) {
+          ignored++;
+        } else {
+          testMethods.add(method);
+        }
+      } else if (method.getAnnotation(Before.class) != null) {
+        befores.add(method);
+      } else if (method.getAnnotation(After.class) != null) {
+        afters.add(method);
+      }
+    }
+
+    StringBuilder sb = new StringBuilder();
+    int failures = 0;
+    for (Method method : testMethods) {
+      try {
+        for (Method before : befores) {
+          before.invoke(tester);
+        }
+        method.invoke(tester);
+        for (Method after : afters) {
+          after.invoke(tester);
+        }
+      } catch (Exception e) {
+        // The default JUnit4 test runner skips tests with failed assumptions.
+        // We will do the same here.
+        boolean assumptionViolated = false;
+        for (Throwable iter = e; iter != null; iter = iter.getCause()) {
+          if (iter instanceof AssumptionViolatedException) {
+            assumptionViolated = true;
+            break;
+          }
+        }
+        if (assumptionViolated) {
+          continue;
+        }
+
+        sb.append("================\n");
+        sb.append("Test method: ").append(method).append("\n");
+        failures++;
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter printWriter = new PrintWriter(stringWriter);
+        e.printStackTrace(printWriter);
+        sb.append(stringWriter);
+      }
+    }
+    if (failures == 0) {
+      resp.setStatus(200);
+      writer.println(
+          String.format(
+              "PASS! Tests ran %d, tests ignored %d",
+              testMethods.size(),
+              ignored));
+    } else {
+      resp.setStatus(500);
+      writer.println(
+          String.format(
+              "FAILED! Tests ran %d, tests failed %d, tests ignored %d",
+              testMethods.size(),
+              failures,
+              ignored));
+    }
+    writer.println(sb);
+  }
+
+  public static final class Tester extends AbstractInteropTest {
+    @Override
+    protected ManagedChannel createChannel() {
+      ManagedChannelBuilder<?> builder =
+          ManagedChannelBuilder.forTarget(INTEROP_TEST_ADDRESS)
+              .maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE);
+      assertTrue(builder instanceof OkHttpChannelBuilder);
+      return builder.build();
+    }
+
+    @Override
+    protected boolean metricsExpected() {
+      // Server-side metrics won't be found because the server is running remotely.
+      return false;
+    }
+
+    // grpc-test.sandbox.googleapis.com does not support these tests
+    @Override
+    public void customMetadata() { }
+
+    @Override
+    public void statusCodeAndMessage() { }
+
+    @Override
+    public void exchangeMetadataUnaryCall() { }
+
+    @Override
+    public void exchangeMetadataStreamingCall() { }
+  }
+}
diff --git a/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/appengine-web.xml b/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/appengine-web.xml
new file mode 100644
index 0000000..f874981
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/appengine-web.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2017, gRPC Authors All rights reserved.
+  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.
+-->
+<!-- [START config] -->
+<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
+  <application>YOUR-PROJECT-ID</application>
+  <version>YOUR-VERSION-ID</version>
+  <threadsafe>true</threadsafe>
+  <runtime>java7</runtime>
+</appengine-web-app>
+<!-- [END config] -->
diff --git a/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/web.xml b/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..35d6f83
--- /dev/null
+++ b/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
+  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+  version="2.5">
+  <servlet>
+    <servlet-name>interoptest</servlet-name>
+    <servlet-class>io.grpc.testing.integration.OkHttpClientInteropServlet</servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>interoptest</servlet-name>
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
+</web-app>
diff --git a/gae-interop-testing/gae-jdk8/build.gradle b/gae-interop-testing/gae-jdk8/build.gradle
new file mode 100644
index 0000000..449e13c
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/build.gradle
@@ -0,0 +1,108 @@
+// Copyright 2017, gRPC Authors All rights reserved.
+//
+//  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.
+description = 'gRPC: gae interop testing (jdk8)'
+
+buildscript {    // Configuration for building
+  repositories {
+    jcenter()    // Bintray's repository - a fast Maven Central mirror & more
+    mavenCentral()
+  }
+  dependencies {
+    classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.3'
+    classpath 'com.squareup.okhttp:okhttp:2.5.0'
+  }
+}
+
+repositories {   // repositories for Jar's you access in your code
+  mavenLocal()
+  maven {
+    url 'https://maven-central.storage.googleapis.com'             // Google's mirror of Maven Central
+  }
+  jcenter()
+  mavenCentral()
+}
+
+apply plugin: 'java'                              // standard Java tasks
+apply plugin: 'war'                               // standard Web Archive plugin
+apply plugin: 'com.google.cloud.tools.appengine'  // App Engine tasks
+
+dependencies {
+  providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5'
+  compile 'com.google.appengine:appengine:+'
+  // Deps needed by all gRPC apps in GAE
+  compile libraries.google_api_protos
+  compile project(":grpc-okhttp")
+  compile project(":grpc-protobuf")
+  compile project(":grpc-stub")
+  compile (project(":grpc-interop-testing"))
+  compile libraries.netty_tcnative
+}
+
+// [START model]
+appengine {  // App Engine tasks configuration
+  run {      // local (dev_appserver) configuration (standard environments only)
+    port = 8080                 // default
+  }
+
+  deploy {   // deploy configuration
+    stopPreviousVersion = true  // default - stop the current version
+    promote = true              // default - & make this the current version
+  }
+}
+// [END model]
+
+group = 'io.grpc'   // Generated output GroupId
+version = '1.0-SNAPSHOT'          // Version in generated output
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+def getAppName() {
+  def stream = new ByteArrayOutputStream()
+  exec {
+    executable 'gcloud'
+    args = ['config', 'get-value', 'project']
+    standardOutput = stream
+  }
+  return stream.toString().trim()
+}
+
+task runInteropTestRemote(dependsOn: 'appengineDeploy') {
+  doLast {
+    // give remote app some time to settle down
+    sleep(5000)
+
+    def appName = getAppName()
+    def client = new com.squareup.okhttp.OkHttpClient()
+    // The '?jdk8' argument is ignored by the server, it exists only to tag the request log entry
+    client.setReadTimeout(30, java.util.concurrent.TimeUnit.SECONDS)
+    def request = new com.squareup.okhttp.Request.Builder()
+            .url("http://${appName}.appspot.com/long_lived_channel?jdk8").build()
+    def result1 = client.newCall(request).execute()
+    def result2 = client.newCall(request).execute()
+    if (result1.code() != 200 || result2.code() != 200) {
+      throw new GradleException("Unable to reuse same channel across requests")
+    }
+
+    // The test suite can take a while to run
+    client.setReadTimeout(3, java.util.concurrent.TimeUnit.MINUTES)
+    // The '?jdk8' argument is ignored by the server, it exists only to tag the request log entry
+    def interopRequest = new com.squareup.okhttp.Request.Builder()
+            .url("http://${appName}.appspot.com/?jdk8").build()
+    def result = client.newCall(interopRequest).execute()
+    if (result.code() != 200) {
+      throw new GradleException("Interop test failed: " + result.body().string())
+    }
+  }
+}
diff --git a/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.jar b/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..736fb7d
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.properties b/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..52dd1f0
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip
diff --git a/gae-interop-testing/gae-jdk8/gradlew b/gae-interop-testing/gae-jdk8/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+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=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gae-interop-testing/gae-jdk8/gradlew.bat b/gae-interop-testing/gae-jdk8/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/gradlew.bat
@@ -0,0 +1,84 @@
+@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/gae-interop-testing/gae-jdk8/settings.gradle b/gae-interop-testing/gae-jdk8/settings.gradle
new file mode 100644
index 0000000..149fb9a
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * This settings file was generated by the Gradle 'init' task.
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * In a single project build this file can be empty or even removed.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user guide at https://docs.gradle.org/4.2/userguide/multi_project_builds.html
+ */
+
+/*
+// To declare projects as part of a multi-project build use the 'include' method
+include 'shared'
+include 'api'
+include 'services:webservice'
+*/
+
+rootProject.name = 'gae-jdk8'
diff --git a/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/LongLivedChannel.java b/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/LongLivedChannel.java
new file mode 100644
index 0000000..b4e37fd
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/LongLivedChannel.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2017, gRPC Authors All rights reserved.
+ *
+ * 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.
+ */
+
+package io.grpc.testing.integration;
+
+import com.google.protobuf.ByteString;
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import io.grpc.testing.integration.Messages.Payload;
+import io.grpc.testing.integration.Messages.SimpleRequest;
+import io.grpc.testing.integration.Messages.SimpleResponse;
+import java.io.IOException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A test class that checks we can reuse a channel across requests.
+ *
+ * <p>This servlet communicates with {@code grpc-test.sandbox.googleapis.com}, which is a server
+ * managed by the gRPC team. For more information, see
+ * <a href="https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md">
+ *   Interoperability Test Case Descriptions</a>.
+ */
+@SuppressWarnings("serial")
+public final class LongLivedChannel extends HttpServlet {
+  private static final String INTEROP_TEST_ADDRESS = "grpc-test.sandbox.googleapis.com:443";
+  private final ManagedChannel channel =
+      ManagedChannelBuilder.forTarget(INTEROP_TEST_ADDRESS).build();
+
+  @Override
+  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+    int requestSize = 1234;
+    int responseSize = 5678;
+    SimpleRequest request = SimpleRequest.newBuilder()
+        .setResponseSize(responseSize)
+        .setResponseType(Messages.PayloadType.COMPRESSABLE)
+        .setPayload(Payload.newBuilder()
+            .setBody(ByteString.copyFrom(new byte[requestSize])))
+        .build();
+    TestServiceGrpc.TestServiceBlockingStub blockingStub =
+            TestServiceGrpc.newBlockingStub(channel);
+    SimpleResponse simpleResponse = blockingStub.unaryCall(request);
+    resp.setContentType("text/plain");
+    if (simpleResponse.getPayload().getBody().size() == responseSize) {
+      resp.setStatus(200);
+      resp.getWriter().println("PASS!");
+    } else {
+      resp.setStatus(500);
+      resp.getWriter().println("FAILED!");
+    }
+  }
+}
diff --git a/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/NettyClientInteropServlet.java b/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/NettyClientInteropServlet.java
new file mode 100644
index 0000000..3b9ff46
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/NettyClientInteropServlet.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2017, gRPC Authors All rights reserved.
+ *
+ * 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.
+ */
+
+package io.grpc.testing.integration;
+
+import static junit.framework.TestCase.assertTrue;
+
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import io.grpc.netty.NettyChannelBuilder;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+
+/**
+ * This servlet communicates with {@code grpc-test.sandbox.googleapis.com}, which is a server
+ * managed by the gRPC team. For more information, see
+ * <a href="https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md">
+ *   Interoperability Test Case Descriptions</a>.
+ */
+@SuppressWarnings("serial")
+public final class NettyClientInteropServlet extends HttpServlet {
+  private static final String INTEROP_TEST_ADDRESS = "grpc-test.sandbox.googleapis.com:443";
+
+  @Override
+  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+    resp.setContentType("text/plain");
+    PrintWriter writer = resp.getWriter();
+    writer.println("Test invoked at: ");
+    writer.println(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss Z")
+        .format(Calendar.getInstance().getTime()));
+
+    Result result = new JUnitCore().run(Tester.class);
+    if (result.wasSuccessful()) {
+      resp.setStatus(200);
+      writer.println(
+          String.format(
+              "PASS! Tests ran %d, tests ignored %d",
+              result.getRunCount(),
+              result.getIgnoreCount()));
+    } else {
+      resp.setStatus(500);
+      writer.println(
+          String.format(
+              "FAILED! Tests ran %d, tests failed %d, tests ignored %d",
+              result.getRunCount(),
+              result.getFailureCount(),
+              result.getIgnoreCount()));
+      for (Failure failure : result.getFailures()) {
+        writer.println("================================");
+        writer.println(failure.getTestHeader());
+        Throwable thrown = failure.getException();
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter printWriter = new PrintWriter(stringWriter);
+        thrown.printStackTrace(printWriter);
+        writer.println(stringWriter);
+      }
+    }
+  }
+
+  public static final class Tester extends AbstractInteropTest {
+    @Override
+    protected ManagedChannel createChannel() {
+      ManagedChannelBuilder<?> builder =
+          ManagedChannelBuilder.forTarget(INTEROP_TEST_ADDRESS)
+              .maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE);
+
+      assertTrue(builder instanceof NettyChannelBuilder);
+      ((NettyChannelBuilder) builder).flowControlWindow(65 * 1024);
+      return builder.build();
+    }
+
+    @Override
+    protected boolean metricsExpected() {
+      // Server-side metrics won't be found because the server is running remotely.
+      return false;
+    }
+
+    // grpc-test.sandbox.googleapis.com does not support these tests
+    @Override
+    public void customMetadata() { }
+
+    @Override
+    public void statusCodeAndMessage() { }
+
+    @Override
+    public void exchangeMetadataUnaryCall() { }
+
+    @Override
+    public void exchangeMetadataStreamingCall() { }
+  }
+}
diff --git a/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/appengine-web.xml b/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/appengine-web.xml
new file mode 100644
index 0000000..70e05f5
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/appengine-web.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2017, gRPC Authors All rights reserved.
+  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.
+-->
+<!-- [START config] -->
+<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
+  <application>YOUR-PROJECT-ID</application>
+  <version>YOUR-VERSION-ID</version>
+  <threadsafe>true</threadsafe>
+  <runtime>java8</runtime>
+</appengine-web-app>
+<!-- [END config] -->
diff --git a/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/web.xml b/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..2d825eb
--- /dev/null
+++ b/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
+  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+  version="2.5">
+  <servlet>
+    <servlet-name>interoptest</servlet-name>
+    <servlet-class>io.grpc.testing.integration.NettyClientInteropServlet</servlet-class>
+  </servlet>
+  <servlet>
+    <servlet-name>longlivedchannel</servlet-name>
+    <servlet-class>io.grpc.testing.integration.LongLivedChannel</servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>interoptest</servlet-name>
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>longlivedchannel</servlet-name>
+    <url-pattern>/long_lived_channel</url-pattern>
+  </servlet-mapping>
+</web-app>
diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
index c9f1621..b66abd3 100644
--- a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
+++ b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
@@ -974,7 +974,7 @@
 
   @Test
   public void sendsTimeoutHeader() {
-    Assume.assumeTrue("can not capture server side request headers", server != null);
+    Assume.assumeTrue("can not capture request headers on server side", server != null);
     long configuredTimeoutMinutes = 100;
     TestServiceGrpc.TestServiceBlockingStub stub =
         blockingStub.withDeadlineAfter(configuredTimeoutMinutes, TimeUnit.MINUTES);
diff --git a/settings.gradle b/settings.gradle
index dbe8ab7..780e8c6 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -12,6 +12,8 @@
 include ":grpc-testing"
 include ":grpc-testing-proto"
 include ":grpc-interop-testing"
+include ":grpc-gae-interop-testing-jdk7"
+include ":grpc-gae-interop-testing-jdk8"
 include ":grpc-all"
 include ":grpc-benchmarks"
 include ":grpc-services"
@@ -29,6 +31,8 @@
 project(':grpc-testing').projectDir = "$rootDir/testing" as File
 project(':grpc-testing-proto').projectDir = "$rootDir/testing-proto" as File
 project(':grpc-interop-testing').projectDir = "$rootDir/interop-testing" as File
+project(':grpc-gae-interop-testing-jdk7').projectDir = "$rootDir/gae-interop-testing/gae-jdk7" as File
+project(':grpc-gae-interop-testing-jdk8').projectDir = "$rootDir/gae-interop-testing/gae-jdk8" as File
 project(':grpc-all').projectDir = "$rootDir/all" as File
 project(':grpc-benchmarks').projectDir = "$rootDir/benchmarks" as File
 project(':grpc-services').projectDir = "$rootDir/services" as File
