Repository: GoogleCloudPlatform/cloud-bigtable-client
Pull request #2091 (2019-02-11 13:34:37)

Cleanup non-wrapper references

sduskis: @igorbernstein2, all issues were addressed.  PTAL.

Patch:
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataClient.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataClient.java
index 9bd3345bd..9cdc0a9bf 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataClient.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataClient.java
@@ -42,6 +42,7 @@ import io.grpc.stub.StreamObserver;
  * @author sduskis
  * @version $Id: $Id
  */
+// TODO: rename this class to differentiate it from `BigtableDataClient` amd `IBigtableDataClient`
 public interface BigtableDataClient {
 
   /**
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataClientWrapper.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataClientWrapper.java
index c40823e8b..ca5d39de2 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataClientWrapper.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataClientWrapper.java
@@ -22,7 +22,6 @@ import com.google.bigtable.v2.MutateRowResponse;
 import com.google.bigtable.v2.ReadModifyWriteRowResponse;
 import com.google.bigtable.v2.SampleRowKeysRequest;
 import com.google.bigtable.v2.SampleRowKeysResponse;
-import com.google.cloud.bigtable.config.BigtableOptions;
 import com.google.cloud.bigtable.core.IBigtableDataClient;
 import com.google.cloud.bigtable.core.IBulkMutation;
 import com.google.cloud.bigtable.data.v2.internal.NameUtil;
@@ -60,10 +59,9 @@ public class BigtableDataClientWrapper implements IBigtableDataClient {
   private final RequestContext requestContext;
 
   public BigtableDataClientWrapper(BigtableDataClient bigtableDataClient,
-      BigtableOptions options) {
+      RequestContext requestContext) {
     this.delegate = bigtableDataClient;
-    this.requestContext = RequestContext.create(options.getProjectId(), options.getInstanceId(),
-        options.getAppProfileId());
+    this.requestContext = requestContext;
   }
 
   /** {@inheritDoc} */
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataGrpcClient.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataGrpcClient.java
index a8ec3fee3..ca67b987d 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataGrpcClient.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableDataGrpcClient.java
@@ -28,7 +28,6 @@ import io.grpc.stub.StreamObserver;
 
 import java.io.IOException;
 import java.util.List;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import javax.annotation.Nullable;
 import com.google.bigtable.v2.BigtableGrpc;
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableSession.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableSession.java
index 8d396f2a4..04cd4c20a 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableSession.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/BigtableSession.java
@@ -156,8 +156,7 @@ public class BigtableSession implements Closeable {
 
   private Watchdog watchdog;
   private final BigtableDataClient dataClient;
-
-  private final IBigtableDataClient clientWrapper;
+  private final RequestContext dataRequestContext;
 
   // This BigtableDataClient has an additional throttling interceptor, which is not recommended for
   // synchronous operations.
@@ -199,6 +198,8 @@ public class BigtableSession implements Closeable {
         options.getAdminHost());
     LOG.info("Bigtable options: %s.", options);
 
+    this.dataRequestContext = RequestContext
+        .create(options.getProjectId(), options.getInstanceId(), options.getAppProfileId());
     List<ClientInterceptor> clientInterceptorsList = new ArrayList<>();
     clientInterceptorsList
         .add(new GoogleCloudResourcePrefixInterceptor(options.getInstanceName().toString()));
@@ -233,8 +234,6 @@ public class BigtableSession implements Closeable {
         new BigtableDataGrpcClient(dataChannel, sharedPools.getRetryExecutor(), options);
     dataClient.setCallOptionsFactory(callOptionsFactory);
 
-    this.clientWrapper = new BigtableDataClientWrapper(dataClient, options);
-
     // Async operations can run amok, so they need to have some throttling. The throttling is
     // achieved through a ThrottlingClientInterceptor.  gRPC wraps ClientInterceptors in Channels,
     // and since a new Channel is needed, a new BigtableDataGrpcClient instance is needed as well.
@@ -250,7 +249,7 @@ public class BigtableSession implements Closeable {
     BigtableClientMetrics.counter(MetricLevel.Info, "sessions.active").inc();
 
     // Defer the creation of both the tableAdminClient until we need them.
-    }
+  }
 
   private ManagedChannel getDataChannelPool() throws IOException {
     String host = options.getDataHost();
@@ -314,7 +313,7 @@ public class BigtableSession implements Closeable {
    * transition to {@link #getClientWrapper()}.
    */
   public RequestContext getDataRequestContext() {
-    return RequestContext.create(options.getProjectId(), options.getInstanceId(), options.getAppProfileId());
+    return dataRequestContext;
   }
 
   /**
@@ -323,7 +322,7 @@ public class BigtableSession implements Closeable {
    * @return a {@link IBigtableDataClient} object.
    */
   public IBigtableDataClient getClientWrapper() {
-    return clientWrapper;
+    return new BigtableDataClientWrapper(dataClient, getDataRequestContext());
   }
 
   /**
@@ -336,6 +335,7 @@ public class BigtableSession implements Closeable {
     return new BulkMutation(
         tableName,
         throttlingDataClient,
+        new BigtableDataClientWrapper(throttlingDataClient, getDataRequestContext()),
         BigtableSessionSharedThreadPools.getInstance().getRetryExecutor(),
         options.getBulkOptions());
   }
@@ -347,7 +347,8 @@ public class BigtableSession implements Closeable {
    * @return a {@link com.google.cloud.bigtable.grpc.async.BulkRead} object.
    */
   public BulkRead createBulkRead(BigtableTableName tableName) {
-    return new BulkRead(clientWrapper, tableName, options.getBulkOptions().getBulkMaxRowKeyCount(),
+    return new BulkRead(getClientWrapper(), tableName,
+        options.getBulkOptions().getBulkMaxRowKeyCount(),
         BigtableSessionSharedThreadPools.getInstance().getBatchThreadPool()
     );
   }
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/CallOptionsFactory.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/CallOptionsFactory.java
index 2409a28f6..7a02aaaf0 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/CallOptionsFactory.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/CallOptionsFactory.java
@@ -17,7 +17,6 @@ package com.google.cloud.bigtable.grpc;
 
 import java.util.concurrent.TimeUnit;
 
-import com.google.bigtable.v2.BigtableGrpc;
 import com.google.bigtable.v2.MutateRowsRequest;
 import com.google.bigtable.v2.ReadRowsRequest;
 import com.google.bigtable.v2.RowSet;
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/BulkMutation.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/BulkMutation.java
index 8c0c8def2..fa8396895 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/BulkMutation.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/BulkMutation.java
@@ -16,8 +16,9 @@
  */
 package com.google.cloud.bigtable.grpc.async;
 
-import com.google.bigtable.v2.ReadModifyWriteRowRequest;
-import com.google.bigtable.v2.ReadModifyWriteRowResponse;
+import com.google.cloud.bigtable.core.IBigtableDataClient;
+import com.google.cloud.bigtable.data.v2.models.ReadModifyWriteRow;
+import com.google.cloud.bigtable.data.v2.models.Row;
 import com.google.cloud.bigtable.metrics.BigtableClientMetrics.MetricLevel;
 import com.google.api.client.util.NanoClock;
 import com.google.bigtable.v2.MutateRowRequest;
@@ -341,6 +342,7 @@ public class BulkMutation {
 
   private final String tableName;
   private final BigtableDataClient client;
+  private final IBigtableDataClient clientWrapper;
   private final OperationAccountant operationAccountant;
   private final ScheduledExecutorService retryExecutorService;
   private final int maxRowKeyCount;
@@ -358,6 +360,8 @@ public class BulkMutation {
    *          {@link MutateRowRequest}s will be sent.
    * @param client a {@link BigtableDataClient} object on which to perform RPCs.
    *          RPCs that this object performed.
+   * @param clientWrapper a {@link IBigtableDataClient} object on which to perform RPCs.
+   *          RPCs that this object performed.
    * @param retryExecutorService a {@link ScheduledExecutorService} object on which to schedule
    *          retries.
    * @param bulkOptions a {@link BulkOptions} with the user specified options for the behavior of
@@ -366,19 +370,22 @@ public class BulkMutation {
   public BulkMutation(
       BigtableTableName tableName,
       BigtableDataClient client,
+      IBigtableDataClient clientWrapper,
       ScheduledExecutorService retryExecutorService,
       BulkOptions bulkOptions) {
-    this(tableName, client, new OperationAccountant(), retryExecutorService, bulkOptions);
+    this(tableName, client, clientWrapper, new OperationAccountant(), retryExecutorService, bulkOptions);
   }
 
   BulkMutation(
       BigtableTableName tableName,
       BigtableDataClient client,
+      IBigtableDataClient clientWrapper,
       OperationAccountant operationAccountant,
       ScheduledExecutorService retryExecutorService,
       BulkOptions bulkOptions) {
     this.tableName = tableName.toString();
     this.client = client;
+    this.clientWrapper = clientWrapper;
     this.retryExecutorService = retryExecutorService;
     this.operationAccountant = operationAccountant;
     this.maxRowKeyCount = bulkOptions.getBulkMaxRowKeyCount();
@@ -450,20 +457,19 @@ public class BulkMutation {
 
 
   /**
-   * Performs a {@link com.google.cloud.bigtable.grpc.BigtableDataClient#readModifyWriteRow(ReadModifyWriteRowRequest)} on the
-   * {@link com.google.bigtable.v2.ReadModifyWriteRowRequest}. This method may block if
+   * Performs a {@link IBigtableDataClient#readModifyWriteRowAsync(ReadModifyWriteRow)} on the
+   * {@link ReadModifyWriteRow}. This method may block if
    * {@link OperationAccountant#registerOperation(ListenableFuture)} blocks.
    *
-   * @param request The {@link com.google.bigtable.v2.ReadModifyWriteRowRequest} to send.
+   * @param request The {@link ReadModifyWriteRow} to send.
    * @return a {@link com.google.common.util.concurrent.ListenableFuture} which can be listened to for completion events.
    */
-  public ListenableFuture<ReadModifyWriteRowResponse> readModifyWrite(
-      ReadModifyWriteRowRequest request) {
+  public ListenableFuture<Row> readModifyWrite(ReadModifyWriteRow request) {
     // Wait until both the memory and rpc count maximum requirements are achieved before getting a
     // unique id used to track this request.
-    ListenableFuture<ReadModifyWriteRowResponse> future;
+    ListenableFuture<Row> future;
     try {
-      future = client.readModifyWriteRowAsync(request);
+      future = clientWrapper.readModifyWriteRowAsync(request);
     } catch (Throwable e) {
       future = Futures.immediateFailedFuture(e);
     }
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/BulkRead.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/BulkRead.java
index 9fd81f19b..73c5b8796 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/BulkRead.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/async/BulkRead.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import com.google.cloud.bigtable.core.IBigtableDataClient;
+import com.google.cloud.bigtable.data.v2.internal.RequestContext;
 import com.google.cloud.bigtable.data.v2.models.Filters;
 import com.google.cloud.bigtable.data.v2.models.Query;
 import com.google.common.base.Preconditions;
@@ -70,6 +71,7 @@ public class BulkRead {
   private final int batchSizes;
   private final ExecutorService threadPool;
   private final String tableId;
+  private final RequestContext requestContext;
 
   private final Map<RowFilter, Batch> batches;
 
@@ -80,10 +82,12 @@ public class BulkRead {
    * @param batchSizes The number of keys to lookup per RPC.
    * @param threadPool the {@link ExecutorService} to execute the batched reads on
    */
-  public BulkRead(IBigtableDataClient client, BigtableTableName tableName, int batchSizes,
-      ExecutorService threadPool) {
+  public BulkRead(IBigtableDataClient client,
+      BigtableTableName tableName, int batchSizes, ExecutorService threadPool) {
     this.client = client;
     this.tableId = tableName.getTableId();
+    this.requestContext =
+        RequestContext.create(tableName.getProjectId(), tableName.getInstanceId(), "");
     this.batchSizes = batchSizes;
     this.threadPool = threadPool;
     this.batches = new HashMap<>();
@@ -93,12 +97,14 @@ public class BulkRead {
    * Adds the key in the request to a batch read. The future will be resolved when the batch response
    * is received.
    *
-   * @param request a {@link com.google.bigtable.v2.ReadRowsRequest} with a single row key.
-   * @return a {@link com.google.common.util.concurrent.ListenableFuture} that will be populated
-   *     with the {@link FlatRow} that corresponds to the request
+   * @param query a {@link Query} with a single row key.
+   * @return a {@link ListenableFuture} that will be populated with the {@link FlatRow} that
+   * corresponds to the request
    */
-  public ListenableFuture<FlatRow> add(ReadRowsRequest request) {
-    Preconditions.checkNotNull(request);
+  public synchronized ListenableFuture<FlatRow> add(Query query) {
+    Preconditions.checkNotNull(query);
+    ReadRowsRequest request = query.toProto(requestContext);
+
     Preconditions.checkArgument(request.getRows().getRowKeysCount() == 1);
     ByteString rowKey = request.getRows().getRowKeysList().get(0);
     Preconditions.checkArgument(!rowKey.equals(ByteString.EMPTY));
@@ -130,7 +136,7 @@ public class BulkRead {
    * ReadRowRequests have to be batched based on the {@link RowFilter} since {@link ReadRowsRequest}
    * only support a single RowFilter. A batch represents this grouping.
    */
-  class Batch implements Runnable {
+  private class Batch implements Runnable {
     private final RowFilter filter;
     /**
      * Maps row keys to a collection of {@link SettableFuture}s that will be populated once the batch
@@ -141,12 +147,12 @@ public class BulkRead {
      */
     private final Multimap<ByteString, SettableFuture<FlatRow>> futures;
 
-    public Batch(RowFilter filter) {
+    Batch(RowFilter filter) {
       this.filter = filter;
       this.futures = HashMultimap.create();
     }
 
-    public Collection<Batch> split() {
+    Collection<Batch> split() {
       if (futures.values().size() <= batchSizes) {
         return ImmutableList.of(this);
       }
@@ -165,7 +171,7 @@ public class BulkRead {
       return batches;
     }
 
-    public SettableFuture<FlatRow> addKey(ByteString rowKey) {
+    SettableFuture<FlatRow> addKey(ByteString rowKey) {
       SettableFuture<FlatRow> future = SettableFuture.create();
       futures.put(rowKey, future);
       return future;
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/scanner/FlatRowConverter.java b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/scanner/FlatRowConverter.java
index e776b288f..f3c025292 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/scanner/FlatRowConverter.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/main/java/com/google/cloud/bigtable/grpc/scanner/FlatRowConverter.java
@@ -83,21 +83,6 @@ public class FlatRowConverter {
         .build();
   }
 
-  public static FlatRow convert(Row row) {
-    FlatRow.Builder builder = FlatRow.newBuilder().withRowKey(row.getKey());
-    for (Family family : row.getFamiliesList()) {
-      String familyName = family.getName();
-      for (Column column : family.getColumnsList()) {
-        ByteString qualifier = column.getQualifier();
-        for (Cell cell : column.getCellsList()) {
-          builder.addCell(familyName, qualifier, cell.getTimestampMicros(), cell.getValue(),
-            cell.getLabelsList());
-        }
-      }
-    }
-    return builder.build();
-  }
-
   public static com.google.cloud.bigtable.data.v2.models.Row convertToModelRow(FlatRow row) {
     if (row == null || row.getCells() == null) {
       return null;
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/AbstractBigtableRegionLocator.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/AbstractBigtableRegionLocator.java
index 69cc92bf5..7fcf2ec2f 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/AbstractBigtableRegionLocator.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/AbstractBigtableRegionLocator.java
@@ -28,7 +28,6 @@ import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
 
-import com.google.bigtable.v2.SampleRowKeysRequest;
 import com.google.cloud.bigtable.config.BigtableOptions;
 import com.google.cloud.bigtable.config.Logger;
 import com.google.cloud.bigtable.grpc.BigtableTableName;
@@ -81,12 +80,11 @@ public abstract class AbstractBigtableRegionLocator {
       return this.regionsFuture;
     }
 
-    SampleRowKeysRequest.Builder request = SampleRowKeysRequest.newBuilder();
-    request.setTableName(bigtableTableName.toString());
-    LOG.debug("Sampling rowkeys for table %s", request.getTableName());
+    LOG.debug("Sampling rowkeys for table %s", bigtableTableName.toString());
 
     try {
-      ListenableFuture<List<KeyOffset>> future = client.sampleRowKeysAsync(bigtableTableName.getTableId());
+      ListenableFuture<List<KeyOffset>> future =
+          client.sampleRowKeysAsync(bigtableTableName.getTableId());
       this.regionsFuture = Futures
           .transform(future, new Function<List<KeyOffset>, List<HRegionLocation>>() {
             @Override
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/AbstractBigtableTable.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/AbstractBigtableTable.java
index 67e9ff9f9..f60be62c2 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/AbstractBigtableTable.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/AbstractBigtableTable.java
@@ -16,7 +16,6 @@
 package com.google.cloud.bigtable.hbase;
 
 import com.google.cloud.bigtable.core.IBigtableDataClient;
-import com.google.cloud.bigtable.data.v2.internal.RequestContext;
 import com.google.cloud.bigtable.data.v2.models.ConditionalRowMutation;
 import com.google.cloud.bigtable.data.v2.models.ReadModifyWriteRow;
 import com.google.cloud.bigtable.data.v2.models.RowMutation;
@@ -66,7 +65,6 @@ import org.apache.hadoop.hbase.shaded.com.google.protobuf.ServiceException;
 
 import com.google.cloud.bigtable.config.BigtableOptions;
 import com.google.cloud.bigtable.config.Logger;
-import com.google.cloud.bigtable.grpc.BigtableDataClient;
 import com.google.cloud.bigtable.grpc.BigtableSession;
 import com.google.cloud.bigtable.grpc.scanner.FlatRow;
 import com.google.cloud.bigtable.hbase.adapters.Adapters;
@@ -112,30 +110,25 @@ public abstract class AbstractBigtableTable implements Table {
   protected final BigtableOptions options;
   protected final HBaseRequestAdapter hbaseAdapter;
 
-  protected final BigtableDataClient client;
   protected final IBigtableDataClient clientWrapper;
   private BatchExecutor batchExecutor;
   protected final AbstractBigtableConnection bigtableConnection;
   private TableMetrics metrics = new TableMetrics();
-  // Once the IBigtableDataClient interface is implemented this will be removed
-  protected final RequestContext requestContext;
 
   /**
    * Constructed by BigtableConnection
    *
-   * @param bigtableConnection a {@link org.apache.hadoop.hbase.client.AbstractBigtableConnection} object.
-   * @param hbaseAdapter a {@link com.google.cloud.bigtable.hbase.adapters.HBaseRequestAdapter} object.
+   * @param bigtableConnection a {@link AbstractBigtableConnection} object.
+   * @param hbaseAdapter a {@link HBaseRequestAdapter} object.
    */
   public AbstractBigtableTable(AbstractBigtableConnection bigtableConnection,
       HBaseRequestAdapter hbaseAdapter) {
     this.bigtableConnection = bigtableConnection;
     BigtableSession session = bigtableConnection.getSession();
     this.options = session.getOptions();
-    this.client = session.getDataClient();
     this.clientWrapper = session.getClientWrapper();
     this.hbaseAdapter = hbaseAdapter;
     this.tableName = hbaseAdapter.getTableName();
-    this.requestContext = session.getDataRequestContext();
   }
 
   /** {@inheritDoc} */
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BatchExecutor.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BatchExecutor.java
index 7b8727b21..34636c49d 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BatchExecutor.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BatchExecutor.java
@@ -15,10 +15,6 @@
  */
 package com.google.cloud.bigtable.hbase;
 
-import com.google.bigtable.v2.ReadModifyWriteRowResponse;
-import com.google.cloud.bigtable.data.v2.internal.RequestContext;
-import com.google.cloud.bigtable.data.v2.models.DefaultRowAdapter;
-import com.google.cloud.bigtable.grpc.BigtableDataClientWrapper;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -106,11 +102,6 @@ public class BatchExecutor {
       try {
         if (message instanceof FlatRow) {
           result = Adapters.FLAT_ROW_ADAPTER.adaptResponse((FlatRow) message);
-        } else if (message instanceof ReadModifyWriteRowResponse) {
-          ReadModifyWriteRowResponse response = ((ReadModifyWriteRowResponse) message);
-          com.google.cloud.bigtable.data.v2.models.Row row =
-              new DefaultRowAdapter().createRowFromProto(response.getRow());
-          result = Adapters.ROW_ADAPTER.adaptResponse(row);
         } else if (message instanceof com.google.cloud.bigtable.data.v2.models.Row) {
           result = Adapters.ROW_ADAPTER.adaptResponse((com.google.cloud.bigtable.data.v2.models.Row) message);
         }
@@ -142,7 +133,6 @@ public class BatchExecutor {
   protected final HBaseRequestAdapter requestAdapter;
   protected final Timer batchTimer = BigtableClientMetrics.timer(MetricLevel.Info, "batch.latency");
   // Once the IBigtableDataClient interface is implemented, this will be removed.
-  private final RequestContext requestContext;
   private final BigtableBufferedMutatorHelper bufferedMutatorHelper;
   private final BulkRead bulkRead;
 
@@ -155,7 +145,6 @@ public class BatchExecutor {
    */
   public BatchExecutor(BigtableSession session, HBaseRequestAdapter requestAdapter) {
     this.requestAdapter = requestAdapter;
-    this.requestContext = session.getDataRequestContext();
     this.options = session.getOptions();
     this.bulkRead = session.createBulkRead(requestAdapter.getBigtableTableName());
     this.bufferedMutatorHelper = new BigtableBufferedMutatorHelper(
@@ -191,7 +180,7 @@ public class BatchExecutor {
   private ListenableFuture<?> issueAsyncRequest(Row row) {
     try {
       if (row instanceof Get) {
-        return bulkRead.add(requestAdapter.adapt((Get) row).toProto(requestContext));
+        return bulkRead.add(requestAdapter.adapt((Get) row));
       } else if (row instanceof Mutation) {
         return bufferedMutatorHelper.mutate((Mutation) row);
       } else if (row instanceof RowMutations) {
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BigtableBufferedMutatorHelper.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BigtableBufferedMutatorHelper.java
index a9c8ee5ad..e91325907 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BigtableBufferedMutatorHelper.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BigtableBufferedMutatorHelper.java
@@ -66,12 +66,9 @@ public class BigtableBufferedMutatorHelper {
   private boolean closed = false;
 
   private final HBaseRequestAdapter adapter;
-
   private final BulkMutation bulkMutation;
-
   private final BigtableOptions options;
-  // Once the IBigtableDataClient interface is implemented this will be removed
-  protected final RequestContext requestContext;
+  private final RequestContext requestContext;
 
   /**
    * <p>
@@ -209,11 +206,9 @@ public class BigtableBufferedMutatorHelper {
       } else if (mutation instanceof Delete) {
         future = bulkMutation.add(toEntry(adapter.adaptEntry((Delete) mutation)));
       } else if (mutation instanceof Increment) {
-        future = bulkMutation.readModifyWrite(
-            adapter.adapt((Increment) mutation).toProto(requestContext));
+        future = bulkMutation.readModifyWrite(adapter.adapt((Increment) mutation));
       } else if (mutation instanceof Append) {
-        future = bulkMutation.readModifyWrite(
-            adapter.adapt((Append) mutation).toProto(requestContext));
+        future = bulkMutation.readModifyWrite(adapter.adapt((Append) mutation));
       } else {
         future = Futures.immediateFailedFuture(new IllegalArgumentException(
             "Encountered unknown mutation type: " + mutation.getClass()));
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/CheckAndMutateUtil.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/CheckAndMutateUtil.java
index d8b5c3e9b..68ae1296b 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/CheckAndMutateUtil.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/CheckAndMutateUtil.java
@@ -16,8 +16,6 @@
 package com.google.cloud.bigtable.hbase.adapters;
 
 import com.google.bigtable.v2.CheckAndMutateRowRequest;
-import com.google.bigtable.v2.CheckAndMutateRowResponse;
-import com.google.bigtable.v2.ReadRowsRequest;
 import com.google.bigtable.v2.RowFilter;
 import com.google.cloud.bigtable.data.v2.internal.RequestContext;
 import com.google.cloud.bigtable.data.v2.models.ConditionalRowMutation;
@@ -71,6 +69,8 @@ public class CheckAndMutateUtil {
       ConditionalRowMutation request,
       Boolean predicateMatched) {
 
+
+    // TODO: ConditionalRowMutation should have methods to check if it has true/false mutations
     CheckAndMutateRowRequest proto =
         request.toProto(RequestContext.create("SomeProject", "Some Instance", ""));
     // If we have true mods, we want the predicate to have matched.
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/DeleteAdapter.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/DeleteAdapter.java
index 0f1559675..d0af69fd9 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/DeleteAdapter.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/DeleteAdapter.java
@@ -17,9 +17,6 @@ package com.google.cloud.bigtable.hbase.adapters;
 
 import static com.google.cloud.bigtable.data.v2.models.Range.TimestampRange;
 
-import com.google.bigtable.v2.MutateRowRequest;
-import com.google.bigtable.v2.Mutation;
-import com.google.bigtable.v2.Mutation.DeleteFromColumn;
 import com.google.cloud.bigtable.hbase.BigtableConstants;
 import com.google.protobuf.ByteString;
 
@@ -151,52 +148,4 @@ public class DeleteAdapter extends MutationAdapter<Delete> {
       }
     }
   }
-
-
-  /**
-   * <p>adapt.</p>
-   *
-   * @param request a {@link com.google.bigtable.v2.MutateRowRequest} object.
-   * @return a {@link org.apache.hadoop.hbase.client.Delete} object.
-   */
-  public Delete adapt(MutateRowRequest request) {
-    Delete delete = new Delete(request.getRowKey().toByteArray());
-
-    boolean isDeleteRow = false;
-    for (Mutation mutation : request.getMutationsList()) {
-      switch (mutation.getMutationCase()) {
-      case DELETE_FROM_COLUMN: {
-        DeleteFromColumn deleteFromColumn = mutation.getDeleteFromColumn();
-        long timestamp;
-        com.google.bigtable.v2.TimestampRange timeRange = deleteFromColumn.getTimeRange();
-        if (timeRange.getStartTimestampMicros() == 0) {
-          timestamp = BigtableConstants.HBASE_TIMEUNIT.convert(timeRange.getEndTimestampMicros(),
-            BigtableConstants.BIGTABLE_TIMEUNIT) - 1;
-          delete.addColumns(getBytes(deleteFromColumn.getFamilyNameBytes()),
-            getBytes(deleteFromColumn.getColumnQualifier()), timestamp);
-        } else {
-          timestamp = BigtableConstants.HBASE_TIMEUNIT.convert(timeRange.getStartTimestampMicros(),
-            BigtableConstants.BIGTABLE_TIMEUNIT);
-          delete.addColumn(getBytes(deleteFromColumn.getFamilyNameBytes()),
-            getBytes(deleteFromColumn.getColumnQualifier()), timestamp);
-        }
-
-        break;
-      }
-      case DELETE_FROM_FAMILY:
-        delete.addFamily(getBytes(mutation.getDeleteFromFamily().getFamilyNameBytes()));
-        break;
-      case DELETE_FROM_ROW:
-        isDeleteRow = true;
-        break;
-      default:
-        throw new IllegalArgumentException("DeleteAdapter does not support " + mutation.getMutationCase() + ".");
-      }
-    }
-    if (isDeleteRow && !delete.getFamilyCellMap().isEmpty()) {
-      throw new IllegalArgumentException(
-          "DeleteAdapter does not support DELETE_FROM_ROW with other operations.");
-    }
-    return delete;
-  }
 }
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/HBaseRequestAdapter.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/HBaseRequestAdapter.java
index 9e83ab314..e2874cff4 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/HBaseRequestAdapter.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/HBaseRequestAdapter.java
@@ -144,8 +144,8 @@ public class HBaseRequestAdapter {
   /**
    * <p>adapt.</p>
    *
-   * @param delete a {@link org.apache.hadoop.hbase.client.Delete} object.
-   * @return a {@link com.google.bigtable.v2.MutateRowsRequest.Entry} object.
+   * @param delete a {@link Delete} object.
+   * @return a {@link RowMutation} object.
    */
   public RowMutation adaptEntry(Delete delete) {
     RowMutation rowMutation = newRowMutationModel(delete.getRow());
@@ -232,8 +232,8 @@ public class HBaseRequestAdapter {
   /**
    * <p>adaptEntry.</p>
    *
-   * @param put a {@link org.apache.hadoop.hbase.client.Put} object.
-   * @return a {@link com.google.bigtable.v2.MutateRowsRequest.Entry} object.
+   * @param put a {@link Put} object.
+   * @return a {@link RowMutation} object.
    */
   public RowMutation adaptEntry(Put put) {
     RowMutation rowMutation = newRowMutationModel(put.getRow());
@@ -257,7 +257,7 @@ public class HBaseRequestAdapter {
    * <p>adapt.</p>
    *
    * @param mutations a {@link org.apache.hadoop.hbase.client.RowMutations} object.
-   * @param mutationApi a {@link com.google.cloud.bigtable.data.v2.models.MutationApi} object.
+   * @param mutationApi a {@link MutationApi} object.
    */
   @InternalApi
   public void adapt(RowMutations mutations, MutationApi<?> mutationApi) {
@@ -268,7 +268,7 @@ public class HBaseRequestAdapter {
    * <p>adaptEntry.</p>
    *
    * @param mutations a {@link org.apache.hadoop.hbase.client.RowMutations} object.
-   * @return a {@link com.google.bigtable.v2.MutateRowsRequest.Entry} object.
+   * @return a {@link RowMutation} object.
    */
   public RowMutation adaptEntry(RowMutations mutations) {
     RowMutation rowMutation = newRowMutationModel(mutations.getRow());
@@ -280,7 +280,7 @@ public class HBaseRequestAdapter {
    * <p>adapt.</p>
    *
    * @param mutation a {@link org.apache.hadoop.hbase.client.Mutation} object.
-   * @return a {@link com.google.bigtable.v2.MutateRowRequest} object.
+   * @return a {@link RowMutation} object.
    */
   public RowMutation adapt(org.apache.hadoop.hbase.client.Mutation mutation) {
     RowMutation rowMutation = newRowMutationModel(mutation.getRow());
@@ -292,10 +292,10 @@ public class HBaseRequestAdapter {
    * <p>adapt.</p>
    *
    * @param mutation a {@link org.apache.hadoop.hbase.client.Mutation} object.
-   * @param mutationApi a {@link com.google.cloud.bigtable.data.v2.models.MutationApi} object.
+   * @param mutationApi a {@link MutationApi} object.
    */
   @InternalApi
-  public void adapt(org.apache.hadoop.hbase.client.Mutation mutation, MutationApi<?> mutationApi) {
+  private void adapt(org.apache.hadoop.hbase.client.Mutation mutation, MutationApi<?> mutationApi) {
     mutationAdapters.hbaseMutationAdapter.adapt(mutation, mutationApi);
   }
 
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/MutationAdapter.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/MutationAdapter.java
index eb78f7d07..8048be6b3 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/MutationAdapter.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/MutationAdapter.java
@@ -15,43 +15,34 @@
  */
 package com.google.cloud.bigtable.hbase.adapters;
 
-import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.client.Mutation;
+import com.google.cloud.bigtable.data.v2.models.MutationApi;
 import org.apache.hadoop.hbase.client.Row;
 
-import com.google.bigtable.v2.MutateRowRequest;
-import com.google.bigtable.v2.MutateRowsRequest;
 import com.google.cloud.bigtable.hbase.util.ByteStringer;
 import com.google.protobuf.ByteString;
 
 /**
- * Adapt an HBase {@link Mutation} Operation into a Google Cloud Java
- * {@link com.google.cloud.bigtable.data.v2.models.Mutation}.
+ * Adapt an HBase {@link Row} Operation into a Google Cloud Java
+ * {@link MutationApi}.
  *
  * @author sduskis
  * @version $Id: $Id
  */
 public abstract class MutationAdapter<T extends Row>
-    implements OperationAdapter<T, com.google.cloud.bigtable.data.v2.models.MutationApi<?>> {
+    implements OperationAdapter<T, MutationApi<?>> {
 
   protected static byte[] getBytes(ByteString bs) {
     return ByteStringer.extract(bs);
   }
 
   /**
-   * Converts an HBase {@link Mutation} which represents a set of changes to a single row from an
-   * HBase perspective to a Google Cloud Java {@link com.google.cloud.bigtable.data.v2.models.Mutation}
-   * which represent the set of changes. The name "Mutation" represents a more granular change in
-   * Bigtable than an HBase "Mutation"; An HBase {@link Cell} is akin to a Cloud Bigtable {@link
-   * com.google.bigtable.v2.Mutation}. A CloudBigtable {@link MutateRowRequest} or {@link
-   * com.google.bigtable.v2.MutateRowsRequest.Entry} is akin to an HBase {@link Mutation}.
+   * Converts an HBase {@link Row} which represents a set of changes to a single row from an
+   * HBase perspective to a Google Cloud Java {@link MutationApi}
+   * which represent the set of changes.
    *
-   * @param operation The HBase {@link Mutation} to convert
-   * @param mutation The model {@link com.google.cloud.bigtable.data.v2.models.MutationApi}
+   * @param operation The HBase {@link Row} to convert
+   * @param mutation The model {@link MutationApi}
    */
   @Override
-  public abstract void adapt(
-      T operation,
-      com.google.cloud.bigtable.data.v2.models.MutationApi<?> mutation
-  );
+  public abstract void adapt(T operation, MutationApi<?> mutation);
 }
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/PutAdapter.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/PutAdapter.java
index 6a29c7dee..aa3fda689 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/PutAdapter.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/PutAdapter.java
@@ -16,12 +16,6 @@
 package com.google.cloud.bigtable.hbase.adapters;
 
 import com.google.api.client.util.Clock;
-import com.google.bigtable.v2.MutateRowRequest;
-import com.google.bigtable.v2.Mutation;
-import com.google.bigtable.v2.Mutation.MutationCase;
-import com.google.bigtable.v2.Mutation.SetCell;
-import com.google.cloud.bigtable.hbase.BigtableConstants;
-import com.google.cloud.bigtable.hbase.adapters.read.RowCell;
 import com.google.cloud.bigtable.hbase.util.TimestampConverter;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.protobuf.ByteString;
@@ -30,7 +24,6 @@ import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.client.Put;
 
-import java.io.IOException;
 import java.util.List;
 import java.util.Map.Entry;
 
@@ -123,39 +116,6 @@ public class PutAdapter extends MutationAdapter<Put> {
     }
   }
 
-  /**
-   * <p>adapt.</p>
-   *
-   * @param request a {@link com.google.bigtable.v2.MutateRowRequest} object.
-   * @return a {@link org.apache.hadoop.hbase.client.Put} object.
-   * @throws java.io.IOException if any.
-   */
-  public Put adapt(MutateRowRequest request) throws IOException {
-    if (request.getMutationsCount() == 0) {
-      throw new IllegalArgumentException("No columns to insert");
-    }
-
-    byte[] rowkeyArray = request.getRowKey().toByteArray();
-    Put put = new Put(rowkeyArray);
-    for (Mutation mutation : request.getMutationsList()) {
-      if (mutation.getMutationCase() != MutationCase.SET_CELL) {
-        throw new IllegalArgumentException(
-            "Cannot process mutation of type: " + mutation.getMutationCase());
-      }
-      SetCell setCell = mutation.getSetCell();
-      long timestampHbase;
-      if (setCell.getTimestampMicros() == -1) {
-        timestampHbase = HConstants.LATEST_TIMESTAMP;
-      } else {
-        timestampHbase = BigtableConstants.HBASE_TIMEUNIT.convert(setCell.getTimestampMicros(),
-          BigtableConstants.BIGTABLE_TIMEUNIT);
-      }
-      put.add(new RowCell(rowkeyArray, getBytes(setCell.getFamilyNameBytes()),
-          getBytes(setCell.getColumnQualifier()), timestampHbase, getBytes(setCell.getValue())));
-    }
-    return put;
-  }
-
   boolean isSetClientTimestamp() {
     return setClientTimestamp;
   }
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/SampledRowKeysAdapter.java b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/SampledRowKeysAdapter.java
index e9058a19b..564fc0ea4 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/SampledRowKeysAdapter.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/adapters/SampledRowKeysAdapter.java
@@ -15,7 +15,6 @@
  */
 package com.google.cloud.bigtable.hbase.adapters;
 
-import com.google.bigtable.v2.SampleRowKeysResponse;
 import com.google.cloud.bigtable.config.Logger;
 
 import com.google.cloud.bigtable.data.v2.models.KeyOffset;
diff --git a/bigtable-hbase-2.x-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
index 92e16d9d2..cfaba2bb9 100644
--- a/bigtable-hbase-2.x-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
@@ -18,8 +18,6 @@ package com.google.cloud.bigtable.hbase2_x;
 import static java.util.stream.Collectors.toList;
 
 import com.google.cloud.bigtable.core.IBigtableDataClient;
-import com.google.cloud.bigtable.data.v2.internal.RequestContext;
-import com.google.cloud.bigtable.data.v2.models.ReadModifyWriteRow;
 import com.google.cloud.bigtable.data.v2.models.ConditionalRowMutation;
 import com.google.cloud.bigtable.data.v2.models.Query;
 import com.google.cloud.bigtable.grpc.BigtableTableName;
@@ -87,19 +85,16 @@ public class BigtableAsyncTable implements AsyncTable<ScanResultConsumer> {
   private final HBaseRequestAdapter hbaseAdapter;
   private final TableName tableName;
   private BatchExecutor batchExecutor;
-  // Once the IBigtableDataClient interface is implemented this will be removed
-  private RequestContext requestContext;
 
   public BigtableAsyncTable(BigtableAsyncConnection asyncConnection,
       HBaseRequestAdapter hbaseAdapter) {
     this.asyncConnection = asyncConnection;
     BigtableSession session = asyncConnection.getSession();
-    this.client = new BigtableDataClient(session.getDataClient(), session.getClientWrapper());
+    this.client = new BigtableDataClient(session.getClientWrapper());
     this.clientWrapper = asyncConnection.getSession().getClientWrapper();
     this.hbaseAdapter = hbaseAdapter;
     this.tableName = hbaseAdapter.getTableName();
     // Once the IBigtableDataClient interface is implemented this will be removed
-    this.requestContext = session.getDataRequestContext();
   }
 
   protected synchronized BatchExecutor getBatchExecutor() {
@@ -114,12 +109,11 @@ public class BigtableAsyncTable implements AsyncTable<ScanResultConsumer> {
    */
   @Override
   public CompletableFuture<Result> append(Append append) {
-    ReadModifyWriteRow request = hbaseAdapter.adapt(append);
-    Function<? super com.google.cloud.bigtable.data.v2.models.Row, ? extends Result>
-        adaptRowFunction = response -> append.isReturnResults()
-            ? Adapters.ROW_ADAPTER.adaptResponse(response)
-            : null;
-    return client.readModifyWriteRowAsync(request).thenApply(adaptRowFunction);
+    return client.readModifyWriteRowAsync(hbaseAdapter.adapt(append))
+        .thenApply(response ->
+            append.isReturnResults()
+                ? Adapters.ROW_ADAPTER.adaptResponse(response)
+                : null);
   }
 
   /**
@@ -144,17 +138,11 @@ public class BigtableAsyncTable implements AsyncTable<ScanResultConsumer> {
 
     private final CheckAndMutateUtil.RequestBuilder builder;
     private final BigtableDataClient client;
-    // Once the IBigtableDataClient interface is implemented this will be removed
-    protected final RequestContext requestContext;
 
     public CheckAndMutateBuilderImpl(BigtableDataClient client, HBaseRequestAdapter hbaseAdapter,
         byte[] row, byte[] family) {
       this.client = client;
       this.builder = new CheckAndMutateUtil.RequestBuilder(hbaseAdapter, row, family);
-      BigtableTableName bigtableTableName = hbaseAdapter.getBigtableTableName();
-      // Once the IBigtableDataClient interface is implemented this will be removed
-      this.requestContext = RequestContext
-          .create(bigtableTableName.getProjectId(), bigtableTableName.getInstanceId(), "");
     }
 
     /**
diff --git a/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableDataClient.java b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableDataClient.java
index 13c7e666b..3483e23a9 100644
--- a/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableDataClient.java
+++ b/bigtable-hbase-2.x-parent/bigtable-hbase-2.x/src/main/java/com/google/cloud/bigtable/hbase2_x/BigtableDataClient.java
@@ -36,12 +36,9 @@ import com.google.cloud.bigtable.grpc.scanner.FlatRow;
  */
 public class BigtableDataClient {
 
-  private final com.google.cloud.bigtable.grpc.BigtableDataClient dataClient;
   private final IBigtableDataClient clientWrapper;
 
-  public BigtableDataClient(com.google.cloud.bigtable.grpc.BigtableDataClient dataClient,
-      IBigtableDataClient clientWrapper) {
-    this.dataClient = dataClient;
+  public BigtableDataClient(IBigtableDataClient clientWrapper) {
     this.clientWrapper = clientWrapper;
   }
 
@@ -90,8 +87,4 @@ public class BigtableDataClient {
   public CompletableFuture<List<FlatRow>> readFlatRowsAsync(Query request) {
     return toCompletableFuture(clientWrapper.readFlatRowsAsync(request));
   }
-
-  public com.google.cloud.bigtable.grpc.BigtableDataClient getClient() {
-    return dataClient;
-  }
 }
diff --git a/bigtable-hbase-2.x-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
index d2de6b2b5..80109761c 100644
--- a/bigtable-hbase-2.x-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
@@ -148,7 +148,7 @@ public class BigtableTable extends AbstractBigtableTable {
 
   @Override
   public CheckAndMutateBuilder checkAndMutate(byte[] row, byte[] family) {
-    BigtableDataClient asyncClient = new BigtableDataClient(this.client, this.clientWrapper);
+    BigtableDataClient asyncClient = new BigtableDataClient(this.clientWrapper);
     final BigtableAsyncTable.CheckAndMutateBuilderImpl delegate =
         new BigtableAsyncTable.CheckAndMutateBuilderImpl(asyncClient, hbaseAdapter, row, family);
     return new CheckAndMutateBuilder() {


Test patch:
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/TestAppProfile.java b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/TestAppProfile.java
index ad7653ffa..9252b49f0 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/TestAppProfile.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/TestAppProfile.java
@@ -32,6 +32,7 @@ import com.google.bigtable.v2.SampleRowKeysRequest;
 import com.google.bigtable.v2.SampleRowKeysResponse;
 import com.google.cloud.bigtable.config.BigtableOptions;
 import com.google.cloud.bigtable.config.CredentialOptions;
+import com.google.cloud.bigtable.data.v2.models.Query;
 import com.google.cloud.bigtable.grpc.async.BulkMutation;
 import com.google.cloud.bigtable.grpc.async.BulkRead;
 import com.google.common.base.Preconditions;
@@ -205,14 +206,11 @@ public class TestAppProfile {
 
   @Test
   public void testBulkRead() throws Exception {
-    BigtableTableName fakeTableName = new BigtableTableName(
-        "projects/fake-project/instances/fake-instance/tables/fake-table");
-
-    ReadRowsRequest readRowsRequest = ReadRowsRequest.newBuilder()
-        .setTableName(fakeTableName.toString())
-        .setRows(RowSet.newBuilder().addRowKeys(ByteString.copyFromUtf8("fake-key")))
-        .build();
+    String tableId = "fake-table";
+    BigtableTableName fakeTableName =
+        defaultSession.getOptions().getInstanceName().toTableName(tableId);
 
+    Query readRowsRequest = Query.create(tableId).rowKey("fake-key");
 
     BulkRead bulkRead = defaultSession.createBulkRead(fakeTableName);
     bulkRead.add(readRowsRequest);
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/TestBigtableDataClientWrapper.java b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/TestBigtableDataClientWrapper.java
index 6c3aad5ea..ea18aa934 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/TestBigtableDataClientWrapper.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/TestBigtableDataClientWrapper.java
@@ -33,7 +33,6 @@ import com.google.bigtable.v2.ReadModifyWriteRowResponse;
 import com.google.bigtable.v2.Row;
 import com.google.bigtable.v2.SampleRowKeysRequest;
 import com.google.bigtable.v2.SampleRowKeysResponse;
-import com.google.cloud.bigtable.config.BigtableOptions;
 import com.google.cloud.bigtable.data.v2.internal.NameUtil;
 import com.google.cloud.bigtable.data.v2.internal.RequestContext;
 import com.google.cloud.bigtable.data.v2.models.ConditionalRowMutation;
@@ -80,9 +79,6 @@ public class TestBigtableDataClientWrapper {
   private static final RequestContext REQUEST_CONTEXT =
       RequestContext.create(PROJECT_ID, INSTANCE_ID, APP_PROFILE_ID);
 
-  private BigtableOptions options =
-      BigtableOptions.builder().setProjectId(PROJECT_ID).setInstanceId(INSTANCE_ID)
-        .setAppProfileId(APP_PROFILE_ID).build();
   @Mock
   private BigtableDataClient client;
 
@@ -93,7 +89,7 @@ public class TestBigtableDataClientWrapper {
 
   @Before
   public void setUp() {
-    clientWrapper = new BigtableDataClientWrapper(client, options);
+    clientWrapper = new BigtableDataClientWrapper(client, REQUEST_CONTEXT);
   }
 
   @Test
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkMutation.java b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkMutation.java
index 16e609bbd..26d4d3632 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkMutation.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkMutation.java
@@ -32,6 +32,9 @@ import java.util.concurrent.atomic.AtomicLong;
 import com.google.bigtable.v2.ReadModifyWriteRowRequest;
 import com.google.bigtable.v2.ReadModifyWriteRowResponse;
 import com.google.bigtable.v2.ReadRowsResponse;
+import com.google.cloud.bigtable.core.IBigtableDataClient;
+import com.google.cloud.bigtable.data.v2.models.ReadModifyWriteRow;
+import com.google.cloud.bigtable.data.v2.models.Row;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -85,6 +88,7 @@ public class TestBulkMutation {
   }
 
   @Mock private BigtableDataClient client;
+  @Mock private IBigtableDataClient clientWrapper;
   @Mock private ScheduledExecutorService retryExecutorService;
   @Mock private ScheduledFuture mockScheduledFuture;
 
@@ -292,7 +296,7 @@ public class TestBulkMutation {
   public void testAutoflush() throws Exception {
     // Setup a BulkMutation with autoflush enabled: the scheduled flusher will get captured by the
     // scheduled executor mock
-    underTest = new BulkMutation(TABLE_NAME, client, operationAccountant,
+    underTest = new BulkMutation(TABLE_NAME, client, clientWrapper, operationAccountant,
         retryExecutorService, BulkOptions.builder().setAutoflushMs(1000L).build());
     ArgumentCaptor<Runnable> autoflusher = ArgumentCaptor.forClass(Runnable.class);
     when(retryExecutorService.schedule(autoflusher.capture(), anyLong(), any(TimeUnit.class)))
@@ -374,24 +378,24 @@ public class TestBulkMutation {
 
   @Test
   public void testReadWriteModify()  {
-    SettableFuture<ReadModifyWriteRowResponse> future = SettableFuture.create();
-    when(client.readModifyWriteRowAsync(any(ReadModifyWriteRowRequest.class))).thenReturn(future);
-    underTest.readModifyWrite(ReadModifyWriteRowRequest.getDefaultInstance());
+    SettableFuture<Row> future = SettableFuture.create();
+    when(clientWrapper.readModifyWriteRowAsync(any(ReadModifyWriteRow.class))).thenReturn(future);
+    underTest.readModifyWrite(ReadModifyWriteRow.create("table", "key"));
     Assert.assertTrue(operationAccountant.hasInflightOperations());
-    future.set(ReadModifyWriteRowResponse.getDefaultInstance());
+    future.set(null);
     Assert.assertFalse(operationAccountant.hasInflightOperations());
   }
 
   @Test
   public void testInvalidMutation() {
-    when(client.readModifyWriteRowAsync(any(ReadModifyWriteRowRequest.class))).thenThrow(new RuntimeException());
-    underTest.readModifyWrite(ReadModifyWriteRowRequest.getDefaultInstance());
+    when(clientWrapper.readModifyWriteRowAsync(any(ReadModifyWriteRow.class))).thenThrow(new RuntimeException());
+    underTest.readModifyWrite(ReadModifyWriteRow.create("table", "key"));
     Assert.assertFalse(operationAccountant.hasInflightOperations());
   }
 
   private BulkMutation createBulkMutation() {
-    return new BulkMutation(TABLE_NAME, client, operationAccountant, retryExecutorService,
-        BULK_OPTIONS);
+    return new BulkMutation(TABLE_NAME, client, clientWrapper, operationAccountant,
+        retryExecutorService, BULK_OPTIONS);
   }
 
   private void setupScheduler(final boolean inNewThread) {
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkMutationAwaitCompletion.java b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkMutationAwaitCompletion.java
index 07306b103..2b80cade5 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkMutationAwaitCompletion.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkMutationAwaitCompletion.java
@@ -30,6 +30,7 @@ import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import com.google.cloud.bigtable.core.IBigtableDataClient;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -71,6 +72,9 @@ public class TestBulkMutationAwaitCompletion {
   @Mock
   private BigtableDataClient mockClient;
 
+  @Mock
+  private IBigtableDataClient mockClientWrapper;
+
   @Mock
   private ScheduledExecutorService mockScheduler;
 
@@ -296,6 +300,7 @@ public class TestBulkMutationAwaitCompletion {
         new BulkMutation(
             TestBulkMutation.TABLE_NAME,
             mockClient,
+            mockClientWrapper,
             operationAccountant,
             mockScheduler,
             options);
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkRead.java b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkRead.java
index 3167a756f..a2adb3cb2 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkRead.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/async/TestBulkRead.java
@@ -113,7 +113,7 @@ public class TestBulkRead {
     when(mockClient.readFlatRows(any(Query.class))).thenReturn(mockScanner);
     FlatRow row = createRow(ByteString.copyFromUtf8("Key"));
     when(mockScanner.next()).thenReturn(row).thenReturn(null);
-    ReadRowsRequest request = createRequest(row.getRowKey());
+    Query request = createRequest(row.getRowKey());
     ListenableFuture<FlatRow> future1 = underTest.add(request);
     ListenableFuture<FlatRow> future2 = underTest.add(request);
     underTest.flush();
@@ -233,8 +233,8 @@ public class TestBulkRead {
    * Helper to generate a {@link FlatRow} for a row key.
    * @param key
    */
-  private static ReadRowsRequest createRequest(ByteString key) {
-    return ReadRowsRequest.newBuilder().setRows(RowSet.newBuilder().addRowKeys(key)).build();
+  private static Query createRequest(ByteString key) {
+    return Query.create("table").rowKey(key);
   }
 
   /**
diff --git a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/scanner/TestFlatRowConverter.java b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/scanner/TestFlatRowConverter.java
index 7c76fe982..94c45253d 100644
--- a/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/scanner/TestFlatRowConverter.java
+++ b/bigtable-client-core-parent/bigtable-client-core/src/test/java/com/google/cloud/bigtable/grpc/scanner/TestFlatRowConverter.java
@@ -58,7 +58,7 @@ public class TestFlatRowConverter {
             .build())
           .build())
         .build();
-    testBothWays(simpleRow, expectedRow);
+    Assert.assertEquals(expectedRow, FlatRowConverter.convert(simpleRow));
   }
 
   @Test
@@ -96,7 +96,7 @@ public class TestFlatRowConverter {
             .addCells(asProtoCell(simpleCell3))
             .build()))
         .build();
-    testBothWays(simpleRow, expectedRow);
+    Assert.assertEquals(expectedRow, FlatRowConverter.convert(simpleRow));
   }
 
   @Test
@@ -133,11 +133,6 @@ public class TestFlatRowConverter {
     Assert.assertEquals(row, FlatRowConverter.convertToModelRow(simpleRow));
   }
 
-  private void testBothWays(FlatRow simpleRow, Row row) {
-    Assert.assertEquals(row, FlatRowConverter.convert(simpleRow));
-    Assert.assertEquals(simpleRow, FlatRowConverter.convert(row));
-  }
-
   private ByteString toByteString(final String string) {
     return ByteString.copyFrom(string.getBytes());
   }
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/TestBatchExecutor.java b/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/TestBatchExecutor.java
index ad668059c..467bf1682 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/TestBatchExecutor.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/TestBatchExecutor.java
@@ -25,10 +25,10 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import com.google.bigtable.v2.MutateRowsRequest;
-import com.google.bigtable.v2.ReadModifyWriteRowRequest;
-import com.google.bigtable.v2.ReadRowsRequest;
 import com.google.cloud.bigtable.config.BigtableOptions;
 import com.google.cloud.bigtable.data.v2.internal.RequestContext;
+import com.google.cloud.bigtable.data.v2.models.Query;
+import com.google.cloud.bigtable.data.v2.models.ReadModifyWriteRow;
 import com.google.cloud.bigtable.grpc.BigtableSession;
 import com.google.cloud.bigtable.grpc.BigtableTableName;
 import com.google.cloud.bigtable.grpc.async.BulkMutation;
@@ -143,7 +143,7 @@ public class TestBatchExecutor {
 
     MockitoAnnotations.initMocks(this);
     when(mockBulkMutation.add(any(MutateRowsRequest.Entry.class))).thenReturn(mockFuture);
-    when(mockBulkMutation.readModifyWrite(any(ReadModifyWriteRowRequest.class))).thenReturn(mockFuture);
+    when(mockBulkMutation.readModifyWrite(any(ReadModifyWriteRow.class))).thenReturn(mockFuture);
     when(mockBigtableSession.getDataRequestContext()).thenReturn(requetsContext);
     when(mockBigtableSession.createBulkMutation(any(BigtableTableName.class))).thenReturn(mockBulkMutation);
     when(mockBigtableSession.createBulkRead(any(BigtableTableName.class))).thenReturn(mockBulkRead);
@@ -159,7 +159,7 @@ public class TestBatchExecutor {
 
   @Test
   public void testGet() throws Exception {
-    when(mockBulkRead.add(any(ReadRowsRequest.class))).thenReturn(mockFuture);
+    when(mockBulkRead.add(any(Query.class))).thenReturn(mockFuture);
     final byte[] key = randomBytes(8);
     FlatRow response = FlatRow.newBuilder().withRowKey(ByteString.copyFrom(key)).build();
     setFuture(ImmutableList.of(response));
@@ -227,7 +227,7 @@ public class TestBatchExecutor {
             .build();
 
     RuntimeException exception = new RuntimeException("Something bad happened");
-    when(mockBulkRead.add(any(ReadRowsRequest.class)))
+    when(mockBulkRead.add(any(Query.class)))
         .thenReturn(Futures.immediateFuture(response1))
         .thenReturn(Futures.<FlatRow> immediateFailedFuture(exception));
 
@@ -245,7 +245,7 @@ public class TestBatchExecutor {
 
   @Test
   public void testGetCallback() throws Exception {
-    when(mockBulkRead.add(any(ReadRowsRequest.class))).thenReturn(mockFuture);
+    when(mockBulkRead.add(any(Query.class))).thenReturn(mockFuture);
     byte[] key = randomBytes(8);
     FlatRow response = FlatRow.newBuilder().withRowKey(ByteString.copyFrom(key)).build();
     setFuture(ImmutableList.of(response));
@@ -274,7 +274,7 @@ public class TestBatchExecutor {
     }
 
     // Test 10 gets, but return only 9 to test the row not found case.
-    when(mockBulkRead.add(any(ReadRowsRequest.class)))
+    when(mockBulkRead.add(any(Query.class)))
         .then(new Answer<ListenableFuture<FlatRow>>() {
           final AtomicInteger counter = new AtomicInteger();
 
@@ -291,7 +291,7 @@ public class TestBatchExecutor {
 
     BatchExecutor underTest = createExecutor(options);
     Result[] results = underTest.batch(gets);
-    verify(mockBulkRead, times(10)).add(any(ReadRowsRequest.class));
+    verify(mockBulkRead, times(10)).add(any(Query.class));
     verify(mockBulkRead, times(1)).flush();
     Assert.assertTrue(matchesRow(Result.EMPTY_RESULT).matches(results[0]));
     for (int i = 1; i < results.length; i++) {
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableBufferedMutator.java b/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableBufferedMutator.java
index 8973f3621..2392cb56b 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableBufferedMutator.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/TestBigtableBufferedMutator.java
@@ -27,6 +27,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 import com.google.cloud.bigtable.data.v2.internal.RequestContext;
+import com.google.cloud.bigtable.data.v2.models.ReadModifyWriteRow;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Append;
@@ -45,7 +46,6 @@ import org.mockito.MockitoAnnotations;
 
 import com.google.bigtable.v2.MutateRowResponse;
 import com.google.bigtable.v2.MutateRowsRequest;
-import com.google.bigtable.v2.ReadModifyWriteRowRequest;
 import com.google.cloud.bigtable.config.BigtableOptions;
 import com.google.cloud.bigtable.grpc.BigtableSession;
 import com.google.cloud.bigtable.grpc.BigtableTableName;
@@ -83,8 +83,7 @@ public class TestBigtableBufferedMutator {
   public void setUp() {
     MockitoAnnotations.initMocks(this);
     when(mockSession.createBulkMutation(any(BigtableTableName.class))).thenReturn(mockBulkMutation);
-    when(mockSession.getDataRequestContext())
-        .thenReturn(RequestContext.create("project", "instance", ""));
+    when(mockSession.getDataRequestContext()).thenReturn(RequestContext.create("p", "i", "a"));
   }
 
   @After
@@ -126,22 +125,22 @@ public class TestBigtableBufferedMutator {
 
   @Test
   public void testIncrement() throws IOException {
-    when(mockBulkMutation.readModifyWrite(any(ReadModifyWriteRowRequest.class)))
+    when(mockBulkMutation.readModifyWrite(any(ReadModifyWriteRow.class)))
         .thenReturn(future);
     BigtableBufferedMutator underTest = createMutator(new Configuration(false));
     underTest.mutate(new Increment(EMPTY_BYTES).addColumn(EMPTY_BYTES, EMPTY_BYTES, 1));
     verify(mockBulkMutation, times(1))
-        .readModifyWrite(any(ReadModifyWriteRowRequest.class));
+        .readModifyWrite(any(ReadModifyWriteRow.class));
   }
 
   @Test
   public void testAppend() throws IOException {
-    when(mockBulkMutation.readModifyWrite(any(ReadModifyWriteRowRequest.class)))
+    when(mockBulkMutation.readModifyWrite(any(ReadModifyWriteRow.class)))
         .thenReturn(future);
     BigtableBufferedMutator underTest = createMutator(new Configuration(false));
     underTest.mutate(new Append(EMPTY_BYTES).add(EMPTY_BYTES, EMPTY_BYTES, EMPTY_BYTES));
     verify(mockBulkMutation, times(1))
-        .readModifyWrite(any(ReadModifyWriteRowRequest.class));
+        .readModifyWrite(any(ReadModifyWriteRow.class));
   }
 
   @Test
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/adapters/TestDeleteAdapter.java b/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/adapters/TestDeleteAdapter.java
index c69472f02..ec5173222 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/adapters/TestDeleteAdapter.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/adapters/TestDeleteAdapter.java
@@ -55,19 +55,14 @@ public class TestDeleteAdapter {
   public void testFullRowDelete() {
     byte[] rowKey = randomHelper.randomData("rk1-");
     Delete delete = new Delete(rowKey);
-    com.google.cloud.bigtable.data.v2.models.Mutation mutation =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    deleteAdapter.adapt(delete, mutation);
-    MutateRowRequest rowMutation = toMutateRowRequest(rowKey, mutation);
+    MutateRowRequest request = adapt(delete);
 
-    Assert.assertArrayEquals(rowKey, rowMutation.getRowKey().toByteArray());
-    Assert.assertEquals(1, rowMutation.getMutationsCount());
+    Assert.assertArrayEquals(rowKey, request.getRowKey().toByteArray());
+    Assert.assertEquals(1, request.getMutationsCount());
 
-    Mutation.MutationCase mutationCase = rowMutation.getMutations(0).getMutationCase();
+    Mutation.MutationCase mutationCase = request.getMutations(0).getMutationCase();
 
     Assert.assertEquals(MutationCase.DELETE_FROM_ROW, mutationCase);
-
-    testTwoWayAdapt(delete, deleteAdapter);
   }
 
   @Test
@@ -87,23 +82,18 @@ public class TestDeleteAdapter {
     byte[] family = randomHelper.randomData("family1-");
     Delete delete = new Delete(rowKey);
     delete.addFamily(family);
-    com.google.cloud.bigtable.data.v2.models.Mutation mutation =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    deleteAdapter.adapt(delete, mutation);
-    MutateRowRequest rowMutation = toMutateRowRequest(rowKey, mutation);
+    MutateRowRequest request = adapt(delete);
 
-    Assert.assertArrayEquals(rowKey, rowMutation.getRowKey().toByteArray());
-    Assert.assertEquals(1, rowMutation.getMutationsCount());
+    Assert.assertArrayEquals(rowKey, request.getRowKey().toByteArray());
+    Assert.assertEquals(1, request.getMutationsCount());
 
-    MutationCase mutationCase = rowMutation.getMutations(0).getMutationCase();
+    MutationCase mutationCase = request.getMutations(0).getMutationCase();
 
     Assert.assertEquals(MutationCase.DELETE_FROM_FAMILY, mutationCase);
 
     Mutation.DeleteFromFamily deleteFromFamily =
-        rowMutation.getMutations(0).getDeleteFromFamily();
+        request.getMutations(0).getDeleteFromFamily();
     Assert.assertArrayEquals(family, deleteFromFamily.getFamilyNameBytes().toByteArray());
-
-    testTwoWayAdapt(delete, deleteAdapter);
   }
 
   @Test
@@ -129,29 +119,24 @@ public class TestDeleteAdapter {
 
     Delete delete = new Delete(rowKey);
     delete.addColumn(family, qualifier, hbaseTimestamp);
-    com.google.cloud.bigtable.data.v2.models.Mutation mutation =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    deleteAdapter.adapt(delete, mutation);
-    MutateRowRequest rowMutation = toMutateRowRequest(rowKey, mutation);
+    MutateRowRequest request = adapt(delete);
 
-    Assert.assertArrayEquals(rowKey, rowMutation.getRowKey().toByteArray());
-    Assert.assertEquals(1, rowMutation.getMutationsCount());
+    Assert.assertArrayEquals(rowKey, request.getRowKey().toByteArray());
+    Assert.assertEquals(1, request.getMutationsCount());
 
-    MutationCase mutationCase = rowMutation.getMutations(0).getMutationCase();
+    MutationCase mutationCase = request.getMutations(0).getMutationCase();
 
     Assert.assertEquals(MutationCase.DELETE_FROM_COLUMN, mutationCase);
 
     Mutation.DeleteFromColumn deleteFromColumn =
-        rowMutation.getMutations(0).getDeleteFromColumn();
+        request.getMutations(0).getDeleteFromColumn();
     Assert.assertArrayEquals(family, deleteFromColumn.getFamilyNameBytes().toByteArray());
     Assert.assertArrayEquals(qualifier, deleteFromColumn.getColumnQualifier().toByteArray());
-    Assert.assertTrue(rowMutation.getMutations(0).getDeleteFromColumn().hasTimeRange());
+    Assert.assertTrue(request.getMutations(0).getDeleteFromColumn().hasTimeRange());
 
     TimestampRange timeStampRange = deleteFromColumn.getTimeRange();
     Assert.assertEquals(bigtableStartTimestamp, timeStampRange.getStartTimestampMicros());
     Assert.assertEquals(bigtableEndTimestamp, timeStampRange.getEndTimestampMicros());
-
-    testTwoWayAdapt(delete, deleteAdapter);
   }
 
   @Test
@@ -179,26 +164,21 @@ public class TestDeleteAdapter {
 
     Delete delete = new Delete(rowKey);
     delete.addColumns(family, qualifier, hbaseTimestamp);
-    com.google.cloud.bigtable.data.v2.models.Mutation mutation =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    deleteAdapter.adapt(delete, mutation);
-    MutateRowRequest rowMutation = toMutateRowRequest(rowKey, mutation);
+    MutateRowRequest request = adapt(delete);
 
-    Assert.assertArrayEquals(rowKey, rowMutation.getRowKey().toByteArray());
-    Assert.assertEquals(1, rowMutation.getMutationsCount());
+    Assert.assertArrayEquals(rowKey, request.getRowKey().toByteArray());
+    Assert.assertEquals(1, request.getMutationsCount());
     Assert.assertEquals(
-        MutationCase.DELETE_FROM_COLUMN, rowMutation.getMutations(0).getMutationCase());
+        MutationCase.DELETE_FROM_COLUMN, request.getMutations(0).getMutationCase());
 
     Mutation.DeleteFromColumn deleteFromColumn =
-        rowMutation.getMutations(0).getDeleteFromColumn();
+        request.getMutations(0).getDeleteFromColumn();
     Assert.assertArrayEquals(qualifier, deleteFromColumn.getColumnQualifier().toByteArray());
-    Assert.assertTrue(rowMutation.getMutations(0).getDeleteFromColumn().hasTimeRange());
+    Assert.assertTrue(request.getMutations(0).getDeleteFromColumn().hasTimeRange());
 
     TimestampRange timeRange = deleteFromColumn.getTimeRange();
     Assert.assertEquals(0L, timeRange.getStartTimestampMicros());
     Assert.assertEquals(bigtableTimestamp, timeRange.getEndTimestampMicros());
-
-    testTwoWayAdapt(delete, deleteAdapter);
   }
 
   @Test
@@ -217,33 +197,9 @@ public class TestDeleteAdapter {
     deleteAdapter.adapt(delete, com.google.cloud.bigtable.data.v2.models.Mutation.create());
   }
 
-  /**
-   * Convert the {@link Delete} to a {@link Mutation}, back to a {@link Delete}, back to
-   * {@link Mutation}. Compare the two mutations for equality. This ensures that the adapt
-   * process is idempotent.
-   */
-  private void testTwoWayAdapt(Delete delete, DeleteAdapter adapter) {
-    // delete -> mutation
-    com.google.cloud.bigtable.data.v2.models.Mutation firstMutation =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    adapter.adapt(delete, firstMutation);
-    MutateRowRequest firstAdapt = toMutateRowRequest(delete.getRow(), firstMutation);
-    // mutation -> delete -> mutation;
-    com.google.cloud.bigtable.data.v2.models.Mutation secondMutation =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    adapter.adapt(adapter.adapt(firstAdapt), secondMutation);
-    MutateRowRequest secondAdapt = toMutateRowRequest(delete.getRow(), secondMutation);
-    // The round trips
-    Assert.assertEquals(firstAdapt, secondAdapt);
-  }
-
-  private MutateRowRequest toMutateRowRequest(byte[] rowKey, com.google.cloud.bigtable.data.v2.models.Mutation mutation) {
-    RowMutation rowMutation = toRowMutationModel(rowKey, mutation);
-    MutateRowRequest.Builder builder = rowMutation.toProto(REQUEST_CONTEXT).toBuilder();
-    return builder.build();
-  }
-
-  private RowMutation toRowMutationModel(byte [] rowKey, com.google.cloud.bigtable.data.v2.models.Mutation mutation) {
-    return RowMutation.create(TABLE_ID, ByteString.copyFrom(rowKey), mutation);
+  private MutateRowRequest adapt(Delete delete) {
+    RowMutation rowMutation = RowMutation.create(TABLE_ID, ByteString.copyFrom(delete.getRow()));
+    deleteAdapter.adapt(delete, rowMutation);
+    return rowMutation.toProto(REQUEST_CONTEXT);
   }
 }
\ No newline at end of file
diff --git a/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/adapters/TestPutAdapter.java b/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/adapters/TestPutAdapter.java
index d044fa867..57f55b0a5 100644
--- a/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/adapters/TestPutAdapter.java
+++ b/bigtable-client-core-parent/bigtable-hbase/src/test/java/com/google/cloud/bigtable/hbase/adapters/TestPutAdapter.java
@@ -31,7 +31,6 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
 @RunWith(JUnit4.class)
@@ -48,7 +47,7 @@ public class TestPutAdapter {
   protected final DataGenerationHelper dataHelper = new DataGenerationHelper();
 
   @Test
-  public void testSingleCellIsConverted() throws IOException {
+  public void testSingleCellIsConverted() {
     byte[] row = dataHelper.randomData("rk-");
     byte[] family = dataHelper.randomData("f");
     byte[] qualifier = dataHelper.randomData("qual");
@@ -57,14 +56,11 @@ public class TestPutAdapter {
 
     Put hbasePut = new Put(row);
     hbasePut.addColumn(family, qualifier, timestamp, value);
-    com.google.cloud.bigtable.data.v2.models.Mutation mutationModel =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    adapter.adapt(hbasePut, mutationModel);
-    MutateRowRequest rowMutationBuilder = toMutateRowRequest(row, mutationModel);
-    Assert.assertArrayEquals(row, rowMutationBuilder.getRowKey().toByteArray());
+    MutateRowRequest request = adapt(hbasePut);
+    Assert.assertArrayEquals(row, request.getRowKey().toByteArray());
 
-    Assert.assertEquals(1, rowMutationBuilder.getMutationsCount());
-    Mutation mutation = rowMutationBuilder.getMutations(0);
+    Assert.assertEquals(1, request.getMutationsCount());
+    Mutation mutation = request.getMutations(0);
 
     Assert.assertEquals(MutationCase.SET_CELL, mutation.getMutationCase());
     SetCell setCell = mutation.getSetCell();
@@ -75,35 +71,10 @@ public class TestPutAdapter {
         TimeUnit.MILLISECONDS.toMicros(timestamp),
         setCell.getTimestampMicros());
     Assert.assertArrayEquals(value, setCell.getValue().toByteArray());
-
-    testTwoWay(hbasePut, adapter);
-  }
-
-  private void testTwoWay(Put put, PutAdapter adapter) throws IOException {
-    testTwoWay(put, adapter, false);
-  }
-
-  private void testTwoWay(Put put, PutAdapter adapter, boolean useUnsafe) throws IOException {
-    com.google.cloud.bigtable.data.v2.models.Mutation firstMutationModel =
-        newMutationBuilder(useUnsafe);
-    adapter.adapt(put, firstMutationModel);
-    MutateRowRequest firstAdapt = toMutateRowRequest(put.getRow(), firstMutationModel);
-    // mutation -> put -> mutation;
-    com.google.cloud.bigtable.data.v2.models.Mutation secondMutationModel =
-        newMutationBuilder(useUnsafe);
-    adapter.adapt(adapter.adapt(firstAdapt), secondMutationModel);
-    MutateRowRequest secondAdapt = toMutateRowRequest(put.getRow(), secondMutationModel);
-    Assert.assertEquals(firstAdapt, secondAdapt);
   }
 
-  private com.google.cloud.bigtable.data.v2.models.Mutation newMutationBuilder(boolean unsafe) {
-    if(unsafe) {
-      return com.google.cloud.bigtable.data.v2.models.Mutation.createUnsafe();
-    }
-    return com.google.cloud.bigtable.data.v2.models.Mutation.create();
-  }
   @Test
-  public void testMultipleCellsInOneFamilyAreConverted() throws IOException {
+  public void testMultipleCellsInOneFamilyAreConverted() {
     byte[] row = dataHelper.randomData("rk-");
     byte[] family = dataHelper.randomData("f1");
     byte[] qualifier1 = dataHelper.randomData("qual1");
@@ -117,14 +88,11 @@ public class TestPutAdapter {
     hbasePut.addColumn(family, qualifier1, timestamp1, value1);
     hbasePut.addColumn(family, qualifier2, timestamp2, value2);
 
-    com.google.cloud.bigtable.data.v2.models.Mutation mutationModel =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    adapter.adapt(hbasePut, mutationModel);
-    MutateRowRequest rowMutationBuilder = toMutateRowRequest(row, mutationModel);
-    Assert.assertArrayEquals(row, rowMutationBuilder.getRowKey().toByteArray());
+    MutateRowRequest request = adapt(hbasePut);
+    Assert.assertArrayEquals(row, request.getRowKey().toByteArray());
 
-    Assert.assertEquals(2, rowMutationBuilder.getMutationsCount());
-    Mutation mutation = rowMutationBuilder.getMutations(0);
+    Assert.assertEquals(2, request.getMutationsCount());
+    Mutation mutation = request.getMutations(0);
 
     Assert.assertEquals(MutationCase.SET_CELL, mutation.getMutationCase());
     SetCell setCell = mutation.getSetCell();
@@ -135,7 +103,7 @@ public class TestPutAdapter {
         setCell.getTimestampMicros());
     Assert.assertArrayEquals(value1, setCell.getValue().toByteArray());
 
-    Mutation mod2 = rowMutationBuilder.getMutations(1);
+    Mutation mod2 = request.getMutations(1);
     SetCell setCell2 = mod2.getSetCell();
     Assert.assertArrayEquals(family, setCell2.getFamilyNameBytes().toByteArray());
     Assert.assertArrayEquals(qualifier2, setCell2.getColumnQualifier().toByteArray());
@@ -143,12 +111,10 @@ public class TestPutAdapter {
         TimeUnit.MILLISECONDS.toMicros(timestamp2),
         setCell2.getTimestampMicros());
     Assert.assertArrayEquals(value2, setCell2.getValue().toByteArray());
-
-    testTwoWay(hbasePut, adapter);
   }
 
   @Test
-  public void testMultipleCellsInMultipleFamiliesAreConverted() throws IOException {
+  public void testMultipleCellsInMultipleFamiliesAreConverted() {
     byte[] row = dataHelper.randomData("rk-");
     byte[] family1 = dataHelper.randomData("f1");
     byte[] family2 = dataHelper.randomData("f2");
@@ -163,14 +129,12 @@ public class TestPutAdapter {
     hbasePut.addColumn(family1, qualifier1, timestamp1, value1);
     hbasePut.addColumn(family2, qualifier2, timestamp2, value2);
 
-    com.google.cloud.bigtable.data.v2.models.Mutation mutationModel =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    adapter.adapt(hbasePut, mutationModel);
-    MutateRowRequest rowMutationBuilder = toMutateRowRequest(row, mutationModel);
-    Assert.assertArrayEquals(row, rowMutationBuilder.getRowKey().toByteArray());
+    MutateRowRequest request = adapt(hbasePut);
+
+    Assert.assertArrayEquals(row, request.getRowKey().toByteArray());
 
-    Assert.assertEquals(2, rowMutationBuilder.getMutationsCount());
-    Mutation mutation1 = rowMutationBuilder.getMutations(0);
+    Assert.assertEquals(2, request.getMutationsCount());
+    Mutation mutation1 = request.getMutations(0);
 
     Assert.assertEquals(MutationCase.SET_CELL, mutation1.getMutationCase());
     SetCell setCell = mutation1.getSetCell();
@@ -181,7 +145,7 @@ public class TestPutAdapter {
         setCell.getTimestampMicros());
     Assert.assertArrayEquals(value1, setCell.getValue().toByteArray());
 
-    Mutation mutation2 = rowMutationBuilder.getMutations(1);
+    Mutation mutation2 = request.getMutations(1);
     SetCell setCell2 = mutation2.getSetCell();
     Assert.assertArrayEquals(family2, setCell2.getFamilyNameBytes().toByteArray());
     Assert.assertArrayEquals(qualifier2, setCell2.getColumnQualifier().toByteArray());
@@ -189,28 +153,29 @@ public class TestPutAdapter {
         TimeUnit.MILLISECONDS.toMicros(timestamp2),
         setCell2.getTimestampMicros());
     Assert.assertArrayEquals(value2, setCell2.getValue().toByteArray());
-
-    testTwoWay(hbasePut, adapter);
   }
 
   @Test
-  public void testUnsetTimestampsArePopulated() throws IOException {
+  public void testUnsetTimestampsArePopulated() {
     byte[] row = dataHelper.randomData("rk-");
     byte[] family1 = dataHelper.randomData("f1");
     byte[] qualifier1 = dataHelper.randomData("qual1");
     byte[] value1 = dataHelper.randomData("v1");
     long startTimeMillis = System.currentTimeMillis();
 
-    Put hbasePut = new Put(row).addColumn(family1, qualifier1, value1);
+    Put hbasePut = new Put(row)
+        .addColumn(family1, qualifier1, value1);
 
-    com.google.cloud.bigtable.data.v2.models.Mutation mutationModel =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    adapter.adapt(hbasePut, mutationModel);
-    MutateRowRequest rowMutationBuilder = toMutateRowRequest(row, mutationModel);
-    Assert.assertArrayEquals(row, rowMutationBuilder.getRowKey().toByteArray());
+    com.google.cloud.bigtable.data.v2.models.Mutation unsafeMutation =
+        com.google.cloud.bigtable.data.v2.models.Mutation.createUnsafe();
+    adapter.adapt(hbasePut, unsafeMutation);
+    MutateRowRequest request = RowMutation
+        .create(TABLE_ID, ByteString.copyFrom(hbasePut.getRow()), unsafeMutation)
+        .toProto(REQUEST_CONTEXT);
+    Assert.assertArrayEquals(row, request.getRowKey().toByteArray());
 
-    Assert.assertEquals(1, rowMutationBuilder.getMutationsCount());
-    Mutation mutation = rowMutationBuilder.getMutations(0);
+    Assert.assertEquals(1, request.getMutationsCount());
+    Mutation mutation = request.getMutations(0);
 
     Assert.assertEquals(MutationCase.SET_CELL, mutation.getMutationCase());
     SetCell setCell = mutation.getSetCell();
@@ -220,12 +185,10 @@ public class TestPutAdapter {
     Assert.assertTrue(startTimeMillis * 1000 <= setCell.getTimestampMicros());
     Assert.assertTrue(setCell.getTimestampMicros() <= System.currentTimeMillis() * 1000);
     Assert.assertArrayEquals(value1, setCell.getValue().toByteArray());
-
-    testTwoWay(hbasePut, adapter);
   }
 
   @Test
-  public void testUnsetTimestampsAreNotPopulated() throws IOException {
+  public void testUnsetTimestampsAreNotPopulated() {
     PutAdapter adapter = new PutAdapter(-1, false);
 
     byte[] row = dataHelper.randomData("rk-");
@@ -234,15 +197,17 @@ public class TestPutAdapter {
     byte[] value1 = dataHelper.randomData("v1");
 
     Put hbasePut = new Put(row).addColumn(family1, qualifier1, value1);
-
-    com.google.cloud.bigtable.data.v2.models.Mutation mutationModel =
+    com.google.cloud.bigtable.data.v2.models.Mutation unsafeMutation =
         com.google.cloud.bigtable.data.v2.models.Mutation.createUnsafe();
-    adapter.adapt(hbasePut, mutationModel);
-    MutateRowRequest rowMutationBuilder = toMutateRowRequest(row, mutationModel);
-    Assert.assertArrayEquals(row, rowMutationBuilder.getRowKey().toByteArray());
+    adapter.adapt(hbasePut, unsafeMutation);
+    RowMutation rowMutation =
+        RowMutation.create(TABLE_ID, ByteString.copyFrom(hbasePut.getRow()), unsafeMutation);
+    MutateRowRequest request = rowMutation.toProto(REQUEST_CONTEXT);
+
+    Assert.assertArrayEquals(row, request.getRowKey().toByteArray());
 
-    Assert.assertEquals(1, rowMutationBuilder.getMutationsCount());
-    Mutation mutation = rowMutationBuilder.getMutations(0);
+    Assert.assertEquals(1, request.getMutationsCount());
+    Mutation mutation = request.getMutations(0);
 
     Assert.assertEquals(MutationCase.SET_CELL, mutation.getMutationCase());
     SetCell setCell = mutation.getSetCell();
@@ -251,19 +216,17 @@ public class TestPutAdapter {
     Assert.assertArrayEquals(qualifier1, setCell.getColumnQualifier().toByteArray());
     Assert.assertEquals(-1, setCell.getTimestampMicros());
     Assert.assertArrayEquals(value1, setCell.getValue().toByteArray());
-
-    testTwoWay(hbasePut, adapter, true);
   }
 
   @Test(expected = IllegalArgumentException.class)
   public void testEmptyPut() {
     byte[] row = dataHelper.randomData("rk-");
     Put emptyPut = new Put(row);
-    adapter.adapt(emptyPut, com.google.cloud.bigtable.data.v2.models.Mutation.create());
+    adapt(emptyPut);
   }
 
   @Test
-  public void testRetry() throws IOException{
+  public void testRetry() {
     byte[] row = dataHelper.randomData("rk-");
     byte[] family1 = dataHelper.randomData("f1");
     byte[] qualifier1 = dataHelper.randomData("qual1");
@@ -271,23 +234,16 @@ public class TestPutAdapter {
 
     Put hbasePut = new Put(row, System.currentTimeMillis());
     hbasePut.addColumn(family1, qualifier1, value1);
-    com.google.cloud.bigtable.data.v2.models.Mutation mutationModel =
-        com.google.cloud.bigtable.data.v2.models.Mutation.create();
-    adapter.adapt(hbasePut, mutationModel);
-    MutateRowRequest request = toMutateRowRequest(row, mutationModel);
+    MutateRowRequest request = adapt(hbasePut);
 
     // Is the Put retryable?
     Assert.assertTrue(BigtableDataGrpcClient.IS_RETRYABLE_MUTATION.apply(request));
-    testTwoWay(hbasePut, adapter);
   }
 
-  private MutateRowRequest toMutateRowRequest(byte[] rowKey, com.google.cloud.bigtable.data.v2.models.Mutation mutation) {
-    RowMutation rowMutation = toRowMutationModel(rowKey, mutation);
-    MutateRowRequest.Builder builder = rowMutation.toProto(REQUEST_CONTEXT).toBuilder();
-    return builder.build();
+  private MutateRowRequest adapt(Put put) {
+    RowMutation rowMutation = RowMutation.create(TABLE_ID, ByteString.copyFrom(put.getRow()));
+    adapter.adapt(put, rowMutation);
+    return rowMutation.toProto(REQUEST_CONTEXT);
   }
 
-  private RowMutation toRowMutationModel(byte [] rowKey, com.google.cloud.bigtable.data.v2.models.Mutation mutation) {
-    return RowMutation.create(TABLE_ID, ByteString.copyFrom(rowKey), mutation);
-  }
 }
\ No newline at end of file