Repository: GoogleCloudPlatform/cloud-bigtable-client
Pull request #1646 (2018-02-02 17:03:19)

expose app profiles in beam


Patch:
diff --git a/README.md b/README.md
index e6d8f09b8..32c07d04c 100644
--- a/README.md
+++ b/README.md
@@ -40,7 +40,7 @@ which makes it easy for development teams to get started.
     <dependency>
         <groupId>com.google.cloud.bigtable</groupId>
         <artifactId>bigtable-hbase-1.x</artifactId>
-        <version>1.0.0</version>
+        <version>1.1.0</version>
     </dependency>
   ```
 
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/AbstractRetryingOperation.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/AbstractRetryingOperation.java
index de312810d..786b1d50f 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/AbstractRetryingOperation.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/AbstractRetryingOperation.java
@@ -57,9 +57,34 @@ import io.opencensus.trace.Tracing;
 /**
  * A {@link ClientCall.Listener} that retries a {@link BigtableAsyncRpc} request.
  */
+@SuppressWarnings("unchecked")
 public abstract class AbstractRetryingOperation<RequestT, ResponseT, ResultT>
     extends ClientCall.Listener<ResponseT>  {
 
+  @SuppressWarnings("rawtypes")
+  private static final ClientCall NULL_CALL = new ClientCall() {
+
+    @Override
+    public void start(Listener responseListener, Metadata headers) {
+    }
+
+    @Override
+    public void request(int numMessages) {
+    }
+
+    @Override
+    public void cancel(String message, Throwable cause) {
+    }
+
+    @Override
+    public void halfClose() {
+    }
+
+    @Override
+    public void sendMessage(Object message) {
+    }
+  };
+
   /** Constant <code>LOG</code> */
   protected static final Logger LOG = new Logger(AbstractRetryingOperation.class);
   private static final Tracer TRACER = Tracing.getTracer();
@@ -111,7 +136,7 @@ public abstract class AbstractRetryingOperation<RequestT, ResponseT, ResultT>
 
   protected final GrpcFuture<ResultT> completionFuture;
   protected Object callLock = new String("");
-  protected ClientCall<RequestT, ResponseT> call;
+  protected ClientCall<RequestT, ResponseT> call = NULL_CALL;
   protected Timer.Context operationTimerContext;
   protected Timer.Context rpcTimerContext;
 
@@ -150,7 +175,7 @@ public abstract class AbstractRetryingOperation<RequestT, ResponseT, ResultT>
   public void onClose(Status status, Metadata trailers) {
     try (Closeable s = TRACER.withSpan(operationSpan)) {
       synchronized (callLock) {
-        call = null;
+        call = NULL_CALL;
       }
       rpcTimerContext.close();
       // OK
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/scanner/RetryingReadRowsOperation.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/scanner/RetryingReadRowsOperation.java
index 12c81c572..63a661637 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/scanner/RetryingReadRowsOperation.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/scanner/RetryingReadRowsOperation.java
@@ -32,7 +32,6 @@ import com.google.common.collect.ImmutableMap;
 import com.google.protobuf.ByteString;
 
 import io.grpc.CallOptions;
-import io.grpc.ClientCall;
 import io.grpc.Metadata;
 import io.grpc.Status;
 import io.grpc.stub.ClientCallStreamObserver;
@@ -53,16 +52,11 @@ public class RetryingReadRowsOperation extends
 
   private static final String TIMEOUT_CANCEL_MSG = "Client side timeout induced cancellation";
 
-  private static class CallToStreamObserverAdapter<T> extends ClientCallStreamObserver<T> {
-    private final ClientCall<T, ?> call;
+  private class CallToStreamObserverAdapter extends ClientCallStreamObserver<ReadRowsRequest> {
     private boolean autoFlowControlEnabled = true;
 
-    public CallToStreamObserverAdapter(ClientCall<T, ?> call) {
-      this.call = call;
-    }
-
     @Override
-    public void onNext(T value) {
+    public void onNext(ReadRowsRequest value) {
       call.sendMessage(value);
     }
 
@@ -115,7 +109,7 @@ public class RetryingReadRowsOperation extends
 
   // The number of times we've retried after a timeout
   private int timeoutRetryCount = 0;
-  private CallToStreamObserverAdapter<ReadRowsRequest> adapter;
+  private CallToStreamObserverAdapter adapter;
   private StreamObserver<ReadRowsResponse> resultObserver;
   private int totalRowsProcessed = 0;
   private volatile ReadRowsRequest nextRequest;
@@ -151,16 +145,16 @@ public class RetryingReadRowsOperation extends
   @Override
   public void run() {
     // restart the clock.
-    lastResponseMs = clock.currentTimeMillis();
     this.rowMerger = new RowMerger(rowObserver);
+    adapter = new CallToStreamObserverAdapter();
     synchronized (callLock) {
       super.run();
       // pre-fetch one more result, for performance reasons.
-      adapter = new CallToStreamObserverAdapter<ReadRowsRequest>(call);
       adapter.request(1);
       if (rowObserver instanceof ClientResponseObserver) {
         ((ClientResponseObserver<ReadRowsRequest, FlatRow>) rowObserver).beforeStart(adapter);
       }
+      lastResponseMs = clock.currentTimeMillis();
     }
   }
 
diff --git a/bigtable-dataflow-parent/bigtable-beam-import/README.md b/bigtable-dataflow-parent/bigtable-beam-import/README.md
index ac50bfa7e..98cfabf4c 100644
--- a/bigtable-dataflow-parent/bigtable-beam-import/README.md
+++ b/bigtable-dataflow-parent/bigtable-beam-import/README.md
@@ -5,14 +5,14 @@ Cloud Dataflow.
 
 ## Instructions
 
-Download [the import/export jar](http://search.maven.org/remotecontent?filepath=com/google/cloud/bigtable/bigtable-beam-import/1.0.0-pre4/bigtable-beam-import-1.0.0-pre4-shaded.jar), which is an aggregation of all required jars.
+Download [the import/export jar](http://search.maven.org/remotecontent?filepath=com/google/cloud/bigtable/bigtable-beam-import/1.1.0/bigtable-beam-import-1.1.0-shaded.jar), which is an aggregation of all required jars.
 
 ## Export
 
 On the command line:
 
 ```
-java -jar bigtable-beam-import-1.0.0-pre4-shaded.jar export \
+java -jar bigtable-beam-import-1.1.0-shaded.jar export \
     --runner=dataflow \
     --project=[your_project_id] \
     --bigtableInstanceId=[your_instance_id] \
@@ -30,7 +30,7 @@ Create the table in your cluster.
 On the command line:
 
 ```
-java -jar bigtable-beam-import-1.0.0-pre4-shaded.jar import \
+java -jar bigtable-beam-import-1.1.0-shaded.jar import \
     --runner=dataflow \
     --project=[your_project_id] \
     --bigtableInstanceId=[your_instance_id] \
diff --git a/bigtable-dataflow-parent/bigtable-beam-import/src/main/java/com/google/cloud/bigtable/beam/sequencefiles/ExportJob.java b/bigtable-dataflow-parent/bigtable-beam-import/src/main/java/com/google/cloud/bigtable/beam/sequencefiles/ExportJob.java
index 7b9840936..26da94986 100644
--- a/bigtable-dataflow-parent/bigtable-beam-import/src/main/java/com/google/cloud/bigtable/beam/sequencefiles/ExportJob.java
+++ b/bigtable-dataflow-parent/bigtable-beam-import/src/main/java/com/google/cloud/bigtable/beam/sequencefiles/ExportJob.java
@@ -79,6 +79,11 @@ public class ExportJob {
   public interface ExportOptions extends GcpOptions {
     //TODO: switch to ValueProviders
 
+    @Description("This Bigtable App Profile id. (Replication alpha feature).")
+    String getBigtableAppProfileId();
+    @SuppressWarnings("unused")
+    void setBigtableAppProfileId(String appProfileId);
+
     @Description("The project that contains the table to export. Defaults to --project.")
     @Default.InstanceFactory(Utils.DefaultBigtableProjectFactory.class)
     String getBigtableProject();
@@ -174,12 +179,16 @@ public class ExportJob {
       scan.setFilter(new ParseFilter().parseFilterString(opts.getBigtableFilter()));
     }
 
-    CloudBigtableScanConfiguration config = new CloudBigtableScanConfiguration.Builder()
+    CloudBigtableScanConfiguration.Builder configBuilder = new CloudBigtableScanConfiguration.Builder()
         .withProjectId(opts.getBigtableProject())
         .withInstanceId(opts.getBigtableInstanceId())
         .withTableId(opts.getBigtableTableId())
-        .withScan(scan)
-        .build();
+        .withScan(scan);
+
+    if (opts.getBigtableAppProfileId() != null) {
+      configBuilder.withAppProfileId(opts.getBigtableAppProfileId());
+    }
+
 
     ValueProvider<ResourceId> dest = NestedValueProvider.of(
         opts.getDestinationPath(), new StringToDirectoryResourceId()
@@ -200,7 +209,7 @@ public class ExportJob {
     Pipeline pipeline = Pipeline.create(Utils.tweakOptions(opts));
 
     pipeline
-        .apply("Read table", Read.from(CloudBigtableIO.read(config)))
+        .apply("Read table", Read.from(CloudBigtableIO.read(configBuilder.build())))
         .apply("Format results", MapElements.via(new ResultToKV()))
         .apply("Write", WriteFiles.to(sink));
 
diff --git a/bigtable-dataflow-parent/bigtable-beam-import/src/main/java/com/google/cloud/bigtable/beam/sequencefiles/ImportJob.java b/bigtable-dataflow-parent/bigtable-beam-import/src/main/java/com/google/cloud/bigtable/beam/sequencefiles/ImportJob.java
index 391b48c3b..41b93ed3d 100644
--- a/bigtable-dataflow-parent/bigtable-beam-import/src/main/java/com/google/cloud/bigtable/beam/sequencefiles/ImportJob.java
+++ b/bigtable-dataflow-parent/bigtable-beam-import/src/main/java/com/google/cloud/bigtable/beam/sequencefiles/ImportJob.java
@@ -40,6 +40,11 @@ public class ImportJob {
   public interface ImportOptions extends GcpOptions {
     //TODO: switch to ValueProviders
 
+    @Description("This Bigtable App Profile id. (Replication alpha feature).")
+    String getBigtableAppProfileId();
+    @SuppressWarnings("unused")
+    void setBigtableAppProfileId(String appProfileId);
+
     @Description("The project that contains the table to export. Defaults to --project.")
     @Default.InstanceFactory(Utils.DefaultBigtableProjectFactory.class)
     String getBigtableProject();
@@ -99,16 +104,19 @@ public class ImportJob {
         100 * 1024 * 1024
     );
 
-    CloudBigtableTableConfiguration config = new CloudBigtableTableConfiguration.Builder()
+    CloudBigtableTableConfiguration.Builder configBuilder = new CloudBigtableTableConfiguration.Builder()
         .withProjectId(opts.getBigtableProject())
         .withInstanceId(opts.getBigtableInstanceId())
-        .withTableId(opts.getBigtableTableId())
-        .build();
+        .withTableId(opts.getBigtableTableId());
+
+    if (opts.getBigtableAppProfileId() != null) {
+      configBuilder.withAppProfileId(opts.getBigtableAppProfileId());
+    }
 
     pipeline
         .apply("Read Sequence File", Read.from(new ShuffledSource<>(source)))
         .apply("Create Mutations", ParDo.of(new HBaseResultToMutationFn()))
-        .apply("Write to Bigtable", CloudBigtableIO.writeToTable(config));
+        .apply("Write to Bigtable", CloudBigtableIO.writeToTable(configBuilder.build()));
 
     return pipeline;
   }
diff --git a/bigtable-dataflow-parent/bigtable-hbase-beam/src/main/java/com/google/cloud/bigtable/beam/CloudBigtableConfiguration.java b/bigtable-dataflow-parent/bigtable-hbase-beam/src/main/java/com/google/cloud/bigtable/beam/CloudBigtableConfiguration.java
index bec293f8a..155681475 100644
--- a/bigtable-dataflow-parent/bigtable-hbase-beam/src/main/java/com/google/cloud/bigtable/beam/CloudBigtableConfiguration.java
+++ b/bigtable-dataflow-parent/bigtable-hbase-beam/src/main/java/com/google/cloud/bigtable/beam/CloudBigtableConfiguration.java
@@ -77,6 +77,19 @@ public class CloudBigtableConfiguration implements Serializable {
       return this;
     }
 
+
+    /**
+     * Specifies the AppProfile to use.
+     *
+     * <p>This is a private alpha release of Cloud Bigtable replication. This feature
+     * is not currently available to most Cloud Bigtable customers. This feature
+     * might be changed in backward-incompatible ways and is not recommended for
+     * production use. It is not subject to any SLA or deprecation policy.
+     */
+    public Builder withAppProfileId(String appProfileId) {
+      return withConfiguration(BigtableOptionsFactory.APP_PROFILE_ID_KEY, appProfileId);
+    }
+
     /**
      * Adds additional connection configuration.
      * {@link BigtableOptionsFactory#fromConfiguration(Configuration)} for more information about
@@ -147,6 +160,13 @@ public class CloudBigtableConfiguration implements Serializable {
     return configuration.get(BigtableOptionsFactory.INSTANCE_ID_KEY);
   }
 
+  /**
+   * Get the Cloud Bigtable App Profile id.
+   */
+  public String getAppProfileId() {
+    return configuration.get(BigtableOptionsFactory.APP_PROFILE_ID_KEY);
+  }
+
   /**
    * Converts the {@link CloudBigtableConfiguration} to a {@link BigtableOptions} object.
    * @return The {@link BigtableOptions} object.
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/pom.xml b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/pom.xml
similarity index 98%
rename from bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/pom.xml
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/pom.xml
index 8ee960a88..560900ad9 100644
--- a/bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/pom.xml
+++ b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/pom.xml
@@ -16,7 +16,7 @@ limitations under the License.
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>bigtable-hbase-parent</artifactId>
+    <artifactId>bigtable-hbase-2.x-parent</artifactId>
     <groupId>com.google.cloud.bigtable</groupId>
     <version>1.1.1-SNAPSHOT</version>
   </parent>
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestGet.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGet.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestGet.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGet.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestGetTable.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGetTable.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestGetTable.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGetTable.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestIncrement.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestIncrement.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestIncrement.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestIncrement.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestListTables.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestListTables.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestListTables.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestListTables.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestPut.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestPut.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestPut.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestPut.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestPutGetDelete.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestPutGetDelete.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestPutGetDelete.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestPutGetDelete.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestSnapshots.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestSnapshots.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestSnapshots.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestSnapshots.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestTimestamp.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTimestamp.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestTimestamp.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTimestamp.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestTruncateTable.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTruncateTable.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestTruncateTable.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTruncateTable.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/async/TestAsyncAdmin.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/async/TestAsyncAdmin.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/async/TestAsyncAdmin.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/async/TestAsyncAdmin.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/resources/hbase-site.xml b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/resources/hbase-site.xml
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/resources/hbase-site.xml
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/resources/hbase-site.xml
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/resources/log4j.properties b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/resources/log4j.properties
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/resources/log4j.properties
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/resources/log4j.properties
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x-shaded/pom.xml b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-shaded/pom.xml
similarity index 99%
rename from bigtable-hbase-parent/bigtable-hbase-2.x-shaded/pom.xml
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-shaded/pom.xml
index 03f4f2dc8..14900f911 100644
--- a/bigtable-hbase-parent/bigtable-hbase-2.x-shaded/pom.xml
+++ b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-shaded/pom.xml
@@ -16,7 +16,7 @@ limitations under the License.
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>bigtable-hbase-parent</artifactId>
+    <artifactId>bigtable-hbase-2.x-parent</artifactId>
     <groupId>com.google.cloud.bigtable</groupId>
     <version>1.1.1-SNAPSHOT</version>
   </parent>
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-shaded/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-shaded/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/pom.xml b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/pom.xml
similarity index 98%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/pom.xml
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/pom.xml
index 897cc51cc..0bd8bb880 100644
--- a/bigtable-hbase-parent/bigtable-hbase-2.x/pom.xml
+++ b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/pom.xml
@@ -19,7 +19,7 @@ limitations under the License.
 
   <parent>
     <groupId>com.google.cloud.bigtable</groupId>
-    <artifactId>bigtable-hbase-parent</artifactId>
+    <artifactId>bigtable-hbase-2.x-parent</artifactId>
     <version>1.1.1-SNAPSHOT</version>
   </parent>
 
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAdmin.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAdmin.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAdmin.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAdmin.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncAdmin.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncAdmin.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncAdmin.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncAdmin.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncBufferedMutator.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncBufferedMutator.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncBufferedMutator.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncBufferedMutator.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTable.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTable.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTable.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTable.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTableBuilderBase.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTableBuilderBase.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTableBuilderBase.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTableBuilderBase.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTableRegionLocator.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTableRegionLocator.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTableRegionLocator.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableAsyncTableRegionLocator.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableConnection.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableConnection.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableConnection.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableConnection.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableTable.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableTable.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableTable.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableTable.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/FutureUtils.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/FutureUtils.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/FutureUtils.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/FutureUtils.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/adapters/admin/TableAdapter2x.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/adapters/admin/TableAdapter2x.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/adapters/admin/TableAdapter2x.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/adapters/admin/TableAdapter2x.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/org/apache/hadoop/hbase/client/BigtableAsyncConnection.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/org/apache/hadoop/hbase/client/BigtableAsyncConnection.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/org/apache/hadoop/hbase/client/BigtableAsyncConnection.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/org/apache/hadoop/hbase/client/BigtableAsyncConnection.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/org/apache/hadoop/hbase/client/BigtableAsyncRegistry.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/org/apache/hadoop/hbase/client/BigtableAsyncRegistry.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/java/org/apache/hadoop/hbase/client/BigtableAsyncRegistry.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/org/apache/hadoop/hbase/client/BigtableAsyncRegistry.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/main/resources/log4j.properties b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/resources/log4j.properties
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/main/resources/log4j.properties
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/resources/log4j.properties
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/ManyThreadDriver.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/ManyThreadDriver.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/ManyThreadDriver.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/ManyThreadDriver.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/RecreateConnectionDriver.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/RecreateConnectionDriver.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/RecreateConnectionDriver.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/RecreateConnectionDriver.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableConnection.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableConnection.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableConnection.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableConnection.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase2_x/FutureUtilsTest.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase2_x/FutureUtilsTest.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase2_x/FutureUtilsTest.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/test/java/com/google/cloud/bigtable/hbase2_x/FutureUtilsTest.java
diff --git a/bigtable-hbase-2.x-parent/pom.xml b/bigtable-hbase-2.x-parent/pom.xml
new file mode 100644
index 000000000..5a20da219
--- /dev/null
+++ b/bigtable-hbase-2.x-parent/pom.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015 Google Inc. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.google.cloud.bigtable</groupId>
+        <artifactId>bigtable-client-parent</artifactId>
+        <version>1.1.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>bigtable-hbase-2.x-parent</artifactId>
+    <packaging>pom</packaging>
+    <name>${project.groupId}:${project.artifactId}</name>
+    <description>
+        This project is a parent project for the hbase 2.x Cloud Bigtable java client projects.
+    </description>
+
+    <modules>
+        <module>bigtable-hbase-2.x</module>
+        <module>bigtable-hbase-2.x-integration-tests</module>
+    </modules>
+
+    <profiles>
+        <profile>
+            <!-- Shading workaround for IDEs:
+                resolve these modules from the local maven repo -->
+            <id>with-shaded</id>
+            <activation>
+                <property>
+                    <name>!skip-shaded</name>
+                </property>
+            </activation>
+            <modules>
+                <module>bigtable-hbase-2.x-shaded</module>
+                <module>bigtable-hbase-2.x-hadoop</module>
+            </modules>
+        </profile>
+        <profile>
+            <id>release</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <configuration>
+                            <windowtitle>HBase + Cloud Bigtable Connector ${project.version} API</windowtitle>
+                            <doctitle>HBase + Cloud Bigtable Connector ${project.version} API</doctitle>
+                            <overview>../overview.html</overview>
+                            <bottom><![CDATA[<br>]]></bottom>
+
+                            <detectLinks />
+                            <links>
+                                <link>https://hbase.apache.org/apidocs/</link>
+                                <link>http://www.grpc.io/grpc-java/javadoc/</link>
+                            </links>
+                        </configuration>
+                    </plugin>
+               </plugins>
+           </build>
+        </profile>
+    </profiles>
+</project>
diff --git a/bigtable-hbase-parent/pom.xml b/bigtable-hbase-parent/pom.xml
index 33465581f..a73bb8532 100644
--- a/bigtable-hbase-parent/pom.xml
+++ b/bigtable-hbase-parent/pom.xml
@@ -33,11 +33,9 @@ limitations under the License.
     <modules>
         <module>bigtable-hbase</module>
         <module>bigtable-hbase-integration-tests-common</module>
-        <module>bigtable-hbase-integration-tests</module>
-        <module>bigtable-hbase-integration-tests-2.x</module>
-        <module>bigtable-hbase-mapreduce</module>
         <module>bigtable-hbase-1.x</module>
-        <module>bigtable-hbase-2.x</module>
+        <module>bigtable-hbase-1.x-integration-tests</module>
+        <module>bigtable-hbase-mapreduce</module>
     </modules>
 
     <profiles>
@@ -53,8 +51,6 @@ limitations under the License.
             <modules>
                 <module>bigtable-hbase-1.x-shaded</module>
                 <module>bigtable-hbase-1.x-hadoop</module>
-                <module>bigtable-hbase-2.x-shaded</module>
-                <module>bigtable-hbase-2.x-hadoop</module>
             </modules>
         </profile>
         <profile>
diff --git a/pom.xml b/pom.xml
index 3ddece72a..923596916 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,6 +38,7 @@ limitations under the License.
     <modules>
         <module>bigtable-client-core-parent</module>
         <module>bigtable-hbase-parent</module>
+        <module>bigtable-hbase-2.x-parent</module>
         <module>bigtable-dataflow-parent</module>
         <module>bigtable-test</module>
     </modules>


Test patch:
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/scanner/RetryingReadRowsOperationTest.java b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/scanner/RetryingReadRowsOperationTest.java
index 1286338eb..359b45274 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/scanner/RetryingReadRowsOperationTest.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/scanner/RetryingReadRowsOperationTest.java
@@ -37,6 +37,7 @@ import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -336,6 +337,25 @@ public class RetryingReadRowsOperationTest {
     performTimeout(underTest, time);
   }
 
+  @SuppressWarnings("unchecked")
+  @Test
+  public void testImmediateOnClose() {
+    Mockito.doAnswer(new Answer<Void>() {
+      @Override
+      public Void answer(InvocationOnMock invocation) throws Throwable {
+        invocation.getArgumentAt(1, ClientCall.Listener.class).onClose(Status.OK, new Metadata());
+        return null;
+      }
+    }).when(mockRetryableRpc).start(any(ReadRowsRequest.class), any(ClientCall.Listener.class),
+      any(Metadata.class), eq(mockClientCall));
+
+    RetryingReadRowsOperation underTest = createOperation(mockFlatRowObserver);
+
+    // The test revolves around this call not throwing an exception.  It did at one point with
+    // an invocation of call.request(1) when call is null.
+    start(underTest);
+  }
+
   protected void performTimeout(RetryingReadRowsOperation underTest, AtomicLong time)
       throws BigtableRetriesExhaustedException {
     time.addAndGet(RETRY_OPTIONS.getReadPartialRowTimeoutMillis() + 1);
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableConnection.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableConnection.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableConnection.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableConnection.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/src/test/resources/log4j.properties b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/src/test/resources/log4j.properties
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x-hadoop/src/test/resources/log4j.properties
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-hadoop/src/test/resources/log4j.properties
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/pom.xml b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/pom.xml
similarity index 93%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/pom.xml
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/pom.xml
index ff8b9152b..219430bb4 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/pom.xml
+++ b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/pom.xml
@@ -19,11 +19,11 @@ limitations under the License.
 
     <parent>
         <groupId>com.google.cloud.bigtable</groupId>
-        <artifactId>bigtable-hbase-parent</artifactId>
+        <artifactId>bigtable-hbase-2.x-parent</artifactId>
         <version>1.1.1-SNAPSHOT</version>
     </parent>
 
-    <artifactId>bigtable-hbase-integration-tests-2.x</artifactId>
+    <artifactId>bigtable-hbase-2.x-integration-tests</artifactId>
     <packaging>jar</packaging>
     <name>${project.groupId}:${project.artifactId}</name>
     <description>
@@ -35,6 +35,8 @@ limitations under the License.
         <google.bigtable.connection.impl>com.google.cloud.bigtable.hbase2_x.BigtableConnection</google.bigtable.connection.impl>
         <google.bigtable.async.connection.impl>org.apache.hadoop.hbase.client.BigtableAsyncConnection</google.bigtable.async.connection.impl>
         <google.bigtable.registry.impl>org.apache.hadoop.hbase.client.BigtableAsyncRegistry</google.bigtable.registry.impl>
+        <test.timeout>1800</test.timeout>
+        <thread.count>10</thread.count>
     </properties>
 
     <profiles>
@@ -60,7 +62,6 @@ limitations under the License.
                                 </goals>
                                 <phase>integration-test</phase>
                                 <configuration>
-                                    <forkCount>1</forkCount>
                                     <includes>
                                         <include>**/IntegrationTestsNoKnownGap.java</include>
                                     </includes>
@@ -71,6 +72,9 @@ limitations under the License.
                                         <google.bigtable.registry.impl>${google.bigtable.registry.impl}</google.bigtable.registry.impl>
                                     </systemPropertyVariables>
                                     <forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
+                                    <forkedProcessTimeoutInSeconds>${test.timeout}</forkedProcessTimeoutInSeconds>
+                                    <parallel>classesAndMethods</parallel>
+                                    <threadCount>${thread.count}</threadCount>
                                 </configuration>
                             </execution>
                         </executions>
@@ -103,7 +107,6 @@ limitations under the License.
                                     <!-- to enable netty logging, include:
                                     -Djava.util.logging.config.file=src/test/resources/logging.properties
                                     -->
-                                    <forkCount>1</forkCount>
                                     <includes>
                                         <include>**/IntegrationTestsGap.java</include>
                                     </includes>
@@ -111,7 +114,9 @@ limitations under the License.
                                     <systemPropertyVariables>
                                         <google.bigtable.connection.impl>${google.bigtable.connection.impl}</google.bigtable.connection.impl>
                                     </systemPropertyVariables>
-                                    <forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
+                                    <forkedProcessTimeoutInSeconds>${test.timeout}</forkedProcessTimeoutInSeconds>
+                                    <parallel>classesAndMethods</parallel>
+                                    <threadCount>${thread.count}</threadCount>
                                 </configuration>
                             </execution>
                         </executions>
@@ -146,7 +151,9 @@ limitations under the License.
                                     </includes>
                                     <trimStackTrace>false</trimStackTrace>
                                     <reportNameSuffix>local-mini-cluster</reportNameSuffix>
-                                    <forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
+                                    <forkedProcessTimeoutInSeconds>${test.timeout}</forkedProcessTimeoutInSeconds>
+                                    <parallel>classesAndMethods</parallel>
+                                    <threadCount>${thread.count}</threadCount>
                                 </configuration>
                             </execution>
                         </executions>
@@ -240,6 +247,9 @@ limitations under the License.
                                         <BIGTABLE_EMULATOR_HOST>${bigtable.emulator.endpoint}</BIGTABLE_EMULATOR_HOST>
                                     </environmentVariables>
                                     <trimStackTrace>false</trimStackTrace>
+                                    <forkedProcessTimeoutInSeconds>${test.timeout}</forkedProcessTimeoutInSeconds>
+                                    <parallel>classesAndMethods</parallel>
+                                    <threadCount>${thread.count}</threadCount>
                                 </configuration>
                             </execution>
                         </executions>
diff --git a/bigtable-hbase-parent/bigtable-hbase-2.x-shaded/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-2.x-shaded/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/EmulatorTests.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/EmulatorTests.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/EmulatorTests.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/EmulatorTests.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
similarity index 99%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
index dc11df719..dc8e09265 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
+++ b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
@@ -53,7 +53,6 @@ import org.junit.runners.Suite;
     TestPut.class,
     TestTimestamp.class,
     TestTruncateTable.class,
-    TestImport.class,
     TestAsyncAdmin.class
 })
 public class IntegrationTests {
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsGap.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsGap.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsGap.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsGap.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsNoKnownGap.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsNoKnownGap.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsNoKnownGap.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsNoKnownGap.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/SimpleIntegrationTests.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/SimpleIntegrationTests.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/SimpleIntegrationTests.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/SimpleIntegrationTests.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestAppend.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestAppend.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestAppend.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestAppend.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
similarity index 94%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
index a317f3723..d59585b28 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
+++ b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
@@ -17,8 +17,6 @@ package com.google.cloud.bigtable.hbase;
 
 import static com.google.cloud.bigtable.hbase.test_env.SharedTestEnvRule.COLUMN_FAMILY;
 
-import com.google.common.base.Stopwatch;
-
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.client.Delete;
@@ -196,18 +194,18 @@ public class TestBasicOps extends AbstractTest {
     testPutGetDelete(doGet, testRowKey, testQualifier, testValue);
   }
 
+
   private void
       testPutGetDelete(boolean doGet, byte[] rowKey, byte[] testQualifier, byte[] testValue)
           throws IOException {
     Table table = getDefaultTable();
 
     Stopwatch stopwatch = new Stopwatch();
-    stopwatch.start();
     // Put
     Put put = new Put(rowKey);
     put.addColumn(COLUMN_FAMILY, testQualifier, testValue);
     table.put(put);
-    print("Put took %d ms", stopwatch);
+    stopwatch.print("Put took %d ms");
 
     // Get
     Get get = new Get(rowKey);
@@ -217,31 +215,34 @@ public class TestBasicOps extends AbstractTest {
     // testing on large values.
     if (doGet) {
       Result result = table.get(get);
-      print("Get took %d ms", stopwatch);
+      stopwatch.print("Get took %d ms");
       Assert.assertTrue(result.containsColumn(COLUMN_FAMILY, testQualifier));
       List<Cell> cells = result.getColumnCells(COLUMN_FAMILY, testQualifier);
       Assert.assertEquals(1, cells.size());
       Assert.assertTrue(Arrays.equals(testValue, CellUtil.cloneValue(cells.get(0))));
-      print("Verifying took %d ms", stopwatch);
+      stopwatch.print("Verifying took %d ms");
     }
     // Delete
     Delete delete = new Delete(rowKey);
     delete.addColumns(COLUMN_FAMILY, testQualifier);
     table.delete(delete);
-    print("Delete took %d ms", stopwatch);
+    stopwatch.print("Delete took %d ms");
 
     // Confirm deleted
     Assert.assertFalse(table.exists(get));
-    print("Exists took %d ms", stopwatch);
-    stopwatch.reset();
+    stopwatch.print("Exists took %d ms");
     table.close();
 
-    print("close took %d ms", stopwatch);
+    stopwatch.print("close took %d ms");
   }
 
-  private void print(String string, Stopwatch stopwatch) {
-    logger.info(string, stopwatch.elapsedMillis());
-    stopwatch.reset();
-    stopwatch.start();
+  private class Stopwatch {
+    long lastCheckin = System.currentTimeMillis();
+
+    private void print(String string) {
+      long now = System.currentTimeMillis();
+      logger.info(string, now - lastCheckin);
+      lastCheckin = now;
+    }
   }
 }
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBatch.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBatch.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBatch.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBatch.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBufferedMutator.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBufferedMutator.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestBufferedMutator.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBufferedMutator.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestCheckAndMutate.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCheckAndMutate.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestCheckAndMutate.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCheckAndMutate.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestColumnFamilyAdmin.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestColumnFamilyAdmin.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestColumnFamilyAdmin.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestColumnFamilyAdmin.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestCreateTable.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCreateTable.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestCreateTable.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCreateTable.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestDelete.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestDelete.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestDelete.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestDelete.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
similarity index 99%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
rename to bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
index df448c0ad..de64a6857 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
+++ b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
@@ -1716,9 +1716,10 @@ public class TestFilters extends AbstractTest {
       Assert.assertArrayEquals(rowKeys[i+1], boundedResults[i].getRow());
     }
   }
+
   @Test
   public void testMultiRangeFilter() throws IOException {
-    String prefix = "testMultiRangeFilter";
+    String prefix = "testMultiRangeFilter_";
     int rowCount = 10;
     byte[][] rowKeys = dataHelper.randomData(prefix, rowCount);
     Arrays.sort(rowKeys, Bytes.BYTES_COMPARATOR);
@@ -1752,9 +1753,8 @@ public class TestFilters extends AbstractTest {
   }
 
   @Test
-  @Category(KnownGap.class)
   public void testMultiRangeFilterOrList() throws IOException {
-    String prefix = "testMultiRangeFilterOrList";
+    String prefix = "testMultiRangeFilterOrList_";
     int rowCount = 10;
     byte[][] rowKeys = dataHelper.randomData(prefix, rowCount);
     Arrays.sort(rowKeys, Bytes.BYTES_COMPARATOR);
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/pom.xml b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/pom.xml
similarity index 95%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/pom.xml
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/pom.xml
index 64a749c9e..b6dcecccb 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests/pom.xml
+++ b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/pom.xml
@@ -23,7 +23,7 @@ limitations under the License.
         <version>1.1.1-SNAPSHOT</version>
     </parent>
 
-    <artifactId>bigtable-hbase-integration-tests</artifactId>
+    <artifactId>bigtable-hbase-1.x-integration-tests</artifactId>
     <packaging>jar</packaging>
     <name>${project.groupId}:${project.artifactId}</name>
     <description>
@@ -33,6 +33,7 @@ limitations under the License.
     <properties>
         <google.bigtable.connection.impl>com.google.cloud.bigtable.hbase1_x.BigtableConnection</google.bigtable.connection.impl>
         <test.timeout>1800</test.timeout>
+        <thread.count>10</thread.count>
     </properties>
 
     <profiles>
@@ -67,6 +68,8 @@ limitations under the License.
                                         <google.bigtable.connection.impl>${google.bigtable.connection.impl}</google.bigtable.connection.impl>
                                     </systemPropertyVariables>
                                     <forkedProcessTimeoutInSeconds>${test.timeout}</forkedProcessTimeoutInSeconds>
+                                    <parallel>classesAndMethods</parallel>
+                                    <threadCount>${thread.count}</threadCount>
                                 </configuration>
                             </execution>
                         </executions>
@@ -109,6 +112,8 @@ limitations under the License.
                                     </systemPropertyVariables>
                                     <forkedProcessTimeoutInSeconds>${test.timeout}</forkedProcessTimeoutInSeconds>
                                     <trimStackTrace>false</trimStackTrace>
+                                    <parallel>classesAndMethods</parallel>
+                                    <threadCount>${thread.count}</threadCount>
                                 </configuration>
                             </execution>
                         </executions>
@@ -145,6 +150,8 @@ limitations under the License.
                                     <reportNameSuffix>local-mini-cluster</reportNameSuffix>
                                     <forkedProcessTimeoutInSeconds>${test.timeout}</forkedProcessTimeoutInSeconds>
                                     <trimStackTrace>false</trimStackTrace>
+                                    <parallel>classesAndMethods</parallel>
+                                    <threadCount>${thread.count}</threadCount>
                                 </configuration>
                             </execution>
                         </executions>
@@ -238,6 +245,8 @@ limitations under the License.
                                         <BIGTABLE_EMULATOR_HOST>${bigtable.emulator.endpoint}</BIGTABLE_EMULATOR_HOST>
                                     </environmentVariables>
                                     <trimStackTrace>false</trimStackTrace>
+                                    <parallel>classesAndMethods</parallel>
+                                    <threadCount>${thread.count}</threadCount>
                                 </configuration>
                             </execution>
                         </executions>
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/main/java/com/google/cloud/bigtable/hbase/MavenPlaceholder.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/EmulatorTests.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/EmulatorTests.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/EmulatorTests.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/EmulatorTests.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
similarity index 98%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
index d850a8d46..c1186e6dd 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
+++ b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTests.java
@@ -51,8 +51,7 @@ import org.junit.runners.Suite;
     TestListTables.class,
     TestPut.class,
     TestTimestamp.class,
-    TestTruncateTable.class,
-    TestImport.class
+    TestTruncateTable.class
 })
 public class IntegrationTests {
 
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsGap.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsGap.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsGap.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsGap.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsNoKnownGap.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsNoKnownGap.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsNoKnownGap.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/IntegrationTestsNoKnownGap.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/SimpleIntegrationTests.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/SimpleIntegrationTests.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/SimpleIntegrationTests.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/SimpleIntegrationTests.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestAppend.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestAppend.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestAppend.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestAppend.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
similarity index 94%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
index 8c0f8b047..6f5943540 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
+++ b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBasicOps.java
@@ -17,8 +17,6 @@ package com.google.cloud.bigtable.hbase;
 
 import static com.google.cloud.bigtable.hbase.test_env.SharedTestEnvRule.COLUMN_FAMILY;
 
-import com.google.common.base.Stopwatch;
-
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.client.Delete;
@@ -201,12 +199,11 @@ public class TestBasicOps extends AbstractTest {
     Table table = getDefaultTable();
 
     Stopwatch stopwatch = new Stopwatch();
-    stopwatch.start();
     // Put
     Put put = new Put(rowKey);
     put.addColumn(COLUMN_FAMILY, testQualifier, testValue);
     table.put(put);
-    print("Put took %d ms", stopwatch);
+    stopwatch.print("Put took %d ms");
 
     // Get
     Get get = new Get(rowKey);
@@ -216,31 +213,34 @@ public class TestBasicOps extends AbstractTest {
     // testing on large values.
     if (doGet) {
       Result result = table.get(get);
-      print("Get took %d ms", stopwatch);
+      stopwatch.print("Get took %d ms");
       Assert.assertTrue(result.containsColumn(COLUMN_FAMILY, testQualifier));
       List<Cell> cells = result.getColumnCells(COLUMN_FAMILY, testQualifier);
       Assert.assertEquals(1, cells.size());
       Assert.assertTrue(Arrays.equals(testValue, CellUtil.cloneValue(cells.get(0))));
-      print("Verifying took %d ms", stopwatch);
+      stopwatch.print("Verifying took %d ms");
     }
     // Delete
     Delete delete = new Delete(rowKey);
     delete.addColumns(COLUMN_FAMILY, testQualifier);
     table.delete(delete);
-    print("Delete took %d ms", stopwatch);
+    stopwatch.print("Delete took %d ms");
 
     // Confirm deleted
     Assert.assertFalse(table.exists(get));
-    print("Exists took %d ms", stopwatch);
-    stopwatch.reset();
+    stopwatch.print("Exists took %d ms");
     table.close();
 
-    print("close took %d ms", stopwatch);
+    stopwatch.print("close took %d ms");
   }
 
-  private void print(String string, Stopwatch stopwatch) {
-    logger.info(string, stopwatch.elapsedMillis());
-    stopwatch.reset();
-    stopwatch.start();
+  private class Stopwatch {
+    long lastCheckin = System.currentTimeMillis();
+
+    private void print(String string) {
+      long now = System.currentTimeMillis();
+      logger.info(string, now - lastCheckin);
+      lastCheckin = now;
+    }
   }
 }
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBatch.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBatch.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBatch.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBatch.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBufferedMutator.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBufferedMutator.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBufferedMutator.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestBufferedMutator.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCheckAndMutate.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCheckAndMutate.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCheckAndMutate.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCheckAndMutate.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestColumnFamilyAdmin.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestColumnFamilyAdmin.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestColumnFamilyAdmin.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestColumnFamilyAdmin.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCreateTable.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCreateTable.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCreateTable.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestCreateTable.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestDelete.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestDelete.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestDelete.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestDelete.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
similarity index 99%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
index 94270d121..6c83e72a5 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
+++ b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestFilters.java
@@ -1717,9 +1717,10 @@ public class TestFilters extends AbstractTest {
       Assert.assertArrayEquals(rowKeys[i+1], boundedResults[i].getRow());
     }
   }
+
   @Test
   public void testMultiRangeFilter() throws IOException {
-    String prefix = "testMultiRangeFilter";
+    String prefix = "testMultiRangeFilter_";
     int rowCount = 10;
     byte[][] rowKeys = dataHelper.randomData(prefix, rowCount);
     Arrays.sort(rowKeys, Bytes.BYTES_COMPARATOR);
@@ -1753,9 +1754,8 @@ public class TestFilters extends AbstractTest {
   }
 
   @Test
-  @Category(KnownGap.class)
   public void testMultiRangeFilterOrList() throws IOException {
-    String prefix = "testMultiRangeFilterOrList";
+    String prefix = "testMultiRangeFilterOrList_";
     int rowCount = 10;
     byte[][] rowKeys = dataHelper.randomData(prefix, rowCount);
     Arrays.sort(rowKeys, Bytes.BYTES_COMPARATOR);
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGet.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGet.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGet.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGet.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGetTable.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGetTable.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGetTable.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestGetTable.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestIncrement.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestIncrement.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestIncrement.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestIncrement.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestListTables.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestListTables.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestListTables.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestListTables.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestPut.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestPut.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestPut.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestPut.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestSnapshots.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestSnapshots.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestSnapshots.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestSnapshots.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTimestamp.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTimestamp.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTimestamp.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTimestamp.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTruncateTable.java b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTruncateTable.java
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTruncateTable.java
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestTruncateTable.java
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/resources/hbase-site.xml b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/resources/hbase-site.xml
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/resources/hbase-site.xml
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/resources/hbase-site.xml
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/resources/log4j.properties b/bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/resources/log4j.properties
similarity index 100%
rename from bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/resources/log4j.properties
rename to bigtable-hbase-parent/bigtable-hbase-1.x-integration-tests/src/test/resources/log4j.properties
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestImport.java b/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestImport.java
deleted file mode 100644
index 7d0c3a22e..000000000
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests-2.x/src/test/java/com/google/cloud/bigtable/hbase/TestImport.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.cloud.bigtable.hbase;
-
-import com.google.cloud.bigtable.hbase.test_env.SharedTestEnvRule;
-import com.google.common.io.Files;
-import java.io.File;
-import org.apache.commons.io.FileUtils;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.mapreduce.Export;
-import org.apache.hadoop.hbase.mapreduce.Import;
-import org.apache.hadoop.mapreduce.Job;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class TestImport extends AbstractTest {
-  private File baseDir;
-  private List<TableName> tablesToDelete = new ArrayList<>();
-
-  @Before
-  public void setup() {
-    baseDir = Files.createTempDir();
-  }
-  @After
-  public void teardown() throws IOException {
-    try (Admin admin = getConnection().getAdmin()) {
-      for (TableName tableName : tablesToDelete) {
-        admin.disableTable(tableName);
-        admin.deleteTable(tableName);
-      }
-    }
-    FileUtils.deleteDirectory(baseDir);
-  }
-
-  @Test
-  @Category(KnownGap.class)
-  public void testMapReduce() throws IOException, ClassNotFoundException, InterruptedException {
-    Admin admin = getConnection().getAdmin();
-
-    TableName tableName = sharedTestEnv.newTestTableName();
-    tablesToDelete.add(tableName);
-    sharedTestEnv.createTable(tableName);
-    // Put a value.
-    byte[] rowKey = dataHelper.randomData("testrow-");
-    byte[] qual = dataHelper.randomData("testQualifier-");
-    byte[] value = dataHelper.randomData("testValue-");
-
-    try (Table oldTable = getConnection().getTable(tableName)){
-      Put put = new Put(rowKey);
-      put.addColumn(SharedTestEnvRule.COLUMN_FAMILY, qual, value);
-      oldTable.put(put);
-
-      // Assert the value is there.
-      Get get = new Get(rowKey);
-      Result result = oldTable.get(get);
-      List<Cell> cells = result.listCells();
-      Assert.assertEquals(1, cells.size());
-      Assert.assertArrayEquals(CellUtil.cloneValue(cells.get(0)), value);
-    }
-
-    // Run the export.
-    Configuration conf = new Configuration(getConnection().getConfiguration());
-    String outputDir = baseDir.getAbsolutePath() + "/output";
-
-
-    String[] args = new String[]{
-        tableName.getNameAsString(),
-        outputDir
-    };
-    Job job = Export.createSubmittableJob(conf, args);
-    Assert.assertTrue(job.waitForCompletion(true));
-
-    // Create new table.
-    TableName newTableName = sharedTestEnv.newTestTableName();
-    tablesToDelete.add(newTableName);
-    try (Table newTable = getConnection().getTable(newTableName)){
-      // Change for method in IntegrationTests
-      HColumnDescriptor hcd = new HColumnDescriptor(SharedTestEnvRule.COLUMN_FAMILY);
-      HTableDescriptor htd = new HTableDescriptor(newTableName);
-      htd.addFamily(hcd);
-      admin.createTable(htd);
-
-      // Run the import.
-      args = new String[]{
-          newTableName.getNameAsString(),
-          outputDir
-      };
-      job = Import.createSubmittableJob(conf, args);
-      Assert.assertTrue(job.waitForCompletion(true));
-
-      // Assert the value is there.
-      Get get = new Get(rowKey);
-      Result result = newTable.get(get);
-      List<Cell> cells = result.listCells();
-      Assert.assertEquals(1, cells.size());
-      Assert.assertArrayEquals(CellUtil.cloneValue(cells.get(0)), value);
-    }
-  }
-}
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/pom.xml b/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/pom.xml
index be2daeccb..60d98304c 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/pom.xml
+++ b/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/pom.xml
@@ -30,11 +30,6 @@ limitations under the License.
     </description>
 
     <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>bigtable-hbase-1.x-hadoop</artifactId>
-            <version>${project.version}</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.hbase</groupId>
             <artifactId>hbase-client</artifactId>
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/AbstractTest.java b/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/AbstractTest.java
index be0730a64..d0fdfb615 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/AbstractTest.java
+++ b/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/AbstractTest.java
@@ -24,7 +24,6 @@ import org.junit.Rule;
 import org.junit.rules.TestWatcher;
 import org.junit.runner.Description;
 
-import com.google.bigtable.repackaged.com.google.cloud.bigtable.config.Logger;
 import com.google.cloud.bigtable.hbase.test_env.SharedTestEnvRule;
 
 public abstract class AbstractTest {
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/Logger.java b/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/Logger.java
new file mode 100644
index 000000000..5ad615ea7
--- /dev/null
+++ b/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/Logger.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.cloud.bigtable.hbase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Wrapper around {@link org.apache.commons.logging.Log} to conditionally format
+ * messages if a specified log level is enabled.
+ *
+ * @author sduskis
+ * @version $Id: $Id
+ */
+public class Logger {
+  protected final Log log;
+
+  /**
+   * <p>Constructor for Logger.</p>
+   *
+   * @param logClass a {@link java.lang.Class} object.
+   */
+  public Logger(Class<?> logClass) {
+    this.log = LogFactory.getLog(logClass);
+  }
+
+  /**
+   * <p>trace</p>
+   *
+   * @see Log#trace
+   * @param message Format string.
+   * @param args Arguments for format string.
+   */
+  public void trace(String message, Object ... args) {
+    if (log.isTraceEnabled()) {
+      log.trace(String.format(message, args));
+    }
+  }
+
+  /**
+   * <p>debug</p>
+   *
+   * @see Log#debug
+   * @param message Format string.
+   * @param args Arguments for format string.
+   */
+  public void debug(String message, Object ... args) {
+    if (log.isDebugEnabled()) {
+      log.debug(String.format(message, args));
+    }
+  }
+
+  /**
+   * <p>debug</p>
+   *
+   * @see Log#debug
+   * @param message Format string.
+   * @param t a {@link java.lang.Throwable} object.
+   * @param args Arguments for format string.
+   */
+  public void debug(String message, Throwable t, Object ... args) {
+    if (log.isDebugEnabled()) {
+      log.debug(String.format(message, args), t);
+    }
+  }
+
+  /**
+   * <p>info</p>
+   *
+   * @see Log#info
+   * @param message Format string.
+   * @param args Arguments for format string.
+   */
+  public void info(String message, Object ... args) {
+    if (log.isInfoEnabled()) {
+      log.info(String.format(message, args));
+    }
+  }
+
+  /**
+   * <p>info</p>
+   *
+   * @see Log#info
+   * @param message Format string.
+   * @param t a {@link java.lang.Throwable} object.
+   * @param args Arguments for format string.
+   */
+  public void info(String message, Throwable t, Object ... args) {
+    if (log.isInfoEnabled()) {
+      log.info(String.format(message, args), t);
+    }
+  }
+
+  /**
+   * <p>warn</p>
+   *
+   * @see Log#warn
+   * @param message Format string.
+   * @param args Arguments for format string.
+   */
+  public void warn(String message, Object ... args) {
+    if (log.isWarnEnabled()) {
+      log.warn(String.format(message, args));
+    }
+  }
+
+  /**
+   * <p>warn</p>
+   *
+   * @see Log#warn
+   * @param message Format string.
+   * @param t a {@link java.lang.Throwable} object.
+   * @param args Arguments for format string.
+   */
+  public void warn(String message, Throwable t, Object ... args) {
+    if (log.isWarnEnabled()) {
+      log.warn(String.format(message, args), t);
+    }
+  }
+
+  /**
+   * <p>error</p>
+   *
+   * @see Log#error
+   * @param message Format string.
+   * @param args Arguments for format string.
+   */
+  public void error(String message, Object ... args) {
+    if (log.isErrorEnabled()) {
+      log.error(String.format(message, args));
+    }
+  }
+
+  /**
+   * <p>error</p>
+   *
+   * @see Log#error
+   * @param message Format string.
+   * @param t a {@link java.lang.Throwable} object.
+   * @param args Arguments for format string.
+   */
+  public void error(String message, Throwable t, Object ... args) {
+    if (log.isErrorEnabled()) {
+      log.error(String.format(message, args), t);
+    }
+  }
+
+  /**
+   * <p>fatal</p>
+   *
+   * @see Log#fatal
+   * @param message a {@link java.lang.String} object.
+   * @param args a {@link java.lang.Object} object.
+   */
+  public void fatal(String message, Object ... args) {
+    if (log.isFatalEnabled()) {
+      log.fatal(String.format(message, args));
+    }
+  }
+
+  /**
+   * <p>fatal</p>
+   *
+   * @see Log#fatal
+   * @param message Format string.
+   * @param t a {@link java.lang.Throwable} object.
+   * @param args Arguments for format string.
+   */
+  public void fatal(String message, Throwable t, Object ... args) {
+    if (log.isFatalEnabled()) {
+      log.fatal(String.format(message, args), t);
+    }
+  }
+}
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/test_env/BigtableEnv.java b/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/test_env/BigtableEnv.java
index 4fe228e2c..b2b38b640 100644
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/test_env/BigtableEnv.java
+++ b/bigtable-hbase-parent/bigtable-hbase-integration-tests-common/src/main/java/com/google/cloud/bigtable/hbase/test_env/BigtableEnv.java
@@ -27,12 +27,11 @@ import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.client.Connection;
+import org.apache.hadoop.hbase.client.ConnectionFactory;
 
-import com.google.bigtable.repackaged.com.google.cloud.bigtable.config.Logger;
-import com.google.bigtable.repackaged.io.grpc.internal.GrpcUtil;
-import com.google.cloud.bigtable.hbase.BigtableConfiguration;
-import com.google.cloud.bigtable.hbase.BigtableOptionsFactory;
+import com.google.cloud.bigtable.hbase.Logger;
 import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
 class BigtableEnv extends SharedTestEnv {
   private final Logger LOG = new Logger(getClass());
@@ -41,15 +40,15 @@ class BigtableEnv extends SharedTestEnv {
       "hbase.client.connection.impl",
       "hbase.client.async.connection.impl",
       "hbase.client.registry.impl",
-      BigtableOptionsFactory.BIGTABLE_PORT_KEY,
-      BigtableOptionsFactory.BIGTABLE_HOST_KEY,
-      BigtableOptionsFactory.BIGTABLE_ADMIN_HOST_KEY,
-      BigtableOptionsFactory.BIGTABLE_EMULATOR_HOST_KEY,
-      BigtableOptionsFactory.PROJECT_ID_KEY,
-      BigtableOptionsFactory.INSTANCE_ID_KEY,
-      BigtableOptionsFactory.BIGTABLE_USE_BULK_API,
-      BigtableOptionsFactory.BIGTABLE_USE_PLAINTEXT_NEGOTIATION,
-      BigtableOptionsFactory.BIGTABLE_SNAPSHOT_CLUSTER_ID_KEY
+      "google.bigtable.endpoint.port",
+      "google.bigtable.endpoint.host",
+      "google.bigtable.admin.endpoint.host",
+      "google.bigtable.emulator.endpoint.host",
+      "google.bigtable.project.id",
+      "google.bigtable.instance.id",
+      "google.bigtable.use.bulk.api",
+      "google.bigtable.use.plaintext.negotiation",
+      "google.bigtable.snapshot.cluster.id"
   );
 
   @Override
@@ -77,8 +76,9 @@ class BigtableEnv extends SharedTestEnv {
       }
     }
 
-    ExecutorService executor = Executors.newCachedThreadPool(GrpcUtil.getThreadFactory("table_deleter", true));
-    try (Connection connection = BigtableConfiguration.connect(configuration);
+    ExecutorService executor = Executors.newCachedThreadPool(
+      new ThreadFactoryBuilder().setDaemon(true).setNameFormat("table-deleter").build());
+    try (Connection connection = ConnectionFactory.createConnection(configuration);
         Admin admin = connection.getAdmin()) {
       for (final TableName tableName : admin
           .listTableNames(Pattern.compile("(test_table|list_table[12]|TestTable).*"))) {
diff --git a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestImport.java b/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestImport.java
deleted file mode 100644
index 7d0c3a22e..000000000
--- a/bigtable-hbase-parent/bigtable-hbase-integration-tests/src/test/java/com/google/cloud/bigtable/hbase/TestImport.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.cloud.bigtable.hbase;
-
-import com.google.cloud.bigtable.hbase.test_env.SharedTestEnvRule;
-import com.google.common.io.Files;
-import java.io.File;
-import org.apache.commons.io.FileUtils;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.mapreduce.Export;
-import org.apache.hadoop.hbase.mapreduce.Import;
-import org.apache.hadoop.mapreduce.Job;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class TestImport extends AbstractTest {
-  private File baseDir;
-  private List<TableName> tablesToDelete = new ArrayList<>();
-
-  @Before
-  public void setup() {
-    baseDir = Files.createTempDir();
-  }
-  @After
-  public void teardown() throws IOException {
-    try (Admin admin = getConnection().getAdmin()) {
-      for (TableName tableName : tablesToDelete) {
-        admin.disableTable(tableName);
-        admin.deleteTable(tableName);
-      }
-    }
-    FileUtils.deleteDirectory(baseDir);
-  }
-
-  @Test
-  @Category(KnownGap.class)
-  public void testMapReduce() throws IOException, ClassNotFoundException, InterruptedException {
-    Admin admin = getConnection().getAdmin();
-
-    TableName tableName = sharedTestEnv.newTestTableName();
-    tablesToDelete.add(tableName);
-    sharedTestEnv.createTable(tableName);
-    // Put a value.
-    byte[] rowKey = dataHelper.randomData("testrow-");
-    byte[] qual = dataHelper.randomData("testQualifier-");
-    byte[] value = dataHelper.randomData("testValue-");
-
-    try (Table oldTable = getConnection().getTable(tableName)){
-      Put put = new Put(rowKey);
-      put.addColumn(SharedTestEnvRule.COLUMN_FAMILY, qual, value);
-      oldTable.put(put);
-
-      // Assert the value is there.
-      Get get = new Get(rowKey);
-      Result result = oldTable.get(get);
-      List<Cell> cells = result.listCells();
-      Assert.assertEquals(1, cells.size());
-      Assert.assertArrayEquals(CellUtil.cloneValue(cells.get(0)), value);
-    }
-
-    // Run the export.
-    Configuration conf = new Configuration(getConnection().getConfiguration());
-    String outputDir = baseDir.getAbsolutePath() + "/output";
-
-
-    String[] args = new String[]{
-        tableName.getNameAsString(),
-        outputDir
-    };
-    Job job = Export.createSubmittableJob(conf, args);
-    Assert.assertTrue(job.waitForCompletion(true));
-
-    // Create new table.
-    TableName newTableName = sharedTestEnv.newTestTableName();
-    tablesToDelete.add(newTableName);
-    try (Table newTable = getConnection().getTable(newTableName)){
-      // Change for method in IntegrationTests
-      HColumnDescriptor hcd = new HColumnDescriptor(SharedTestEnvRule.COLUMN_FAMILY);
-      HTableDescriptor htd = new HTableDescriptor(newTableName);
-      htd.addFamily(hcd);
-      admin.createTable(htd);
-
-      // Run the import.
-      args = new String[]{
-          newTableName.getNameAsString(),
-          outputDir
-      };
-      job = Import.createSubmittableJob(conf, args);
-      Assert.assertTrue(job.waitForCompletion(true));
-
-      // Assert the value is there.
-      Get get = new Get(rowKey);
-      Result result = newTable.get(get);
-      List<Cell> cells = result.listCells();
-      Assert.assertEquals(1, cells.size());
-      Assert.assertArrayEquals(CellUtil.cloneValue(cells.get(0)), value);
-    }
-  }
-}