diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..d48d4968abf817ab2138e4c78cfb9fc0f64ad37e
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,201 @@
+def google_cloud_bigdataoss_version = "1.4.5"
+def bigtable_version = "1.0.0-pre3"
+def google_clients_version = "1.22.0"
+def google_auth_version = "0.7.1"
+def grpc_version = "1.2.0"
+def protobuf_version = "3.2.0"
+def guava_version = "20.0"
+def netty_version = "4.1.8.Final"
+def grpc_google_common_protos = "0.1.9"
+def hamcrest_version = "1.3"
+def hadoop_version = "2.7.3"
+def jackson_version = "2.8.9"
+def spark_version = "1.6.3"
+def pubsub_grpc_version = "0.1.18"
+
+ext.library = [
+  java: [
+    activemq_amqp: "org.apache.activemq:activemq-amqp:5.13.1",
+    activemq_broker: "org.apache.activemq:activemq-broker:5.13.1",
+    activemq_client: "org.apache.activemq:activemq-client:5.13.1",
+    activemq_jaas: "org.apache.activemq:activemq-jaas:5.13.1",
+    activemq_junit: "org.apache.activemq.tooling:activemq-junit:5.13.1",
+    activemq_kahadb_store: "org.apache.activemq:activemq-kahadb-store:5.13.1",
+    activemq_mqtt: "org.apache.activemq:activemq-mqtt:5.13.1",
+    apex_common: "org.apache.apex:apex-common:3.6.0",
+    apex_engine: "org.apache.apex:apex-engine:3.4.0",
+    args4j: "args4j:args4j:2.33",
+    avro: "org.apache.avro:avro:1.8.2",
+    bigdataoss_gcsio: "com.google.cloud.bigdataoss:gcsio:$google_cloud_bigdataoss_version",
+    bigdataoss_util: "com.google.cloud.bigdataoss:util:$google_cloud_bigdataoss_version",
+    bigtable_client_core: "com.google.cloud.bigtable:bigtable-client-core:$bigtable_version",
+    bigtable_protos: "com.google.cloud.bigtable:bigtable-protos:$bigtable_version",
+    byte_buddy: "net.bytebuddy:byte-buddy:1.6.8",
+    commons_compress: "org.apache.commons:commons-compress:1.14",
+    commons_csv: "org.apache.commons:commons-csv:1.4",
+    commons_io_1x: "commons-io:commons-io:1.3.2",
+    commons_io_2x: "commons-io:commons-io:2.5",
+    commons_lang3: "org.apache.commons:commons-lang3:3.6",
+    commons_text: "org.apache.commons:commons-text:1.1",
+    datastore_v1_proto_client: "com.google.cloud.datastore:datastore-v1-proto-client:1.4.0",
+    datastore_v1_protos: "com.google.cloud.datastore:datastore-v1-protos:1.3.0",
+    error_prone_annotations: "com.google.errorprone:error_prone_annotations:2.0.15",
+    findbugs_jsr305: "com.google.code.findbugs:jsr305:3.0.1",
+    gax_grpc: "com.google.api:gax-grpc:0.20.0",
+    google_api_client: "com.google.api-client:google-api-client:$google_clients_version",
+    google_api_client_jackson2: "com.google.api-client:google-api-client-jackson2:$google_clients_version",
+    google_api_client_java6: "com.google.api-client:google-api-client-java6:$google_clients_version",
+    google_api_common: "com.google.api:api-common:1.0.0-rc2",
+    google_api_services_bigquery: "com.google.apis:google-api-services-bigquery:v2-rev355-$google_clients_version",
+    google_api_services_clouddebugger: "com.google.apis:google-api-services-clouddebugger:v2-rev8-$google_clients_version",
+    google_api_services_cloudresourcemanager: "com.google.apis:google-api-services-cloudresourcemanager:v1-rev6-$google_clients_version",
+    google_api_services_dataflow: "com.google.apis:google-api-services-dataflow:v1b3-rev214-$google_clients_version",
+    google_api_services_pubsub: "com.google.apis:google-api-services-pubsub:v1-rev10-$google_clients_version",
+    google_api_services_storage: "com.google.apis:google-api-services-storage:v1-rev71-$google_clients_version",
+    google_auth_library_credentials: "com.google.auth:google-auth-library-credentials:$google_auth_version",
+    google_auth_library_oauth2_http: "com.google.auth:google-auth-library-oauth2-http:$google_auth_version",
+    google_cloud_core: "com.google.cloud:google-cloud-core:1.0.2",
+    google_cloud_core_grpc: "com.google.cloud:google-cloud-core-grpc:$grpc_version",
+    google_cloud_dataflow_java_proto_library_all: "com.google.cloud.dataflow:google-cloud-dataflow-java-proto-library-all:0.5.160304",
+    google_cloud_spanner: "com.google.cloud:google-cloud-spanner:0.20.0-beta",
+    google_http_client: "com.google.http-client:google-http-client:$google_clients_version",
+    google_http_client_jackson: "com.google.http-client:google-http-client-jackson:$google_clients_version",
+    google_http_client_jackson2: "com.google.http-client:google-http-client-jackson2:$google_clients_version",
+    google_http_client_protobuf: "com.google.http-client:google-http-client-protobuf:$google_clients_version",
+    google_oauth_client: "com.google.oauth-client:google-oauth-client:$google_clients_version",
+    google_oauth_client_java6: "com.google.oauth-client:google-oauth-client-java6:$google_clients_version",
+    grpc_all: "io.grpc:grpc-all:$grpc_version",
+    grpc_auth: "io.grpc:grpc-auth:$grpc_version",
+    grpc_core: "io.grpc:grpc-core:$grpc_version",
+    grpc_google_cloud_pubsub_v1: "com.google.api.grpc:grpc-google-cloud-pubsub-v1:$pubsub_grpc_version",
+    grpc_protobuf: "io.grpc:grpc-protobuf:$grpc_version",
+    grpc_protobuf_lite: "io.grpc:grpc-protobuf-lite:$grpc_version",
+    grpc_netty: "io.grpc:grpc-netty:$grpc_version",
+    grpc_stub: "io.grpc:grpc-stub:$grpc_version",
+    guava: "com.google.guava:guava:$guava_version",
+    guava_testlib: "com.google.guava:guava-testlib:$guava_version",
+    hadoop_client: "org.apache.hadoop:hadoop-client:$hadoop_version",
+    hadoop_common: "org.apache.hadoop:hadoop-common:$hadoop_version",
+    hadoop_mapreduce_client_core: "org.apache.hadoop:hadoop-mapreduce-client-core:$hadoop_version",
+    hadoop_minicluster: "org.apache.hadoop:hadoop-minicluster:$hadoop_version",
+    hadoop_hdfs: "org.apache.hadoop:hadoop-hdfs:$hadoop_version",
+    hadoop_hdfs_tests: "org.apache.hadoop:hadoop-hdfs:$hadoop_version:tests",
+    hamcrest_all: "org.hamcrest:hamcrest-all:$hamcrest_version",
+    hamcrest_core: "org.hamcrest:hamcrest-core:$hamcrest_version",
+    jackson_annotations: "com.fasterxml.jackson.core:jackson-annotations:$jackson_version",
+    jackson_core: "com.fasterxml.jackson.core:jackson-core:$jackson_version",
+    jackson_databind: "com.fasterxml.jackson.core:jackson-databind:$jackson_version",
+    jackson_dataformat_yaml: "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:$jackson_version",
+    jackson_module_scala: "com.fasterxml.jackson.module:jackson-module-scala_2.10:$jackson_version",
+    joda_time: "joda-time:joda-time:2.4",
+    junit: "junit:junit:4.12",
+    kafka_clients: "org.apache.kafka:kafka-clients:0.10.1.0",
+    malhar_library: "org.apache.apex:malhar-library:3.4.0",
+    mockito_all: "org.mockito:mockito-all:1.9.5",
+    netty_handler: "io.netty:netty-handler:$netty_version",
+    netty_tcnative_boringssl_static: "io.netty:netty-tcnative-boringssl-static:1.1.33.Fork26",
+    netty_transport_native_epoll: "io.netty:netty-transport-native-epoll:$netty_version",
+    protobuf_java: "com.google.protobuf:protobuf-java:$protobuf_version",
+    protobuf_java_util: "com.google.protobuf:protobuf-java-util:$protobuf_version",
+    proto_google_cloud_pubsub_v1: "com.google.api.grpc:proto-google-cloud-pubsub-v1:$pubsub_grpc_version",
+    proto_google_cloud_spanner_admin_database_v1: "com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:$grpc_google_common_protos",
+    proto_google_common_protos: "com.google.api.grpc:proto-google-common-protos:$grpc_google_common_protos",
+    slf4j_api: "org.slf4j:slf4j-api:1.7.25",
+    slf4j_jdk14: "org.slf4j:slf4j-jdk14:1.7.25",
+    slf4j_log4j12: "org.slf4j:slf4j-log4j12:1.7.25",
+    snappy_java: "org.xerial.snappy:snappy-java:1.1.4",
+    spark_core: "org.apache.spark:spark-core_2.10:$spark_version",
+    spark_network_common: "org.apache.spark:spark-network-common_2.10:$spark_version",
+    spark_streaming: "org.apache.spark:spark-streaming_2.10:$spark_version",
+    stax2_api: "org.codehaus.woodstox:stax2-api:3.1.4",
+    woodstox_core_asl: "org.codehaus.woodstox:woodstox-core-asl:4.4.1",
+  ],
+]
+
+gradle.taskGraph.whenReady { taskGraph ->
+  version = "2.3.0-snapshot"
+}
+
+allprojects  {
+  apply plugin: "maven"
+
+  group = "org.apache.beam"
+  version = "2.3.0-SNAPSHOT"
+}
+
+buildscript {
+  repositories {
+    mavenCentral()
+    maven {
+      url "https://plugins.gradle.org/m2/"
+    }
+  }
+  dependencies {
+    classpath "net.ltgt.gradle:gradle-apt-plugin:0.12"
+    classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.1"
+  }
+}
+
+subprojects {
+  apply plugin: "java"
+  sourceCompatibility = 1.7
+  targetCompatibility = 1.7
+  tasks.withType(JavaCompile) {
+  	options.encoding = "UTF-8"
+  }
+  repositories {
+    mavenLocal()
+    mavenCentral()
+    
+    maven { url "https://oss.sonatype.org/content/repositories/staging/" }
+    maven { url "https://repository.apache.org/snapshots" }
+    maven { url "https://repository.apache.org/content/repositories/releases" }
+  }
+
+  apply plugin: "net.ltgt.apt"
+  def auto_value = "com.google.auto.value:auto-value:1.4.1"
+  def auto_service = "com.google.auto.service:auto-service:1.0-rc2"
+  dependencies {
+    compileOnly auto_value
+    apt auto_value
+    testCompileOnly auto_value
+    testApt auto_value
+
+    compileOnly auto_service
+    apt auto_service
+    testCompileOnly auto_service
+    testApt auto_service
+  }
+
+
+  apply plugin: "com.google.protobuf"
+  protobuf {
+    protoc {
+      // The artifact spec for the Protobuf Compiler
+      artifact = "com.google.protobuf:protoc:3.2.0"
+    }
+
+    // Configure the codegen plugins
+    plugins {
+      // An artifact spec for a protoc plugin, with "grpc" as
+      // the identifier, which can be referred to in the "plugins"
+      // container of the "generateProtoTasks" closure.
+      grpc {
+        artifact = "io.grpc:protoc-gen-grpc-java:1.2.0"
+      }
+    }
+
+    generateProtoTasks {
+      ofSourceSet("main")*.plugins {
+        // Apply the "grpc" plugin whose spec is defined above, without
+        // options.  Note the braces cannot be omitted, otherwise the
+        // plugin will not be added. This is because of the implicit way
+        // NamedDomainObjectContainer binds the methods.
+        grpc { }
+      }
+    }
+  }
+
+  configurations.all {
+  }
+}
diff --git a/examples/java/build.gradle b/examples/java/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..9df8c4af9cac572cab1967b9f50af252f0716ac2
--- /dev/null
+++ b/examples/java/build.gradle
@@ -0,0 +1,34 @@
+description = "Apache Beam :: Examples :: Java"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-google-cloud-platform")
+  compile library.java.google_api_client
+  compile library.java.google_api_services_bigquery
+  compile library.java.findbugs_jsr305
+  compile library.java.google_http_client
+  compile library.java.bigdataoss_util
+  compile library.java.google_auth_library_oauth2_http
+  compile library.java.google_auth_library_credentials
+  compile library.java.avro
+  compile library.java.google_api_services_pubsub
+  compile library.java.guava
+  compile library.java.datastore_v1_proto_client
+  compile library.java.datastore_v1_protos
+  compile library.java.joda_time
+  compile library.java.slf4j_api
+  runtime project(":beam-runners-parent:beam-runners-direct-java")
+  runtime library.java.slf4j_jdk14
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-google-cloud-platform").sourceSets.test.output
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/examples/java8/build.gradle b/examples/java8/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..523312351f98371c5061a659bf109df34c9868eb
--- /dev/null
+++ b/examples/java8/build.gradle
@@ -0,0 +1,32 @@
+description = "Apache Beam :: Examples :: Java 8"
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-google-cloud-platform")
+  compile project(":beam-examples-parent:beam-examples-java")
+  compile library.java.guava
+  compile library.java.slf4j_api
+  compile library.java.avro
+  compile library.java.joda_time
+  compile library.java.google_api_services_bigquery
+  compile library.java.google_http_client
+  compile library.java.google_oauth_client
+  compile library.java.google_api_services_pubsub
+  compile library.java.google_api_client
+  runtime project(":beam-runners-parent:beam-runners-direct-java")
+  runtime library.java.slf4j_jdk14
+  testCompile library.java.hamcrest_all
+  testCompile library.java.mockito_all
+  testCompile library.java.junit
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..ed88a042a287c140a32e1639edfc91b2a233da8c
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000000000000000000000000000000000..74bb77845e0be3bde9aca603aedfa16c669ded8b
--- /dev/null
+++ b/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.1-bin.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000000000000000000000000000000000000..cccdd3d517fc5249beaefa600691cf150f2fa3e6
--- /dev/null
+++ b/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/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000000000000000000000000000000000000..f9553162f122c71b34635112e717c3e733b5b212
--- /dev/null
+++ b/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/model/fn-execution/build.gradle b/model/fn-execution/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..7c0afdce308a4466c644ff43d130e49bb5331f9d
--- /dev/null
+++ b/model/fn-execution/build.gradle
@@ -0,0 +1,17 @@
+description = "Apache Beam :: Model :: Fn Execution"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile library.java.protobuf_java
+  compile library.java.guava
+  compile library.java.grpc_core
+  compile library.java.grpc_protobuf
+  compile library.java.grpc_stub
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/model/job-management/build.gradle b/model/job-management/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..f033e5a48a09bd1c63675d6f34f384bb79c206d0
--- /dev/null
+++ b/model/job-management/build.gradle
@@ -0,0 +1,17 @@
+description = "Apache Beam :: Model :: Job Management"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile library.java.protobuf_java
+  compile library.java.guava
+  compile library.java.grpc_core
+  compile library.java.grpc_protobuf
+  compile library.java.grpc_stub
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/model/pipeline/build.gradle b/model/pipeline/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..4ce2c8db89e1466c24253bb80f94139e45403a97
--- /dev/null
+++ b/model/pipeline/build.gradle
@@ -0,0 +1,12 @@
+description = "Apache Beam :: Model :: Pipeline"
+
+dependencies {
+  compile library.java.protobuf_java
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/apex/build.gradle b/runners/apex/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..8d1c7db23a93b1d40189080fb85f2bf67fe80ed1
--- /dev/null
+++ b/runners/apex/build.gradle
@@ -0,0 +1,28 @@
+description = "Apache Beam :: Runners :: Apex"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-runners-parent:beam-runners-core-construction-java")
+  compile project(":beam-runners-parent:beam-runners-core-java")
+  compile library.java.apex_common
+  compile library.java.malhar_library
+  compile library.java.apex_engine
+  compile library.java.commons_lang3
+  compile library.java.findbugs_jsr305
+  runtime library.java.apex_engine
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-model-parent:beam-model-fn-execution").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-core-java").sourceSets.test.output
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+  testCompile library.java.jackson_dataformat_yaml
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/core-construction-java/build.gradle b/runners/core-construction-java/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..feaa7e82a8a26aa28da7530f9ac0acd3c50b5bf6
--- /dev/null
+++ b/runners/core-construction-java/build.gradle
@@ -0,0 +1,28 @@
+description = "Apache Beam :: Runners :: Core Construction Java"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile project(":beam-model-parent:beam-model-job-management")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.jackson_annotations
+  compile library.java.jackson_databind
+  compile library.java.jackson_core
+  compile library.java.protobuf_java
+  compile library.java.protobuf_java_util
+  compile library.java.findbugs_jsr305
+  compile library.java.joda_time
+  compile library.java.guava
+  compile library.java.slf4j_api
+  compile library.java.grpc_core
+  compile library.java.grpc_stub
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/core-java/build.gradle b/runners/core-java/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..f394fd4347db5ae7a40e28a54f319b737c8f2876
--- /dev/null
+++ b/runners/core-java/build.gradle
@@ -0,0 +1,27 @@
+description = "Apache Beam :: Runners :: Core Java"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-model-parent:beam-model-fn-execution")
+  compile project(":beam-runners-parent:beam-runners-core-construction-java")
+  compile library.java.findbugs_jsr305
+  compile library.java.guava
+  compile library.java.grpc_core
+  compile library.java.grpc_stub
+  compile library.java.joda_time
+  compile library.java.slf4j_api
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile library.java.hamcrest_all
+  testCompile library.java.mockito_all
+  testCompile library.java.junit
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.jackson_dataformat_yaml
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/direct-java/build.gradle b/runners/direct-java/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..4c8de6657af457202e79ae2ed30c7ef2e2423131
--- /dev/null
+++ b/runners/direct-java/build.gradle
@@ -0,0 +1,31 @@
+description = "Apache Beam :: Runners :: Direct Java"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-runners-parent:beam-runners-core-construction-java")
+  compile project(":beam-runners-parent:beam-runners-core-java")
+  compile library.java.guava
+  compile library.java.joda_time
+  compile library.java.findbugs_jsr305
+  compile library.java.slf4j_api
+  compileOnly library.java.hamcrest_all
+  compileOnly library.java.junit
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-core-java").sourceSets.test.output
+  testCompile project(":beam-model-parent:beam-model-fn-execution").sourceSets.test.output
+  testCompile library.java.guava_testlib
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.mockito_all
+  testCompile library.java.stax2_api
+  testCompile library.java.woodstox_core_asl
+  testCompile library.java.google_cloud_dataflow_java_proto_library_all
+  testCompile library.java.jackson_dataformat_yaml
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/flink/build.gradle b/runners/flink/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..1ac0e39e1d60f61310504f57109803ba565b863e
--- /dev/null
+++ b/runners/flink/build.gradle
@@ -0,0 +1,41 @@
+description = "Apache Beam :: Runners :: Flink"
+
+def flink_version = "1.3.0"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-runners-parent:beam-runners-core-java")
+  compile project(":beam-runners-parent:beam-runners-core-construction-java")
+  compile library.java.jackson_annotations
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile library.java.slf4j_api
+  compile library.java.joda_time
+  compile library.java.commons_compress
+  compile "org.apache.flink:flink-clients_2.10:$flink_version"
+  compile "org.apache.flink:flink-core:$flink_version"
+  compile "org.apache.flink:flink-metrics-core:$flink_version"
+  compile "org.apache.flink:flink-java:$flink_version"
+  compile "org.apache.flink:flink-runtime_2.10:$flink_version"
+  compile "org.apache.flink:flink-streaming-java_2.10:$flink_version"
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-model-parent:beam-model-fn-execution").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-core-java").sourceSets.test.output
+  testCompile library.java.commons_lang3
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+  testCompile library.java.google_api_services_bigquery
+  testCompile library.java.jackson_dataformat_yaml
+  testCompile "org.apache.flink:flink-core:$flink_version:tests"
+  testCompile "org.apache.flink:flink-runtime_2.10:$flink_version:tests"
+  testCompile "org.apache.flink:flink-streaming-java_2.10:$flink_version:tests"
+  testCompile "org.apache.flink:flink-test-utils_2.10:$flink_version"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/gearpump/build.gradle b/runners/gearpump/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..1d941b7735501ede10b02e1b87bb9ea8b17de068
--- /dev/null
+++ b/runners/gearpump/build.gradle
@@ -0,0 +1,33 @@
+description = "Apache Beam :: Runners :: Gearpump"
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+def gearpump_version = "0.8.4"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-runners-parent:beam-runners-core-java")
+  compile project(":beam-runners-parent:beam-runners-core-construction-java")
+  compile "org.apache.gearpump:gearpump-core_2.11:$gearpump_version"
+  compile "org.apache.gearpump:gearpump-streaming_2.11:$gearpump_version"
+  compile library.java.joda_time
+  compile library.java.jackson_annotations
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compileOnly "com.typesafe:config:1.3.0"
+  compileOnly "org.scala-lang:scala-library:2.11.8"
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_all
+  testCompile library.java.jackson_databind
+  testCompile library.java.jackson_dataformat_yaml
+  testCompile library.java.mockito_all
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/google-cloud-dataflow-java/build.gradle b/runners/google-cloud-dataflow-java/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..b59cf1e0d7572b96f27ac6cc58462bef3bf10009
--- /dev/null
+++ b/runners/google-cloud-dataflow-java/build.gradle
@@ -0,0 +1,45 @@
+description = "Apache Beam :: Runners :: Google Cloud Dataflow"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-google-cloud-platform")
+  compile project(":beam-runners-parent:beam-runners-core-construction-java")
+  compile library.java.google_api_client
+  compile library.java.google_http_client
+  compile library.java.google_http_client_jackson2
+  compile library.java.google_api_services_dataflow
+  compile library.java.google_api_services_clouddebugger
+  compile library.java.google_api_services_storage
+  compile library.java.google_auth_library_credentials
+  compile library.java.google_auth_library_oauth2_http
+  compile library.java.bigdataoss_util
+  compile library.java.guava
+  compile library.java.avro
+  compile library.java.joda_time
+  compile library.java.findbugs_jsr305
+  compile library.java.jackson_core
+  compile library.java.jackson_annotations
+  compile library.java.jackson_databind
+  compile library.java.slf4j_api
+  compileOnly library.java.hamcrest_all
+  compileOnly library.java.junit
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-google-cloud-platform").sourceSets.test.output
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core").sourceSets.test.output
+  testCompile project(":beam-model-parent:beam-model-fn-execution").sourceSets.test.output
+  testCompile library.java.guava_testlib
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.mockito_all
+  testCompile library.java.google_cloud_dataflow_java_proto_library_all
+  testCompile library.java.datastore_v1_protos
+  testCompile library.java.jackson_dataformat_yaml
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/local-artifact-service-java/build.gradle b/runners/local-artifact-service-java/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..c3e596ffd6a8304c30a06c0501873c72f4108150
--- /dev/null
+++ b/runners/local-artifact-service-java/build.gradle
@@ -0,0 +1,22 @@
+description = "Apache Beam :: Runners :: Java Local Artifact Service"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-job-management")
+  compile library.java.findbugs_jsr305
+  compile library.java.guava
+  compile library.java.grpc_core
+  compile library.java.grpc_stub
+  compile library.java.protobuf_java
+  compile library.java.slf4j_api
+  testCompile library.java.hamcrest_all
+  testCompile library.java.mockito_all
+  testCompile library.java.junit
+  testCompile library.java.slf4j_jdk14
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/reference/job-server/build.gradle b/runners/reference/job-server/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..a4bb6d95b7afac3783b43b9e4963e39ae0c68de3
--- /dev/null
+++ b/runners/reference/job-server/build.gradle
@@ -0,0 +1,18 @@
+description = "Apache Beam :: Runners :: Reference :: Job Orchestrator"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-job-management")
+  compile library.java.grpc_core
+  compile library.java.grpc_stub
+  compile library.java.slf4j_api
+  compile library.java.args4j
+  runtime library.java.grpc_netty
+  testCompile library.java.junit
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/runners/spark/build.gradle b/runners/spark/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..e9ea403b576367b84217b6bfd2ab00975967230b
--- /dev/null
+++ b/runners/spark/build.gradle
@@ -0,0 +1,56 @@
+description = "Apache Beam :: Runners :: Spark"
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-runners-parent:beam-runners-core-construction-java")
+  compile project(":beam-runners-parent:beam-runners-core-java")
+  compile library.java.findbugs_jsr305
+  compile library.java.guava
+  compile library.java.jackson_annotations
+  compile library.java.slf4j_api
+  compile library.java.joda_time
+  compile library.java.commons_text
+  compile "io.dropwizard.metrics:metrics-core:3.1.2"
+  compileOnly library.java.spark_core
+  compileOnly library.java.spark_streaming
+  compileOnly library.java.spark_network_common
+  compileOnly library.java.hadoop_common
+  compileOnly library.java.hadoop_mapreduce_client_core
+  compileOnly library.java.commons_compress
+  compileOnly library.java.commons_lang3
+  compileOnly library.java.commons_io_2x
+  compileOnly library.java.hamcrest_all
+  compileOnly "org.apache.zookeeper:zookeeper:3.4.6"
+  compileOnly "org.scala-lang:scala-library:2.10.5"
+  compileOnly "com.esotericsoftware.kryo:kryo:2.21"
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-kafka")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-model-parent:beam-model-fn-execution").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-core-java").sourceSets.test.output
+  testCompile library.java.avro
+  testCompile library.java.kafka_clients
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+  testCompile library.java.jackson_dataformat_yaml
+  testCompile "org.apache.kafka:kafka_2.10:0.9.0.1"
+  testCompileOnly library.java.spark_core
+  testCompileOnly library.java.spark_streaming
+  testCompileOnly library.java.spark_network_common
+  testCompileOnly library.java.hadoop_common
+  testCompileOnly library.java.hadoop_mapreduce_client_core
+  testCompileOnly library.java.commons_compress
+  testCompileOnly library.java.commons_lang3
+  testCompileOnly library.java.commons_io_2x
+  testCompileOnly library.java.hamcrest_all
+  testCompileOnly "org.apache.zookeeper:zookeeper:3.4.6"
+  testCompileOnly "org.scala-lang:scala-library:2.10.5"
+  testCompileOnly "com.esotericsoftware.kryo:kryo:2.21"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/build-tools/build.gradle b/sdks/java/build-tools/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..daf801e9c7051a4239028c9f8a13d308d5b90805
--- /dev/null
+++ b/sdks/java/build-tools/build.gradle
@@ -0,0 +1,8 @@
+description = "Apache Beam :: SDKs :: Java :: Build Tools"
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/core/build.gradle b/sdks/java/core/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..1e7ecf5d9b6f14da4d3bce27493291eb97f8f15c
--- /dev/null
+++ b/sdks/java/core/build.gradle
@@ -0,0 +1,47 @@
+description = "Apache Beam :: SDKs :: Java :: Core"
+
+buildscript {
+  repositories {
+    jcenter()
+  }
+  dependencies {
+    classpath "com.commercehub.gradle.plugin:gradle-avro-plugin:0.11.0"
+  }
+}
+apply plugin: "com.commercehub.gradle.plugin.avro"
+repositories {
+  jcenter()
+}
+
+dependencies {
+  compile library.java.guava
+  compile library.java.protobuf_java
+  compile library.java.findbugs_jsr305
+  compile "com.github.stephenc.findbugs:findbugs-annotations:1.3.9-1"
+  compile library.java.jackson_core
+  compile library.java.jackson_annotations
+  compile library.java.jackson_databind
+  compile library.java.slf4j_api
+  compile library.java.byte_buddy
+  compile library.java.avro
+  compile library.java.snappy_java
+  compile library.java.commons_compress
+  compile library.java.commons_lang3
+  compile library.java.joda_time
+  compile library.java.hamcrest_all
+  compile library.java.junit
+  runtime "org.tukaani:xz:1.5"
+  testCompile project(":beam-model-parent:beam-model-fn-execution")
+  testCompile library.java.guava_testlib
+  testCompile library.java.jackson_dataformat_yaml
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.mockito_all
+  testCompile "com.esotericsoftware.kryo:kryo:2.21"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/extensions/google-cloud-platform-core/build.gradle b/sdks/java/extensions/google-cloud-platform-core/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..3887d82e0bd6cfea6b094a30899272e7d847440c
--- /dev/null
+++ b/sdks/java/extensions/google-cloud-platform-core/build.gradle
@@ -0,0 +1,33 @@
+description = "Apache Beam :: SDKs :: Java :: Extensions :: Google Cloud Platform Core"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.google_http_client_jackson2
+  compile library.java.google_auth_library_oauth2_http
+  compile library.java.google_api_client
+  compile library.java.bigdataoss_gcsio
+  compile library.java.bigdataoss_util
+  compile library.java.google_api_services_cloudresourcemanager
+  compile library.java.google_api_services_storage
+  compile library.java.google_auth_library_credentials
+  compile library.java.findbugs_jsr305
+  compile library.java.google_http_client
+  compile library.java.guava
+  compile library.java.slf4j_api
+  compile library.java.joda_time
+  compile library.java.jackson_annotations
+  compile library.java.jackson_databind
+  compileOnly library.java.hamcrest_all
+  compileOnly library.java.junit
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile library.java.guava_testlib
+  testCompile library.java.mockito_all
+  testCompile library.java.slf4j_jdk14
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/extensions/jackson/build.gradle b/sdks/java/extensions/jackson/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..16ea6752590d012c3327eca30d78ec4281d2f6fe
--- /dev/null
+++ b/sdks/java/extensions/jackson/build.gradle
@@ -0,0 +1,17 @@
+description = "Apache Beam :: SDKs :: Java :: Extensions :: Jackson"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.jackson_databind
+  compile library.java.guava
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/extensions/join-library/build.gradle b/sdks/java/extensions/join-library/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..a3c6614fe8fafa50b61e8f12863ebfed228fa8b4
--- /dev/null
+++ b/sdks/java/extensions/join-library/build.gradle
@@ -0,0 +1,16 @@
+description = "Apache Beam :: SDKs :: Java :: Extensions :: Join library"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.guava
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/extensions/protobuf/build.gradle b/sdks/java/extensions/protobuf/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..d41dd92d5f0a9cf0793e16e5fa630a8e1d2f0626
--- /dev/null
+++ b/sdks/java/extensions/protobuf/build.gradle
@@ -0,0 +1,19 @@
+description = "Apache Beam :: SDKs :: Java :: Extensions :: Protobuf"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.protobuf_java
+  compile library.java.guava
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  testCompile library.java.hamcrest_all
+  testCompile library.java.mockito_all
+  testCompile library.java.junit
+  testCompile library.java.slf4j_jdk14
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/extensions/sorter/build.gradle b/sdks/java/extensions/sorter/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..7234748b92739b5fa280cf273c5d1b82f3eee3b5
--- /dev/null
+++ b/sdks/java/extensions/sorter/build.gradle
@@ -0,0 +1,19 @@
+description = "Apache Beam :: SDKs :: Java :: Extensions :: Sorter"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.guava
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.hamcrest_all
+  testCompile library.java.mockito_all
+  testCompile library.java.junit
+  compileOnly library.java.hadoop_mapreduce_client_core
+  compileOnly library.java.hadoop_common
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/extensions/sql/build.gradle b/sdks/java/extensions/sql/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..faa302eb3ae77c18ea2836a971be84649b788da6
--- /dev/null
+++ b/sdks/java/extensions/sql/build.gradle
@@ -0,0 +1,30 @@
+description = "Apache Beam :: SDKs :: Java :: Extensions :: SQL"
+
+def calcite_version = "1.13.0"
+def avatica_version = "1.10.0"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-join-library")
+  compile "org.apache.calcite:calcite-core:$calcite_version"
+  compile "org.apache.calcite:calcite-linq4j:$calcite_version"
+  compile "org.apache.calcite.avatica:avatica-core:$avatica_version"
+  compile library.java.guava
+  compile library.java.slf4j_api
+  compile library.java.commons_csv
+  compile library.java.joda_time
+//  providedCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-kafka")
+  compileOnly project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-kafka")
+  compileOnly library.java.kafka_clients
+  runtime project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_all
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/harness/build.gradle b/sdks/java/harness/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..85f1c15511ff726b1c31f92909d75785fc8281d5
--- /dev/null
+++ b/sdks/java/harness/build.gradle
@@ -0,0 +1,36 @@
+description = "Apache Beam :: SDKs :: Java :: Harness"
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+dependencies {
+  compile project(":beam-model-parent:beam-model-pipeline")
+  compile project(":beam-model-parent:beam-model-fn-execution")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core")
+  compile project(":beam-runners-parent:beam-runners-core-java")
+  compile project(":beam-runners-parent:beam-runners-core-construction-java")
+  compile library.java.jackson_databind
+  compile library.java.findbugs_jsr305
+  compile library.java.guava
+  compile library.java.protobuf_java
+  compile library.java.grpc_core
+  compile library.java.grpc_netty
+  compile library.java.grpc_stub
+  compile library.java.netty_transport_native_epoll
+  compile library.java.joda_time
+  compile library.java.slf4j_api
+  compileOnly library.java.error_prone_annotations
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+  testCompile library.java.slf4j_jdk14
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/amqp/build.gradle b/sdks/java/io/amqp/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..cb952487f6a8852c785b5ed5a3108c73486eb7cc
--- /dev/null
+++ b/sdks/java/io/amqp/build.gradle
@@ -0,0 +1,24 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: AMQP"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.joda_time
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile "org.apache.qpid:proton-j:0.13.1"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.slf4j_api
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_all
+  testCompile library.java.activemq_broker
+  testCompile library.java.activemq_amqp
+  testCompile library.java.activemq_junit
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/cassandra/build.gradle b/sdks/java/io/cassandra/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..2907e8a25a6d09c7f6e2bd843d371a537d6db9af
--- /dev/null
+++ b/sdks/java/io/cassandra/build.gradle
@@ -0,0 +1,26 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Cassandra"
+
+def cassandra_version = "3.2.0"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.slf4j_api
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile "com.datastax.cassandra:cassandra-driver-core:$cassandra_version"
+  compile "com.datastax.cassandra:cassandra-driver-mapping:$cassandra_version"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common").sourceSets.test.output
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_core
+  testCompile library.java.hamcrest_all
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.mockito_all
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/common/build.gradle b/sdks/java/io/common/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..8037243b66d26cb2203d7f5f9eec32e173d8753d
--- /dev/null
+++ b/sdks/java/io/common/build.gradle
@@ -0,0 +1,14 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Common"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.guava
+  testCompile library.java.junit
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-2/build.gradle b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-2/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..6c5205be2a0ad9ffcc44b4c167937b3cdafc6ce3
--- /dev/null
+++ b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-2/build.gradle
@@ -0,0 +1,30 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: 2.x"
+
+def jna_version = "4.1.0"
+def log4j_version = "2.6.2"
+
+dependencies {
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent:beam-sdks-java-io-elasticsearch-tests-common").sourceSets.test.output
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.slf4j_api
+  testCompile "net.java.dev.jna:jna:$jna_version"
+  testCompile "org.apache.logging.log4j:log4j-api:$log4j_version"
+  testCompile "org.apache.logging.log4j:log4j-core:$log4j_version"
+  testCompile library.java.hamcrest_all
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.commons_io_1x
+  testCompile library.java.junit
+  testCompile "org.elasticsearch.client:elasticsearch-rest-client:5.6.3"
+  testCompile library.java.guava
+  testCompile "org.elasticsearch:elasticsearch:2.4.1"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-5/build.gradle b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-5/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..5edceae6cafc08ce5f18ce952a21e75d94e581d4
--- /dev/null
+++ b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-5/build.gradle
@@ -0,0 +1,33 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: 5.x"
+
+def jna_version = "4.1.0"
+def log4j_version = "2.6.2"
+
+dependencies {
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent:beam-sdks-java-io-elasticsearch-tests-common").sourceSets.test.output
+  testCompile group: "org.elasticsearch.test", name: "framework", version:"5.4.0"
+  testCompile group: "org.elasticsearch.plugin", name: "transport-netty4-client", version:"5.4.0"
+  testCompile group: "com.carrotsearch.randomizedtesting", name: "randomizedtesting-runner", version:"2.5.0"
+  testCompile group: "org.elasticsearch", name: "elasticsearch", version:"5.4.0"
+
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.slf4j_api
+  testCompile "net.java.dev.jna:jna:$jna_version"
+  testCompile "org.apache.logging.log4j:log4j-api:$log4j_version"
+  testCompile "org.apache.logging.log4j:log4j-core:$log4j_version"
+  testCompile library.java.hamcrest_all
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.commons_io_1x
+  testCompile library.java.junit
+  testCompile "org.elasticsearch.client:elasticsearch-rest-client:5.6.3"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/build.gradle b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..2f2dfc2a8b11d23b3134546fc2f495674e5655af
--- /dev/null
+++ b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/build.gradle
@@ -0,0 +1,33 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: Common"
+
+def jna_version = "4.1.0"
+def log4j_version = "2.6.2"
+
+dependencies {
+  testCompile library.java.jackson_databind
+  testCompile "org.apache.httpcomponents:httpasyncclient:4.1.2"
+  testCompile "org.apache.httpcomponents:httpcore-nio:4.4.5"
+  testCompile "org.apache.httpcomponents:httpcore:4.4.5"
+  testCompile "org.apache.httpcomponents:httpclient:4.5.2"
+
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.slf4j_api
+  testCompile "net.java.dev.jna:jna:$jna_version"
+  testCompile "org.apache.logging.log4j:log4j-api:$log4j_version"
+  testCompile "org.apache.logging.log4j:log4j-core:$log4j_version"
+  testCompile library.java.hamcrest_all
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.commons_io_1x
+  testCompile library.java.junit
+  testCompile "org.elasticsearch.client:elasticsearch-rest-client:5.6.3"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/elasticsearch/build.gradle b/sdks/java/io/elasticsearch/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..acb1e2db27ceee5be92c7ca5ab231e56c185232d
--- /dev/null
+++ b/sdks/java/io/elasticsearch/build.gradle
@@ -0,0 +1,21 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.jackson_databind
+  compile library.java.findbugs_jsr305
+  compile library.java.guava
+  compile "org.elasticsearch.client:rest:5.4.0"
+  compile "org.apache.httpcomponents:httpasyncclient:4.1.2"
+  compile "org.apache.httpcomponents:httpcore-nio:4.4.5"
+  compile "org.apache.httpcomponents:httpcore:4.4.5"
+  compile "org.apache.httpcomponents:httpclient:4.5.2"
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common")
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/google-cloud-platform/build.gradle b/sdks/java/io/google-cloud-platform/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..ce46fe728838441ec8570bcd50e45a6dae29abcd
--- /dev/null
+++ b/sdks/java/io/google-cloud-platform/build.gradle
@@ -0,0 +1,55 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Google Cloud Platform"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-protobuf")
+  compile library.java.jackson_databind
+  compile library.java.grpc_core
+  compile library.java.google_api_services_bigquery
+  compile library.java.gax_grpc
+  compile library.java.google_cloud_core_grpc
+  compile library.java.google_api_services_pubsub
+  compile library.java.grpc_google_cloud_pubsub_v1
+  compile library.java.proto_google_cloud_pubsub_v1
+  compile library.java.bigdataoss_util
+  compile library.java.datastore_v1_proto_client
+  compile library.java.datastore_v1_protos
+  compile library.java.grpc_auth
+  compile library.java.grpc_netty
+  compile library.java.netty_handler
+  compile library.java.grpc_stub
+  compile library.java.joda_time
+  compile library.java.google_cloud_core
+  compile library.java.google_cloud_spanner
+  compile library.java.bigtable_protos
+  compile library.java.bigtable_client_core
+  compile library.java.google_api_client
+  compile library.java.google_http_client
+  compile library.java.google_http_client_jackson2
+  compile library.java.google_auth_library_credentials
+  compile library.java.google_auth_library_oauth2_http
+  compile library.java.slf4j_api
+  compile library.java.guava
+  compile library.java.protobuf_java
+  compile library.java.findbugs_jsr305
+  compile library.java.avro
+  compile library.java.proto_google_cloud_spanner_admin_database_v1
+  compile library.java.proto_google_common_protos
+  runtime library.java.grpc_all
+  runtime library.java.netty_tcnative_boringssl_static
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.hamcrest_all
+  testCompile library.java.mockito_all
+  testCompile library.java.junit
+  testCompile library.java.slf4j_jdk14
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/hadoop-common/build.gradle b/sdks/java/io/hadoop-common/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..e10ecf57da7384341186e13a4dd068312ba76b0d
--- /dev/null
+++ b/sdks/java/io/hadoop-common/build.gradle
@@ -0,0 +1,22 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Hadoop Common"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.findbugs_jsr305
+  compileOnly library.java.hadoop_client
+  compileOnly library.java.hadoop_common
+  compileOnly library.java.hadoop_mapreduce_client_core
+  testCompile library.java.commons_lang3
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+  testCompileOnly library.java.hadoop_client
+  testCompileOnly library.java.hadoop_common
+  testCompileOnly library.java.hadoop_mapreduce_client_core
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/hadoop-file-system/build.gradle b/sdks/java/io/hadoop-file-system/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..7035a920b26ddb510d1237d081ad3e29ea88a6ed
--- /dev/null
+++ b/sdks/java/io/hadoop-file-system/build.gradle
@@ -0,0 +1,28 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Hadoop File System"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.jackson_core
+  compile library.java.jackson_databind
+  compile library.java.guava
+  compile library.java.slf4j_api
+  compile library.java.findbugs_jsr305
+  compileOnly library.java.hadoop_client
+  compileOnly library.java.hadoop_common
+  compileOnly library.java.hadoop_mapreduce_client_core
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile library.java.guava
+  testCompile library.java.hamcrest_all
+  testCompile library.java.mockito_all
+  testCompile library.java.junit
+  testCompile library.java.hadoop_minicluster
+  testCompile library.java.hadoop_hdfs_tests
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/hadoop/input-format/build.gradle b/sdks/java/io/hadoop/input-format/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..170ef95ec9d9d935b7993a952f120e13b3e7f00e
--- /dev/null
+++ b/sdks/java/io/hadoop/input-format/build.gradle
@@ -0,0 +1,29 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Hadoop :: input-format"
+
+def log4j_version = "2.6.2"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-common")
+  compile library.java.guava
+  compile library.java.slf4j_api
+  compile library.java.findbugs_jsr305
+  compileOnly library.java.hadoop_common
+  compileOnly library.java.hadoop_mapreduce_client_core
+  testCompile library.java.hamcrest_all
+
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile "org.apache.logging.log4j:log4j-core:$log4j_version"
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+  testCompileOnly library.java.hadoop_common
+  testCompileOnly library.java.hadoop_mapreduce_client_core
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/hadoop/jdk1.8-tests/build.gradle b/sdks/java/io/hadoop/jdk1.8-tests/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..02e3ea027e4bb330754c328177fda5052233e195
--- /dev/null
+++ b/sdks/java/io/hadoop/jdk1.8-tests/build.gradle
@@ -0,0 +1,40 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Hadoop :: jdk1.8-tests"
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+def log4j_version = "2.6.2"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-parent:beam-sdks-java-io-hadoop-input-format")
+  compile library.java.slf4j_api
+  compile group: "org.elasticsearch", name: "elasticsearch-hadoop", version:"5.0.0"
+  compileOnly library.java.hadoop_common
+  compileOnly library.java.hadoop_mapreduce_client_core
+  runtime library.java.commons_io_2x
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common").sourceSets.test.output
+  testCompile library.java.hamcrest_all
+  testCompile group: "org.elasticsearch.plugin", name: "transport-netty4-client", version:"5.0.0"
+  testCompile group: "org.elasticsearch.client", name: "transport", version:"5.0.0"
+  testCompile group: "io.netty", name: "netty-transport-native-epoll", version:"4.1.0.CR3"
+  testCompile group: "org.elasticsearch", name: "elasticsearch", version:"5.0.0"
+  testCompile group: "com.datastax.cassandra", name: "cassandra-driver-mapping", version:"3.1.1"
+  testCompile group: "org.apache.cassandra", name: "cassandra-all", version:"3.9"
+  testCompile group: "com.datastax.cassandra", name: "cassandra-driver-core", version:"3.1.1"
+
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile "org.apache.logging.log4j:log4j-core:$log4j_version"
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+  testCompileOnly library.java.hadoop_common
+  testCompileOnly library.java.hadoop_mapreduce_client_core
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/hbase/build.gradle b/sdks/java/io/hbase/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..f8b0289a0f91eda8517a736276830205db271d03
--- /dev/null
+++ b/sdks/java/io/hbase/build.gradle
@@ -0,0 +1,29 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: HBase"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-common")
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile library.java.slf4j_api
+  compile "org.apache.hbase:hbase-shaded-client:1.2.6"
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.commons_lang3
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_all
+  testCompile library.java.hadoop_minicluster
+  testCompile library.java.hadoop_hdfs
+  testCompile library.java.hadoop_common
+  testCompile "org.apache.hbase:hbase-shaded-server:1.2.6"
+  testCompile "org.apache.hbase:hbase-server:1.2.6:tests"
+  testCompile "org.apache.hbase:hbase-hadoop-compat:1.2.6"
+  testCompile "org.apache.hbase:hbase-hadoop2-compat:1.2.6"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/hcatalog/build.gradle b/sdks/java/io/hcatalog/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..4d8a185fa782f00337b03662bb4d0fce7aaa8f14
--- /dev/null
+++ b/sdks/java/io/hcatalog/build.gradle
@@ -0,0 +1,38 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: HCatalog"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-common")
+  compile library.java.slf4j_api
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compileOnly library.java.hadoop_common
+  compileOnly "org.apache.hive:hive-exec:2.1.0"
+  compileOnly(group: "org.apache.hive.hcatalog", name: "hive-hcatalog-core", version:"2.1.0") {
+    exclude(module: "hive-exec")
+    exclude(module: "protobuf-java")
+    exclude(module: "jdk.tools")
+  }
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.commons_io_2x
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_all
+  testCompile "org.apache.hive.hcatalog:hive-hcatalog-core:2.1.0:tests"
+  testCompile "org.apache.hive:hive-exec:2.1.0"
+  testCompile "org.apache.hive:hive-common:2.1.0"
+  testCompile "org.apache.hive:hive-cli:2.1.0"
+  testCompileOnly library.java.hadoop_common
+  testCompileOnly "org.apache.hive:hive-exec:2.1.0"
+  testCompileOnly(group: "org.apache.hive.hcatalog", name: "hive-hcatalog-core", version:"2.1.0") {
+    exclude(module: "hive-exec")
+    exclude(module: "protobuf-java")
+    exclude(module: "jdk.tools")
+  }
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/jdbc/build.gradle b/sdks/java/io/jdbc/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..1c5502bf8c718ad8d944060520da4d71772b7549
--- /dev/null
+++ b/sdks/java/io/jdbc/build.gradle
@@ -0,0 +1,26 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: JDBC"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile "org.apache.commons:commons-dbcp2:2.1.1"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common").sourceSets.test.output
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_all
+  testCompile library.java.slf4j_api
+  testCompile library.java.slf4j_jdk14
+  testCompile group: "org.apache.derby", name: "derby", version:"10.12.1.1"
+  testCompile group: "org.apache.derby", name: "derbyclient", version:"10.12.1.1"
+  testCompile group: "org.apache.derby", name: "derbynet", version:"10.12.1.1"
+  testCompile group: "org.postgresql", name: "postgresql", version:"9.4.1212.jre7"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/jms/build.gradle b/sdks/java/io/jms/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..c0070a4afe986eaa37c737d10cd46730c9eabd80
--- /dev/null
+++ b/sdks/java/io/jms/build.gradle
@@ -0,0 +1,25 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: JMS"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.slf4j_api
+  compile library.java.joda_time
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile "org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.activemq_broker
+  testCompile library.java.activemq_jaas
+  testCompile library.java.activemq_kahadb_store
+  testCompile library.java.activemq_client
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_all
+  testCompile library.java.slf4j_jdk14
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/kafka/build.gradle b/sdks/java/io/kafka/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..17a35d11eaa2d412e8ef785f9fe053167ac324a2
--- /dev/null
+++ b/sdks/java/io/kafka/build.gradle
@@ -0,0 +1,25 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Kafka"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.kafka_clients
+  compile library.java.slf4j_api
+  compile library.java.joda_time
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile library.java.jackson_annotations
+  compile library.java.jackson_databind
+  compile "org.springframework:spring-expression:4.3.5.RELEASE"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+  testCompile library.java.slf4j_jdk14
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/kinesis/build.gradle b/sdks/java/io/kinesis/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..eeb5ba481267ec7dc84f4d9c0886c1c8a542a9fd
--- /dev/null
+++ b/sdks/java/io/kinesis/build.gradle
@@ -0,0 +1,29 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Kinesis"
+
+def aws_version = "1.11.18"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.slf4j_api
+  compile library.java.joda_time
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile "com.amazonaws:aws-java-sdk-core:$aws_version"
+  compile "com.amazonaws:aws-java-sdk-kinesis:$aws_version"
+  compile "com.amazonaws:aws-java-sdk-cloudwatch:$aws_version"
+  compile "com.amazonaws:amazon-kinesis-client:1.6.1"
+  compile "commons-lang:commons-lang:2.6"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.junit
+  testCompile library.java.mockito_all
+  testCompile library.java.guava_testlib
+  testCompile library.java.hamcrest_all
+  testCompile "org.assertj:assertj-core:2.5.0"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/mongodb/build.gradle b/sdks/java/io/mongodb/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..21f3d467a9ced092d66fb89136f0c9ea15082e89
--- /dev/null
+++ b/sdks/java/io/mongodb/build.gradle
@@ -0,0 +1,23 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: MongoDB"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.slf4j_api
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile library.java.joda_time
+  compile "org.mongodb:mongo-java-driver:3.2.2"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.junit
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.hamcrest_all
+  testCompile "de.flapdoodle.embed:de.flapdoodle.embed.mongo:1.50.1"
+  testCompile "de.flapdoodle.embed:de.flapdoodle.embed.process:1.50.1"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/mqtt/build.gradle b/sdks/java/io/mqtt/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..a2a43ac8cf40e5a14e70021b5ce91a6a418ad1fc
--- /dev/null
+++ b/sdks/java/io/mqtt/build.gradle
@@ -0,0 +1,25 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: MQTT"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.slf4j_api
+  compile library.java.joda_time
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile "org.fusesource.mqtt-client:mqtt-client:1.14"
+  compile "org.fusesource.hawtbuf:hawtbuf:1.11"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.activemq_broker
+  testCompile library.java.activemq_mqtt
+  testCompile library.java.activemq_kahadb_store
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_all
+  testCompile library.java.slf4j_jdk14
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/redis/build.gradle b/sdks/java/io/redis/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..d1eb98ec0c3be78ee960a90e35e1a31513f242b4
--- /dev/null
+++ b/sdks/java/io/redis/build.gradle
@@ -0,0 +1,20 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Redis"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile "redis.clients:jedis:2.9.0"
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.junit
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.hamcrest_all
+  testCompile "com.github.kstyrc:embedded-redis:0.6"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/solr/build.gradle b/sdks/java/io/solr/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..54629e296421fc7f0cf50c58833d095b121573de
--- /dev/null
+++ b/sdks/java/io/solr/build.gradle
@@ -0,0 +1,27 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Solr"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile library.java.commons_compress
+  compile "org.apache.solr:solr-solrj:5.5.4"
+  compileOnly "org.apache.httpcomponents:httpclient:4.4.1"
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common")
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.hamcrest_core
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+  testCompile library.java.slf4j_api
+  testCompile library.java.slf4j_log4j12
+  testCompile "org.apache.solr:solr-test-framework:5.5.4"
+  testCompile "org.apache.solr:solr-core:5.5.4"
+  testCompile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:2.3.2"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/tika/build.gradle b/sdks/java/io/tika/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..e34d1cd61fd77077b8ee6b3939b1c25b980ce1fb
--- /dev/null
+++ b/sdks/java/io/tika/build.gradle
@@ -0,0 +1,24 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: Tika"
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  compile "org.apache.tika:tika-core:1.16"
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.junit
+  testCompile library.java.hamcrest_core
+  testCompile library.java.hamcrest_all
+  testCompile "org.apache.tika:tika-parsers:1.16"
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/io/xml/build.gradle b/sdks/java/io/xml/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..81f75c95a4608cef6f42a09eae9e628325a355b2
--- /dev/null
+++ b/sdks/java/io/xml/build.gradle
@@ -0,0 +1,22 @@
+description = "Apache Beam :: SDKs :: Java :: IO :: XML"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile library.java.stax2_api
+  compile library.java.guava
+  compile library.java.findbugs_jsr305
+  runtime library.java.woodstox_core_asl
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core").sourceSets.test.output
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.junit
+  testCompile library.java.slf4j_jdk14
+  testCompile library.java.hamcrest_core
+  testCompile library.java.hamcrest_all
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/java8tests/build.gradle b/sdks/java/java8tests/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..1f518584f49338f471cae1fff8d6841797648999
--- /dev/null
+++ b/sdks/java/java8tests/build.gradle
@@ -0,0 +1,20 @@
+description = "Apache Beam :: SDKs :: Java :: Java 8 Tests"
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+dependencies {
+  testCompile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  testCompile project(":beam-runners-parent:beam-runners-direct-java")
+  testCompile library.java.guava
+  testCompile library.java.joda_time
+  testCompile library.java.hamcrest_all
+  testCompile library.java.junit
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/maven-archetypes/examples-java8/build.gradle b/sdks/java/maven-archetypes/examples-java8/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..21c99f494cc07cdf783b8daff93ea62288143adb
--- /dev/null
+++ b/sdks/java/maven-archetypes/examples-java8/build.gradle
@@ -0,0 +1,12 @@
+description = "Apache Beam :: SDKs :: Java :: Maven Archetypes :: Examples - Java 8"
+
+dependencies {
+  runtime project(":beam-examples-parent:beam-examples-java8")
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/maven-archetypes/examples/build.gradle b/sdks/java/maven-archetypes/examples/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..2c046698fe61d5d912bc833881b85fdb13058410
--- /dev/null
+++ b/sdks/java/maven-archetypes/examples/build.gradle
@@ -0,0 +1,12 @@
+description = "Apache Beam :: SDKs :: Java :: Maven Archetypes :: Examples"
+
+dependencies {
+  runtime project(":beam-examples-parent:beam-examples-java")
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/maven-archetypes/starter/build.gradle b/sdks/java/maven-archetypes/starter/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..3b937120f6b667a3ee5250cfc40d9cba1a2fe253
--- /dev/null
+++ b/sdks/java/maven-archetypes/starter/build.gradle
@@ -0,0 +1,13 @@
+description = "Apache Beam :: SDKs :: Java :: Maven Archetypes :: Starter"
+
+dependencies {
+  runtime project(":beam-runners-parent:beam-runners-direct-java")
+  runtime project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/sdks/java/nexmark/build.gradle b/sdks/java/nexmark/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..ded953d16ed0bf237b215cd47b15bbfa0d0e7d69
--- /dev/null
+++ b/sdks/java/nexmark/build.gradle
@@ -0,0 +1,28 @@
+description = "Apache Beam :: SDKs :: Java :: Nexmark"
+
+dependencies {
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-google-cloud-platform")
+  compile project(":beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core")
+  compile library.java.google_api_services_bigquery
+  compile library.java.jackson_core
+  compile library.java.jackson_annotations
+  compile library.java.jackson_databind
+  compile library.java.avro
+  compile library.java.joda_time
+  compile library.java.guava
+  compile library.java.slf4j_api
+  compile library.java.findbugs_jsr305
+  compile library.java.junit
+  compile library.java.hamcrest_core
+  runtime project(":beam-runners-parent:beam-runners-direct-java")
+  runtime library.java.slf4j_jdk14
+  testCompile library.java.hamcrest_all
+}
+
+task packageTests(type: Jar) {
+  from sourceSets.test.output
+  classifier = "tests"
+}
+
+artifacts.archives packageTests
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..3cfd796b86553c01ed6e6a5d9ae33fd02bac9363
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,146 @@
+rootProject.name = 'beam-parent'
+include ':beam-sdks-java-build-tools'
+include ':beam-model-parent:beam-model-pipeline'
+include ':beam-model-parent:beam-model-job-management'
+include ':beam-model-parent:beam-model-fn-execution'
+include ':beam-model-parent'
+include ':beam-sdks-parent:beam-sdks-go'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-amqp'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-cassandra'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent:beam-sdks-java-io-elasticsearch-tests-common'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent:beam-sdks-java-io-elasticsearch-tests-2'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent:beam-sdks-java-io-elasticsearch-tests-5'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-google-cloud-platform'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-common'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-file-system'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-parent:beam-sdks-java-io-hadoop-input-format'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-parent:beam-sdks-java-io-hadoop-jdk1.8-tests'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-parent'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hbase'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hcatalog'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-jdbc'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-jms'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-kafka'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-kinesis'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-mongodb'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-mqtt'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-redis'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-solr'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-tika'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-xml'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-maven-archetypes-parent:beam-sdks-java-maven-archetypes-starter'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-maven-archetypes-parent:beam-sdks-java-maven-archetypes-examples'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-maven-archetypes-parent:beam-sdks-java-maven-archetypes-examples-java8'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-maven-archetypes-parent'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-json-jackson'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-join-library'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-protobuf'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-sorter'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-sql'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-nexmark'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-harness'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-container'
+include ':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-java8tests'
+include ':beam-sdks-parent:beam-sdks-java-parent'
+include ':beam-sdks-parent:beam-sdks-python:beam-sdks-python-container'
+include ':beam-sdks-parent:beam-sdks-python'
+include ':beam-sdks-parent'
+include ':beam-runners-parent:beam-runners-core-construction-java'
+include ':beam-runners-parent:beam-runners-core-java'
+include ':beam-runners-parent:beam-local-artifact-service-java'
+include ':beam-runners-parent:beam-runners-reference-parent:beam-runners-reference-job-orchestrator'
+include ':beam-runners-parent:beam-runners-reference-parent'
+include ':beam-runners-parent:beam-runners-direct-java'
+include ':beam-runners-parent:beam-runners-flink_2.10'
+include ':beam-runners-parent:beam-runners-google-cloud-dataflow-java'
+include ':beam-runners-parent:beam-runners-spark'
+include ':beam-runners-parent:beam-runners-apex'
+include ':beam-runners-parent:beam-runners-gcp-parent:beam-runners-gcp-gcemd'
+include ':beam-runners-parent:beam-runners-gcp-parent:beam-runners-gcp-gcsproxy'
+include ':beam-runners-parent:beam-runners-gcp-parent'
+include ':beam-runners-parent:beam-runners-gearpump'
+include ':beam-runners-parent'
+include ':beam-examples-parent:beam-examples-java'
+include ':beam-examples-parent:beam-examples-java8'
+include ':beam-examples-parent'
+include ':beam-sdks-java-javadoc'
+
+project(':beam-sdks-java-build-tools').projectDir = "$rootDir/sdks/java/build-tools" as File
+project(':beam-model-parent:beam-model-pipeline').projectDir = "$rootDir/model/pipeline" as File
+project(':beam-model-parent:beam-model-job-management').projectDir = "$rootDir/model/job-management" as File
+project(':beam-model-parent:beam-model-fn-execution').projectDir = "$rootDir/model/fn-execution" as File
+project(':beam-model-parent').projectDir = "$rootDir/model" as File
+project(':beam-sdks-parent:beam-sdks-go').projectDir = "$rootDir/sdks/go" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-core').projectDir = "$rootDir/sdks/java/core" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-amqp').projectDir = "$rootDir/sdks/java/io/amqp" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-cassandra').projectDir = "$rootDir/sdks/java/io/cassandra" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-common').projectDir = "$rootDir/sdks/java/io/common" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch').projectDir = "$rootDir/sdks/java/io/elasticsearch" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent:beam-sdks-java-io-elasticsearch-tests-common').projectDir = "$rootDir/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent:beam-sdks-java-io-elasticsearch-tests-2').projectDir = "$rootDir/sdks/java/io/elasticsearch-tests/elasticsearch-tests-2" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent:beam-sdks-java-io-elasticsearch-tests-5').projectDir = "$rootDir/sdks/java/io/elasticsearch-tests/elasticsearch-tests-5" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-elasticsearch-tests-parent').projectDir = "$rootDir/sdks/java/io/elasticsearch-tests" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-google-cloud-platform').projectDir = "$rootDir/sdks/java/io/google-cloud-platform" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-common').projectDir = "$rootDir/sdks/java/io/hadoop-common" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-file-system').projectDir = "$rootDir/sdks/java/io/hadoop-file-system" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-parent:beam-sdks-java-io-hadoop-input-format').projectDir = "$rootDir/sdks/java/io/hadoop/input-format" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-parent:beam-sdks-java-io-hadoop-jdk1.8-tests').projectDir = "$rootDir/sdks/java/io/hadoop/jdk1.8-tests" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hadoop-parent').projectDir = "$rootDir/sdks/java/io/hadoop" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hbase').projectDir = "$rootDir/sdks/java/io/hbase" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-hcatalog').projectDir = "$rootDir/sdks/java/io/hcatalog" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-jdbc').projectDir = "$rootDir/sdks/java/io/jdbc" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-jms').projectDir = "$rootDir/sdks/java/io/jms" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-kafka').projectDir = "$rootDir/sdks/java/io/kafka" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-kinesis').projectDir = "$rootDir/sdks/java/io/kinesis" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-mongodb').projectDir = "$rootDir/sdks/java/io/mongodb" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-mqtt').projectDir = "$rootDir/sdks/java/io/mqtt" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-redis').projectDir = "$rootDir/sdks/java/io/redis" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-solr').projectDir = "$rootDir/sdks/java/io/solr" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-tika').projectDir = "$rootDir/sdks/java/io/tika" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent:beam-sdks-java-io-xml').projectDir = "$rootDir/sdks/java/io/xml" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-io-parent').projectDir = "$rootDir/sdks/java/io" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-maven-archetypes-parent:beam-sdks-java-maven-archetypes-starter').projectDir = "$rootDir/sdks/java/maven-archetypes/starter" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-maven-archetypes-parent:beam-sdks-java-maven-archetypes-examples').projectDir = "$rootDir/sdks/java/maven-archetypes/examples" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-maven-archetypes-parent:beam-sdks-java-maven-archetypes-examples-java8').projectDir = "$rootDir/sdks/java/maven-archetypes/examples-java8" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-maven-archetypes-parent').projectDir = "$rootDir/sdks/java/maven-archetypes" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-google-cloud-platform-core').projectDir = "$rootDir/sdks/java/extensions/google-cloud-platform-core" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-json-jackson').projectDir = "$rootDir/sdks/java/extensions/jackson" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-join-library').projectDir = "$rootDir/sdks/java/extensions/join-library" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-protobuf').projectDir = "$rootDir/sdks/java/extensions/protobuf" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-sorter').projectDir = "$rootDir/sdks/java/extensions/sorter" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent:beam-sdks-java-extensions-sql').projectDir = "$rootDir/sdks/java/extensions/sql" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-extensions-parent').projectDir = "$rootDir/sdks/java/extensions" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-nexmark').projectDir = "$rootDir/sdks/java/nexmark" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-harness').projectDir = "$rootDir/sdks/java/harness" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-container').projectDir = "$rootDir/sdks/java/container" as File
+project(':beam-sdks-parent:beam-sdks-java-parent:beam-sdks-java-java8tests').projectDir = "$rootDir/sdks/java/java8tests" as File
+project(':beam-sdks-parent:beam-sdks-java-parent').projectDir = "$rootDir/sdks/java" as File
+project(':beam-sdks-parent:beam-sdks-python:beam-sdks-python-container').projectDir = "$rootDir/sdks/python/container" as File
+project(':beam-sdks-parent:beam-sdks-python').projectDir = "$rootDir/sdks/python" as File
+project(':beam-sdks-parent').projectDir = "$rootDir/sdks" as File
+project(':beam-runners-parent:beam-runners-core-construction-java').projectDir = "$rootDir/runners/core-construction-java" as File
+project(':beam-runners-parent:beam-runners-core-java').projectDir = "$rootDir/runners/core-java" as File
+project(':beam-runners-parent:beam-local-artifact-service-java').projectDir = "$rootDir/runners/local-artifact-service-java" as File
+project(':beam-runners-parent:beam-runners-reference-parent:beam-runners-reference-job-orchestrator').projectDir = "$rootDir/runners/reference/job-server" as File
+project(':beam-runners-parent:beam-runners-reference-parent').projectDir = "$rootDir/runners/reference" as File
+project(':beam-runners-parent:beam-runners-direct-java').projectDir = "$rootDir/runners/direct-java" as File
+project(':beam-runners-parent:beam-runners-flink_2.10').projectDir = "$rootDir/runners/flink" as File
+project(':beam-runners-parent:beam-runners-google-cloud-dataflow-java').projectDir = "$rootDir/runners/google-cloud-dataflow-java" as File
+project(':beam-runners-parent:beam-runners-spark').projectDir = "$rootDir/runners/spark" as File
+project(':beam-runners-parent:beam-runners-apex').projectDir = "$rootDir/runners/apex" as File
+project(':beam-runners-parent:beam-runners-gcp-parent:beam-runners-gcp-gcemd').projectDir = "$rootDir/runners/gcp/gcemd" as File
+project(':beam-runners-parent:beam-runners-gcp-parent:beam-runners-gcp-gcsproxy').projectDir = "$rootDir/runners/gcp/gcsproxy" as File
+project(':beam-runners-parent:beam-runners-gcp-parent').projectDir = "$rootDir/runners/gcp" as File
+project(':beam-runners-parent:beam-runners-gearpump').projectDir = "$rootDir/runners/gearpump" as File
+project(':beam-runners-parent').projectDir = "$rootDir/runners" as File
+project(':beam-examples-parent:beam-examples-java').projectDir = "$rootDir/examples/java" as File
+project(':beam-examples-parent:beam-examples-java8').projectDir = "$rootDir/examples/java8" as File
+project(':beam-examples-parent').projectDir = "$rootDir/examples" as File
+project(':beam-sdks-java-javadoc').projectDir = "$rootDir/sdks/java/javadoc" as File
\ No newline at end of file