Revert "IGNITE-15548 Fix Table API classes hierarchy (#353)" (#361)

This reverts commit 0c82a79220df82f304ea60a1c624e5effbac936d.
diff --git a/assembly/README.md b/assembly/README.md
index 982f40b..b67644c 100644
--- a/assembly/README.md
+++ b/assembly/README.md
@@ -38,7 +38,7 @@
 
 The following examples are included:
 * `TableExample` - demonstrates the usage of the `org.apache.ignite.table.Table` API
-* `KeyValueBinaryViewExample` - demonstrates the usage of the `org.apache.ignite.table.KeyValueView` API
+* `KeyValueBinaryViewExample` - demonstrates the usage of the `org.apache.ignite.table.KeyValueBinaryView` API
 
 To run an example, do the following:
 1. Import the examples project into you IDE.
diff --git a/docs/_docs/quick-start/getting-started-guide.adoc b/docs/_docs/quick-start/getting-started-guide.adoc
index 5b7e527..e04dacd 100644
--- a/docs/_docs/quick-start/getting-started-guide.adoc
+++ b/docs/_docs/quick-start/getting-started-guide.adoc
@@ -187,7 +187,7 @@
 The project includes the following examples:
 
 * `TableExample` demonstrates the usage of the `org.apache.ignite.table.Table` API to create a table. It also shows how to get data from a table, or insert a line into a table.
-* `KeyValueBinaryViewExample` - demonstrates the usage of the `org.apache.ignite.table.KeyValueView` API to insert a line into a table.
+* `KeyValueBinaryViewExample` - demonstrates the usage of the `org.apache.ignite.table.KeyValueBinaryView` API to insert a line into a table.
 
 To run an example:
 
diff --git a/examples/README.md b/examples/README.md
index ad4d977..98934bc 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -7,7 +7,7 @@
 
 The following examples are included:
 * `TableExample` - demonstrates the usage of the `org.apache.ignite.table.Table` API
-* `KeyValueBinaryViewExample` - demonstrates the usage of the `org.apache.ignite.table.KeyValueView` API
+* `KeyValueBinaryViewExample` - demonstrates the usage of the `org.apache.ignite.table.KeyValueBinaryView` API
 
 To run an example, do the following:
 1. Import the examples project into you IDE.
diff --git a/examples/src/main/java/org/apache/ignite/example/table/KeyValueBinaryViewExample.java b/examples/src/main/java/org/apache/ignite/example/table/KeyValueBinaryViewExample.java
index 4173ace..63511ed 100644
--- a/examples/src/main/java/org/apache/ignite/example/table/KeyValueBinaryViewExample.java
+++ b/examples/src/main/java/org/apache/ignite/example/table/KeyValueBinaryViewExample.java
@@ -21,12 +21,12 @@
 import java.nio.file.Path;
 import org.apache.ignite.app.Ignite;
 import org.apache.ignite.app.IgnitionManager;
-import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 
 /**
- * This example demonstrates the usage of the {@link KeyValueView} API.
+ * This example demonstrates the usage of the {@link KeyValueBinaryView} API.
  * <p>
  * To run the example, do the following:
  * <ol>
@@ -79,7 +79,7 @@
             )
         );
 
-        KeyValueView<Tuple, Tuple> kvView = accounts.keyValueView();
+        KeyValueBinaryView kvView = accounts.kvView();
 
         //---------------------------------------------------------------------------------
         //
@@ -103,7 +103,7 @@
         //
         //---------------------------------------------------------------------------------
 
-        value = accounts.recordView().get(key);
+        value = accounts.get(key);
 
         System.out.println(
             "Retrieved using Key-Value API\n" +
diff --git a/examples/src/main/java/org/apache/ignite/example/table/TableExample.java b/examples/src/main/java/org/apache/ignite/example/table/TableExample.java
index 0affc66..6fdd0f4 100644
--- a/examples/src/main/java/org/apache/ignite/example/table/TableExample.java
+++ b/examples/src/main/java/org/apache/ignite/example/table/TableExample.java
@@ -21,7 +21,6 @@
 import java.nio.file.Path;
 import org.apache.ignite.app.Ignite;
 import org.apache.ignite.app.IgnitionManager;
-import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 
@@ -62,7 +61,7 @@
         //
         //---------------------------------------------------------------------------------
 
-        RecordView<Tuple> accounts = ignite.tables().createTable("PUBLIC.accounts", tbl -> tbl
+        Table accounts = ignite.tables().createTable("PUBLIC.accounts", tbl -> tbl
             .changeName("PUBLIC.accounts")
             .changeColumns(cols -> cols
                 .create("0", c -> c.changeName("accountNumber").changeType(t -> t.changeType("int32")).changeNullable(false))
@@ -77,7 +76,7 @@
                     .changeColumns(cols -> cols.create("0", c -> c.changeName("accountNumber").changeAsc(true)))
                 )
             )
-        ).recordView();
+        );
 
         //---------------------------------------------------------------------------------
         //
diff --git a/modules/api/src/main/java/org/apache/ignite/table/KeyValueBinaryView.java b/modules/api/src/main/java/org/apache/ignite/table/KeyValueBinaryView.java
new file mode 100644
index 0000000..98b3157
--- /dev/null
+++ b/modules/api/src/main/java/org/apache/ignite/table/KeyValueBinaryView.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.table;
+
+import org.apache.ignite.tx.Transaction;
+
+/**
+ * Key-value view of table provides methods to access the data using key-value approach and
+ * regarding the binary object concept.
+ */
+public interface KeyValueBinaryView extends KeyValueView<Tuple, Tuple> {
+    /** {@inheritDoc} */
+    @Override KeyValueBinaryView withTransaction(Transaction tx);
+}
diff --git a/modules/api/src/main/java/org/apache/ignite/table/KeyValueView.java b/modules/api/src/main/java/org/apache/ignite/table/KeyValueView.java
index 8275474..ebd2021 100644
--- a/modules/api/src/main/java/org/apache/ignite/table/KeyValueView.java
+++ b/modules/api/src/main/java/org/apache/ignite/table/KeyValueView.java
@@ -399,7 +399,7 @@
     @Nullable Transaction transaction();
 
     /**
-     * Enlists a view into the transaction.
+     * Enslists a view into the transaction.
      *
      * @param tx The transaction.
      * @return Transactional view.
diff --git a/modules/api/src/main/java/org/apache/ignite/table/RecordView.java b/modules/api/src/main/java/org/apache/ignite/table/RecordView.java
index 1352515..eb404be 100644
--- a/modules/api/src/main/java/org/apache/ignite/table/RecordView.java
+++ b/modules/api/src/main/java/org/apache/ignite/table/RecordView.java
@@ -17,353 +17,43 @@
 
 package org.apache.ignite.table;
 
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Map;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.table.mapper.Mappers;
 import org.apache.ignite.tx.Transaction;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 /**
- * Table view interface provides methods to access table records.
+ * Record view of table provides methods to access table records.
+ * <p>
  *
- * @param <R> Mapped record type.
+ * @param <R> Record type.
+ * @apiNote 'Record class field' &gt;-&lt; 'table column' mapping laid down in implementation.
+ * @apiNote Some methods require a record with the only key fields set. This is not mandatory requirement
+ * and value fields will be just ignored.
+ * @see Mappers
  */
-public interface RecordView<R> {
+public interface RecordView<R> extends TableView<R> {
     /**
-     * Gets a record with same key columns values as given one from the table.
+     * Fills given record with the values from the table.
+     * Similar to {@link #get(Object)}, but return original object with filled value fields.
+     * <p>
+     * All value fields of given object will be rewritten.
      *
-     * @param keyRec A record with key columns set.
-     * The record cannot be {@code null}.
-     * @return A record with all columns filled from the table.
+     * @param recObjToFill Record object with key fields to be filled.
+     * @return Record with all fields filled from the table.
      */
-    R get(@NotNull R keyRec);
+    R fill(R recObjToFill);
 
     /**
-     * Asynchronously gets a record with same key columns values as given one from the table.
+     * Asynchronously fills given record with the values from the table.
+     * Similar to {@link #get(Object)}, but return original object with filled value fields.
+     * <p>
+     * All value fields of given object will be rewritten.
      *
-     * @param keyRec A record with key columns set.
-     * The record cannot be {@code null}.
+     * @param recObjToFill Record object with key fields to be filled.
      * @return Future representing pending completion of the operation.
      */
-    @NotNull CompletableFuture<R> getAsync(@NotNull R keyRec);
+    CompletableFuture<R> fillAsync(R recObjToFill);
 
-    /**
-     * Get records from the table.
-     *
-     * @param keyRecs Records with key columns set.
-     * The records cannot be {@code null}.
-     * @return Records with all columns filled from the table.
-     */
-    Collection<R> getAll(@NotNull Collection<R> keyRecs);
-
-    /**
-     * Asynchronously get records from the table.
-     *
-     * @param keyRecs Records with key columns set.
-     * The records cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Collection<R>> getAllAsync(@NotNull Collection<R> keyRecs);
-
-    /**
-     * Inserts a record into the table if does not exist or replaces the existed one.
-     *
-     * @param rec A record to insert into the table.
-     * The record cannot be {@code null}.
-     */
-    void upsert(@NotNull R rec);
-
-    /**
-     * Asynchronously inserts a record into the table if does not exist or replaces the existed one.
-     *
-     * @param rec A record to insert into the table.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Void> upsertAsync(@NotNull R rec);
-
-    /**
-     * Insert records into the table if does not exist or replaces the existed one.
-     *
-     * @param recs Records to insert into the table.
-     * The records cannot be {@code null}.
-     */
-    void upsertAll(@NotNull Collection<R> recs);
-
-    /**
-     * Asynchronously inserts a record into the table if does not exist or replaces the existed one.
-     *
-     * @param recs Records to insert into the table.
-     * The records cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Void> upsertAllAsync(@NotNull Collection<R> recs);
-
-    /**
-     * Inserts a record into the table or replaces if exists and return replaced previous record.
-     *
-     * @param rec A record to insert into the table.
-     * The record cannot be {@code null}.
-     * @return Replaced record or {@code null} if not existed.
-     */
-    R getAndUpsert(@NotNull R rec);
-
-    /**
-     * Asynchronously inserts a record into the table or replaces if exists and return replaced previous record.
-     *
-     * @param rec A record to insert into the table.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<R> getAndUpsertAsync(@NotNull R rec);
-
-    /**
-     * Inserts a record into the table if not exists.
-     *
-     * @param rec A record to insert into the table.
-     * The record cannot be {@code null}.
-     * @return {@code True} if successful, {@code false} otherwise.
-     */
-    boolean insert(@NotNull R rec);
-
-    /**
-     * Asynchronously inserts a record into the table if not exists.
-     *
-     * @param rec A record to insert into the table.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Boolean> insertAsync(@NotNull R rec);
-
-    /**
-     * Insert records into the table which do not exist, skipping existed ones.
-     *
-     * @param recs Records to insert into the table.
-     * The records cannot be {@code null}.
-     * @return Skipped records.
-     */
-    Collection<R> insertAll(@NotNull Collection<R> recs);
-
-    /**
-     * Asynchronously insert records into the table which do not exist, skipping existed ones.
-     *
-     * @param recs Records to insert into the table.
-     * The records cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Collection<R>> insertAllAsync(@NotNull Collection<R> recs);
-
-    /**
-     * Replaces an existed record associated with the same key columns values as the given one has.
-     *
-     * @param rec A record to replace with.
-     * The record cannot be {@code null}.
-     * @return {@code True} if old record was found and replaced successfully, {@code false} otherwise.
-     */
-    boolean replace(@NotNull R rec);
-
-    /**
-     * Asynchronously replaces an existed record associated with the same key columns values as the given one has.
-     *
-     * @param rec A record to replace with.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull R rec);
-
-    /**
-     * Replaces an expected record in the table with the given new one.
-     *
-     * @param oldRec A record to replace.
-     * The record cannot be {@code null}.
-     * @param newRec A record to replace with.
-     * The record cannot be {@code null}.
-     * @return {@code True} if the old record replaced successfully, {@code false} otherwise.
-     */
-    boolean replace(@NotNull R oldRec, @NotNull R newRec);
-
-    /**
-     * Asynchronously replaces an expected record in the table with the given new one.
-     *
-     * @param oldRec A record to replace.
-     * The record cannot be {@code null}.
-     * @param newRec A record to replace with.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull R oldRec, @NotNull R newRec);
-
-    /**
-     * Gets an existed record associated with the same key columns values as the given one has,
-     * then replaces with the given one.
-     *
-     * @param rec A record to replace with.
-     * The record cannot be {@code null}.
-     * @return Replaced record or {@code null} if not existed.
-     */
-    R getAndReplace(@NotNull R rec);
-
-    /**
-     * Asynchronously gets an existed record associated with the same key columns values as the given one has,
-     * then replaces with the given one.
-     *
-     * @param rec A record to replace with.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<R> getAndReplaceAsync(@NotNull R rec);
-
-    /**
-     * Deletes a record with the same key columns values as the given one from the table.
-     *
-     * @param keyRec A record with key columns set.
-     * The record cannot be {@code null}.
-     * @return {@code True} if removed successfully, {@code false} otherwise.
-     */
-    boolean delete(@NotNull R keyRec);
-
-    /**
-     * Asynchronously deletes a record with the same key columns values as the given one from the table.
-     *
-     * @param keyRec A record with key columns set.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Boolean> deleteAsync(@NotNull R keyRec);
-
-    /**
-     * Deletes the given record from the table.
-     *
-     * @param rec A record to delete.
-     * The record cannot be {@code null}.
-     * @return {@code True} if removed successfully, {@code false} otherwise.
-     */
-    boolean deleteExact(@NotNull R rec);
-
-    /**
-     * Asynchronously deletes given record from the table.
-     *
-     * @param rec A record to delete.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Boolean> deleteExactAsync(@NotNull R rec);
-
-    /**
-     * Gets then deletes a record with the same key columns values from the table.
-     *
-     * @param rec A record with key columns set.
-     * The record cannot be {@code null}.
-     * @return Removed record or {@code null} if not existed.
-     */
-    R getAndDelete(@NotNull R rec);
-
-    /**
-     * Asynchronously gets then deletes a record with the same key columns values from the table.
-     *
-     * @param rec A record with key columns set.
-     * The record cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<R> getAndDeleteAsync(@NotNull R rec);
-
-    /**
-     * Remove records with the same key columns values as the given one has from the table.
-     *
-     * @param recs Records with key columns set.
-     * The records cannot be {@code null}.
-     * @return Records with key columns set that did not exist.
-     */
-    Collection<R> deleteAll(@NotNull Collection<R> recs);
-
-    /**
-     * Asynchronously remove records with the same key columns values as the given one has from the table.
-     *
-     * @param recs Records with key columns set.
-     * The records cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Collection<R>> deleteAllAsync(@NotNull Collection<R> recs);
-
-    /**
-     * Remove given records from the table.
-     *
-     * @param recs Records to delete.
-     * The records cannot be {@code null}.
-     * @return Records that were not deleted.
-     */
-    Collection<R> deleteAllExact(@NotNull Collection<R> recs);
-
-    /**
-     * Asynchronously remove given records from the table.
-     *
-     * @param recs Records to delete.
-     * The records cannot be {@code null}.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull CompletableFuture<Collection<R>> deleteAllExactAsync(@NotNull Collection<R> recs);
-
-    /**
-     * Executes an InvokeProcessor code against a record with the same key columns values as the given one has.
-     *
-     * @param keyRec A record with key columns set.
-     * The record cannot be {@code null}.
-     * @param proc Invoke processor.
-     * @param <T> InvokeProcessor result type.
-     * @return Results of the processing.
-     */
-    <T extends Serializable> T invoke(@NotNull R keyRec, InvokeProcessor<R, R, T> proc);
-
-    /**
-     * Asynchronously executes an InvokeProcessor code against a record
-     * with the same key columns values as the given one has.
-     *
-     * @param keyRec A record with key columns set.
-     * The record cannot be {@code null}.
-     * @param proc Invoke processor.
-     * @param <T> InvokeProcessor result type.
-     * @return Future representing pending completion of the operation.
-     */
-    @NotNull <T extends Serializable> CompletableFuture<T> invokeAsync(@NotNull R keyRec, InvokeProcessor<R, R, T> proc);
-
-    /**
-     * Executes an InvokeProcessor code against records with the same key columns values as the given ones has.
-     *
-     * @param keyRecs Records with key columns set.
-     * The records cannot be {@code null}.
-     * @param proc Invoke processor.
-     * @param <T> InvokeProcessor result type.
-     * @return Results of the processing.
-     */
-    <T extends Serializable> Map<R, T> invokeAll(@NotNull Collection<R> keyRecs, InvokeProcessor<R, R, T> proc);
-
-    /**
-     * Asynchronously executes an InvokeProcessor against records with the same key columns values as the given ones
-     * has.
-     *
-     * @param keyRecs Records with key columns set.
-     * The records cannot be {@code null}.
-     * @param proc Invoke processor.
-     * @param <T> InvokeProcessor result type.
-     * @return Results of the processing.
-     */
-    @NotNull <T extends Serializable> CompletableFuture<Map<R, T>> invokeAllAsync(@NotNull Collection<R> keyRecs,
-        InvokeProcessor<R, R, T> proc);
-
-    /**
-     * Returns current transaction.
-     *
-     * @return Current transaction or null if a table is not enlisted in a transaction.
-     */
-    @Nullable Transaction transaction();
-
-    /**
-     * Enlists a view into the transaction.
-     *
-     * @param tx The transaction.
-     * @return Transactional view.
-     */
-    RecordView<R> withTransaction(Transaction tx);
+    /** {@inheritDoc} */
+    @Override RecordView<R> withTransaction(Transaction tx);
 }
diff --git a/modules/api/src/main/java/org/apache/ignite/table/Table.java b/modules/api/src/main/java/org/apache/ignite/table/Table.java
index cd5be9e..f57b396 100644
--- a/modules/api/src/main/java/org/apache/ignite/table/Table.java
+++ b/modules/api/src/main/java/org/apache/ignite/table/Table.java
@@ -21,18 +21,26 @@
 import org.apache.ignite.table.mapper.Mappers;
 import org.apache.ignite.table.mapper.RecordMapper;
 import org.apache.ignite.table.mapper.ValueMapper;
+import org.apache.ignite.tx.IgniteTransactions;
+import org.apache.ignite.tx.Transaction;
 import org.jetbrains.annotations.NotNull;
 
 /**
- * Table provides different views (key-value vs record) and approaches (mapped-object vs binary) to reach the data.
+ * Table view of table provides methods to access table records regarding binary object concept.
  * <p>
- * Binary table views might be useful in cases (but not limited) when user key-value classes are not in classpath
- * and/or when deserialization of whole table record is unwanted due to performance reasons.
+ * Provided different views (key-value vs record) and approaches (mapped-object vs binary) to reach the data.
+ * <p>
+ * Binary table views might be useful in cases (but not limited) if user key-value classes are not in classpath
+ * or serialization/deserialization is unwanted due to performance reasons.
  *
+ * @apiNote Some methods require a record with the only key columns set. This is not mandatory requirement
+ * and value columns will be just ignored.
  * @see RecordView
+ * @see Table
  * @see KeyValueView
+ * @see KeyValueBinaryView
  */
-public interface Table {
+public interface Table extends TableView<Tuple> {
     /**
      * Gets a name of the table.
      *
@@ -50,13 +58,6 @@
     <R> RecordView<R> recordView(RecordMapper<R> recMapper);
 
     /**
-     * Creates record view of table regarding the binary object concept.
-     *
-     * @return Table record view.
-     */
-    RecordView<Tuple> recordView();
-
-    /**
      * Creates key-value view of table for key-value class mappers provided.
      *
      * @param keyMapper Key class mapper.
@@ -65,14 +66,24 @@
      * @param <V> Value type.
      * @return Table key-value view.
      */
-    <K, V> KeyValueView<K, V> keyValueView(KeyMapper<K> keyMapper, ValueMapper<V> valMapper);
+    <K, V> KeyValueView<K, V> kvView(KeyMapper<K> keyMapper, ValueMapper<V> valMapper);
 
     /**
      * Creates key-value view of table regarding the binary object concept.
      *
      * @return Table key-value view.
      */
-    KeyValueView<Tuple, Tuple> keyValueView();
+    KeyValueBinaryView kvView();
+
+    /**
+     * Creates a transactional view of the table.
+     *
+     * @param tx The transaction.
+     * @return Transactional table view.
+     * @see Transaction
+     * @see IgniteTransactions
+     */
+    @Override Table withTransaction(Transaction tx);
 
     /**
      * Creates record view of table for record class provided.
@@ -94,7 +105,7 @@
      * @param <V> Value type.
      * @return Table key-value view.
      */
-    default <K, V> KeyValueView<K, V> keyValueView(Class<K> keyCls, Class<V> valCls) {
-        return keyValueView(Mappers.ofKeyClass(keyCls), Mappers.ofValueClass(valCls));
+    default <K, V> KeyValueView<K, V> kvView(Class<K> keyCls, Class<V> valCls) {
+        return kvView(Mappers.ofKeyClass(keyCls), Mappers.ofValueClass(valCls));
     }
 }
diff --git a/modules/api/src/main/java/org/apache/ignite/table/TableView.java b/modules/api/src/main/java/org/apache/ignite/table/TableView.java
new file mode 100644
index 0000000..d85c8bd
--- /dev/null
+++ b/modules/api/src/main/java/org/apache/ignite/table/TableView.java
@@ -0,0 +1,371 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.table;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.tx.Transaction;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Table view interface provides methods to access table records.
+ *
+ * @param <R> Mapped record type.
+ * @apiNote Some methods require a record with the only key columns set. This is not mandatory requirement
+ * and value columns will be just ignored.
+ */
+public interface TableView<R> {
+    /**
+     * Gets a record with same key columns values as given one from the table.
+     *
+     * @param keyRec A record with key columns set.
+     * The record cannot be {@code null}.
+     * @return A record with all columns filled from the table.
+     */
+    R get(@NotNull R keyRec);
+
+    /**
+     * Asynchronously gets a record with same key columns values as given one from the table.
+     *
+     * @param keyRec A record with key columns set.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<R> getAsync(@NotNull R keyRec);
+
+    /**
+     * Get records from the table.
+     *
+     * @param keyRecs Records with key columns set.
+     * The records cannot be {@code null}.
+     * @return Records with all columns filled from the table.
+     */
+    Collection<R> getAll(@NotNull Collection<R> keyRecs);
+
+    /**
+     * Asynchronously get records from the table.
+     *
+     * @param keyRecs Records with key columns set.
+     * The records cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Collection<R>> getAllAsync(@NotNull Collection<R> keyRecs);
+
+    /**
+     * Inserts a record into the table if does not exist or replaces the existed one.
+     *
+     * @param rec A record to insert into the table.
+     * The record cannot be {@code null}.
+     */
+    void upsert(@NotNull R rec);
+
+    /**
+     * Asynchronously inserts a record into the table if does not exist or replaces the existed one.
+     *
+     * @param rec A record to insert into the table.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Void> upsertAsync(@NotNull R rec);
+
+    /**
+     * Insert records into the table if does not exist or replaces the existed one.
+     *
+     * @param recs Records to insert into the table.
+     * The records cannot be {@code null}.
+     */
+    void upsertAll(@NotNull Collection<R> recs);
+
+    /**
+     * Asynchronously inserts a record into the table if does not exist or replaces the existed one.
+     *
+     * @param recs Records to insert into the table.
+     * The records cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Void> upsertAllAsync(@NotNull Collection<R> recs);
+
+    /**
+     * Inserts a record into the table or replaces if exists and return replaced previous record.
+     *
+     * @param rec A record to insert into the table.
+     * The record cannot be {@code null}.
+     * @return Replaced record or {@code null} if not existed.
+     */
+    R getAndUpsert(@NotNull R rec);
+
+    /**
+     * Asynchronously inserts a record into the table or replaces if exists and return replaced previous record.
+     *
+     * @param rec A record to insert into the table.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<R> getAndUpsertAsync(@NotNull R rec);
+
+    /**
+     * Inserts a record into the table if not exists.
+     *
+     * @param rec A record to insert into the table.
+     * The record cannot be {@code null}.
+     * @return {@code True} if successful, {@code false} otherwise.
+     */
+    boolean insert(@NotNull R rec);
+
+    /**
+     * Asynchronously inserts a record into the table if not exists.
+     *
+     * @param rec A record to insert into the table.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Boolean> insertAsync(@NotNull R rec);
+
+    /**
+     * Insert records into the table which do not exist, skipping existed ones.
+     *
+     * @param recs Records to insert into the table.
+     * The records cannot be {@code null}.
+     * @return Skipped records.
+     */
+    Collection<R> insertAll(@NotNull Collection<R> recs);
+
+    /**
+     * Asynchronously insert records into the table which do not exist, skipping existed ones.
+     *
+     * @param recs Records to insert into the table.
+     * The records cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Collection<R>> insertAllAsync(@NotNull Collection<R> recs);
+
+    /**
+     * Replaces an existed record associated with the same key columns values as the given one has.
+     *
+     * @param rec A record to replace with.
+     * The record cannot be {@code null}.
+     * @return {@code True} if old record was found and replaced successfully, {@code false} otherwise.
+     */
+    boolean replace(@NotNull R rec);
+
+    /**
+     * Asynchronously replaces an existed record associated with the same key columns values as the given one has.
+     *
+     * @param rec A record to replace with.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull R rec);
+
+    /**
+     * Replaces an expected record in the table with the given new one.
+     *
+     * @param oldRec A record to replace.
+     * The record cannot be {@code null}.
+     * @param newRec A record to replace with.
+     * The record cannot be {@code null}.
+     * @return {@code True} if the old record replaced successfully, {@code false} otherwise.
+     */
+    boolean replace(@NotNull R oldRec, @NotNull R newRec);
+
+    /**
+     * Asynchronously replaces an expected record in the table with the given new one.
+     *
+     * @param oldRec A record to replace.
+     * The record cannot be {@code null}.
+     * @param newRec A record to replace with.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull R oldRec, @NotNull R newRec);
+
+    /**
+     * Gets an existed record associated with the same key columns values as the given one has,
+     * then replaces with the given one.
+     *
+     * @param rec A record to replace with.
+     * The record cannot be {@code null}.
+     * @return Replaced record or {@code null} if not existed.
+     */
+    R getAndReplace(@NotNull R rec);
+
+    /**
+     * Asynchronously gets an existed record associated with the same key columns values as the given one has,
+     * then replaces with the given one.
+     *
+     * @param rec A record to replace with.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<R> getAndReplaceAsync(@NotNull R rec);
+
+    /**
+     * Deletes a record with the same key columns values as the given one from the table.
+     *
+     * @param keyRec A record with key columns set.
+     * The record cannot be {@code null}.
+     * @return {@code True} if removed successfully, {@code false} otherwise.
+     */
+    boolean delete(@NotNull R keyRec);
+
+    /**
+     * Asynchronously deletes a record with the same key columns values as the given one from the table.
+     *
+     * @param keyRec A record with key columns set.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Boolean> deleteAsync(@NotNull R keyRec);
+
+    /**
+     * Deletes the given record from the table.
+     *
+     * @param rec A record to delete.
+     * The record cannot be {@code null}.
+     * @return {@code True} if removed successfully, {@code false} otherwise.
+     */
+    boolean deleteExact(@NotNull R rec);
+
+    /**
+     * Asynchronously deletes given record from the table.
+     *
+     * @param rec A record to delete.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Boolean> deleteExactAsync(@NotNull R rec);
+
+    /**
+     * Gets then deletes a record with the same key columns values from the table.
+     *
+     * @param rec A record with key columns set.
+     * The record cannot be {@code null}.
+     * @return Removed record or {@code null} if not existed.
+     */
+    R getAndDelete(@NotNull R rec);
+
+    /**
+     * Asynchronously gets then deletes a record with the same key columns values from the table.
+     *
+     * @param rec A record with key columns set.
+     * The record cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<R> getAndDeleteAsync(@NotNull R rec);
+
+    /**
+     * Remove records with the same key columns values as the given one has from the table.
+     *
+     * @param recs Records with key columns set.
+     * The records cannot be {@code null}.
+     * @return Records with key columns set that did not exist.
+     */
+    Collection<R> deleteAll(@NotNull Collection<R> recs);
+
+    /**
+     * Asynchronously remove records with the same key columns values as the given one has from the table.
+     *
+     * @param recs Records with key columns set.
+     * The records cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Collection<R>> deleteAllAsync(@NotNull Collection<R> recs);
+
+    /**
+     * Remove given records from the table.
+     *
+     * @param recs Records to delete.
+     * The records cannot be {@code null}.
+     * @return Records that were not deleted.
+     */
+    Collection<R> deleteAllExact(@NotNull Collection<R> recs);
+
+    /**
+     * Asynchronously remove given records from the table.
+     *
+     * @param recs Records to delete.
+     * The records cannot be {@code null}.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull CompletableFuture<Collection<R>> deleteAllExactAsync(@NotNull Collection<R> recs);
+
+    /**
+     * Executes an InvokeProcessor code against a record with the same key columns values as the given one has.
+     *
+     * @param keyRec A record with key columns set.
+     * The record cannot be {@code null}.
+     * @param proc Invoke processor.
+     * @param <T> InvokeProcessor result type.
+     * @return Results of the processing.
+     */
+    <T extends Serializable> T invoke(@NotNull R keyRec, InvokeProcessor<R, R, T> proc);
+
+    /**
+     * Asynchronously executes an InvokeProcessor code against a record
+     * with the same key columns values as the given one has.
+     *
+     * @param keyRec A record with key columns set.
+     * The record cannot be {@code null}.
+     * @param proc Invoke processor.
+     * @param <T> InvokeProcessor result type.
+     * @return Future representing pending completion of the operation.
+     */
+    @NotNull <T extends Serializable> CompletableFuture<T> invokeAsync(@NotNull R keyRec, InvokeProcessor<R, R, T> proc);
+
+    /**
+     * Executes an InvokeProcessor code against records with the same key columns values as the given ones has.
+     *
+     * @param keyRecs Records with key columns set.
+     * The records cannot be {@code null}.
+     * @param proc Invoke processor.
+     * @param <T> InvokeProcessor result type.
+     * @return Results of the processing.
+     */
+    <T extends Serializable> Map<R, T> invokeAll(@NotNull Collection<R> keyRecs, InvokeProcessor<R, R, T> proc);
+
+    /**
+     * Asynchronously executes an InvokeProcessor against records with the same key columns values as the given ones
+     * has.
+     *
+     * @param keyRecs Records with key columns set.
+     * The records cannot be {@code null}.
+     * @param proc Invoke processor.
+     * @param <T> InvokeProcessor result type.
+     * @return Results of the processing.
+     */
+    @NotNull <T extends Serializable> CompletableFuture<Map<R, T>> invokeAllAsync(@NotNull Collection<R> keyRecs,
+        InvokeProcessor<R, R, T> proc);
+
+    /**
+     * Returns current transaction.
+     *
+     * @return Current transaction or null if a table is not enlisted in a transaction.
+     */
+    @Nullable Transaction transaction();
+
+    /**
+     * Enslists a view into the transaction.
+     *
+     * @param tx The transaction.
+     * @return Transactional view.
+     */
+    TableView<R> withTransaction(Transaction tx);
+}
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsKeyRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsKeyRequest.java
index 134894f..d45d726 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsKeyRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsKeyRequest.java
@@ -45,6 +45,6 @@
         var table = readTable(in, tables);
         var keyTuple = readTuple(in, table, true);
 
-        return table.recordView().getAsync(keyTuple).thenAccept(t -> out.packBoolean(t != null));
+        return table.getAsync(keyTuple).thenAccept(t -> out.packBoolean(t != null));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllExactRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllExactRequest.java
index 2ab1346..28e428d 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllExactRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllExactRequest.java
@@ -46,6 +46,6 @@
         var table = readTable(in, tables);
         var tuples = readTuples(in, table, false);
 
-        return table.recordView().deleteAllExactAsync(tuples).thenAccept(skippedTuples -> writeTuples(out, skippedTuples));
+        return table.deleteAllExactAsync(tuples).thenAccept(skippedTuples -> writeTuples(out, skippedTuples));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllRequest.java
index 48da6c1..55a4786 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllRequest.java
@@ -47,6 +47,6 @@
         var table = readTable(in, tables);
         var tuples = readTuples(in, table, true);
 
-        return table.recordView().deleteAllAsync(tuples).thenAccept(skippedTuples -> writeTuples(out, skippedTuples, TuplePart.KEY));
+        return table.deleteAllAsync(tuples).thenAccept(skippedTuples -> writeTuples(out, skippedTuples, TuplePart.KEY));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteExactRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteExactRequest.java
index 70aad7b..aa6f685 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteExactRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteExactRequest.java
@@ -45,6 +45,6 @@
         var table = readTable(in, tables);
         var tuple = readTuple(in, table, false);
 
-        return table.recordView().deleteExactAsync(tuple).thenAccept(out::packBoolean);
+        return table.deleteExactAsync(tuple).thenAccept(out::packBoolean);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteRequest.java
index 0334104..00a9774 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteRequest.java
@@ -45,6 +45,6 @@
         var table = readTable(in, tables);
         var tuple = readTuple(in, table, true);
 
-        return table.recordView().deleteAsync(tuple).thenAccept(out::packBoolean);
+        return table.deleteAsync(tuple).thenAccept(out::packBoolean);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAllRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAllRequest.java
index ad29f4c..a0eda84 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAllRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAllRequest.java
@@ -46,6 +46,6 @@
         var table = readTable(in, tables);
         var keyTuples = readTuples(in, table, true);
 
-        return table.recordView().getAllAsync(keyTuples).thenAccept(tuples -> writeTuples(out, tuples));
+        return table.getAllAsync(keyTuples).thenAccept(tuples -> writeTuples(out, tuples));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndDeleteRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndDeleteRequest.java
index 53ad10d..1e57c44 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndDeleteRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndDeleteRequest.java
@@ -47,6 +47,6 @@
         var table = readTable(in, tables);
         var tuple = readTuple(in, table, true);
 
-        return table.recordView().getAndDeleteAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple, TuplePart.VAL));
+        return table.getAndDeleteAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple, TuplePart.VAL));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceRequest.java
index 431df9c..12d2654 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceRequest.java
@@ -47,6 +47,6 @@
         var table = readTable(in, tables);
         var tuple = readTuple(in, table, false);
 
-        return table.recordView().getAndReplaceAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple, TuplePart.VAL));
+        return table.getAndReplaceAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple, TuplePart.VAL));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceSchemalessRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceSchemalessRequest.java
index f4ab17b..fad9917 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceSchemalessRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceSchemalessRequest.java
@@ -46,6 +46,6 @@
         var table = readTable(in, tables);
         var tuple = readTupleSchemaless(in);
 
-        return table.recordView().getAndReplaceAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple));
+        return table.getAndReplaceAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertRequest.java
index 59a749a..4b32399 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertRequest.java
@@ -47,6 +47,6 @@
         var table = readTable(in, tables);
         var tuple = readTuple(in, table, false);
 
-        return table.recordView().getAndUpsertAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple, TuplePart.VAL));
+        return table.getAndUpsertAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple, TuplePart.VAL));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertSchemalessRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertSchemalessRequest.java
index b43e715..1f19a36 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertSchemalessRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertSchemalessRequest.java
@@ -46,6 +46,6 @@
         var table = readTable(in, tables);
         var tuple = readTupleSchemaless(in);
 
-        return table.recordView().getAndUpsertAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple));
+        return table.getAndUpsertAsync(tuple).thenAccept(resTuple -> writeTuple(out, resTuple));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetRequest.java
index a7fafcd..e4ec08f 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetRequest.java
@@ -47,6 +47,6 @@
         var table = readTable(in, tables);
         var keyTuple = readTuple(in, table, true);
 
-        return table.recordView().getAsync(keyTuple).thenAccept(t -> writeTuple(out, t, TuplePart.VAL));
+        return table.getAsync(keyTuple).thenAccept(t -> writeTuple(out, t, TuplePart.VAL));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllRequest.java
index 19c1391..aa689f4 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllRequest.java
@@ -46,6 +46,6 @@
         var table = readTable(in, tables);
         var tuples = readTuples(in, table, false);
 
-        return table.recordView().insertAllAsync(tuples).thenAccept(skippedTuples -> writeTuples(out, skippedTuples));
+        return table.insertAllAsync(tuples).thenAccept(skippedTuples -> writeTuples(out, skippedTuples));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllSchemalessRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllSchemalessRequest.java
index be5b1ef..34cd9be 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllSchemalessRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllSchemalessRequest.java
@@ -46,6 +46,6 @@
         var table = readTable(in, tables);
         var tuples = readTuplesSchemaless(in);
 
-        return table.recordView().insertAllAsync(tuples).thenAccept(skippedTuples -> writeTuples(out, skippedTuples));
+        return table.insertAllAsync(tuples).thenAccept(skippedTuples -> writeTuples(out, skippedTuples));
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertRequest.java
index 0403000..7b73cbd 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertRequest.java
@@ -45,6 +45,6 @@
         var table = readTable(in, tables);
         var tuple = readTuple(in, table, false);
 
-        return table.recordView().insertAsync(tuple).thenAccept(out::packBoolean);
+        return table.insertAsync(tuple).thenAccept(out::packBoolean);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertSchemalessRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertSchemalessRequest.java
index 50a569b..fdf0831 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertSchemalessRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertSchemalessRequest.java
@@ -45,6 +45,6 @@
         var table = readTable(in, tables);
         var tuple = readTupleSchemaless(in);
 
-        return table.recordView().insertAsync(tuple).thenAccept(out::packBoolean);
+        return table.insertAsync(tuple).thenAccept(out::packBoolean);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactRequest.java
index 1b5701d..7dce25c 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactRequest.java
@@ -49,6 +49,6 @@
         var oldTuple = readTuple(in, false, schema);
         var newTuple = readTuple(in, false, schema);
 
-        return table.recordView().replaceAsync(oldTuple, newTuple).thenAccept(out::packBoolean);
+        return table.replaceAsync(oldTuple, newTuple).thenAccept(out::packBoolean);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactSchemalessRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactSchemalessRequest.java
index ef84689..cff276f 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactSchemalessRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactSchemalessRequest.java
@@ -47,6 +47,6 @@
         var oldTuple = readTupleSchemaless(in);
         var newTuple = readTupleSchemaless(in);
 
-        return table.recordView().replaceAsync(oldTuple, newTuple).thenAccept(out::packBoolean);
+        return table.replaceAsync(oldTuple, newTuple).thenAccept(out::packBoolean);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceRequest.java
index 68ff3d9..d4afcf4 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceRequest.java
@@ -45,6 +45,6 @@
         var table = readTable(in, tables);
         var tuple = readTuple(in, table, false);
 
-        return table.recordView().replaceAsync(tuple).thenAccept(out::packBoolean);
+        return table.replaceAsync(tuple).thenAccept(out::packBoolean);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceSchemalessRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceSchemalessRequest.java
index 06a429e..7b4ac23 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceSchemalessRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceSchemalessRequest.java
@@ -45,6 +45,6 @@
         var table = readTable(in, tables);
         var tuple = readTupleSchemaless(in);
 
-        return table.recordView().replaceAsync(tuple).thenAccept(out::packBoolean);
+        return table.replaceAsync(tuple).thenAccept(out::packBoolean);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllRequest.java
index 8ab8d18..f8ad392 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllRequest.java
@@ -39,6 +39,6 @@
         var table = readTable(in, tables);
         var tuples = readTuples(in, table, false);
 
-        return table.recordView().upsertAllAsync(tuples);
+        return table.upsertAllAsync(tuples);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllSchemalessRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllSchemalessRequest.java
index a30bc91..163b08e 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllSchemalessRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllSchemalessRequest.java
@@ -39,6 +39,6 @@
         var table = readTable(in, tables);
         var tuples = readTuplesSchemaless(in);
 
-        return table.recordView().upsertAllAsync(tuples);
+        return table.upsertAllAsync(tuples);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertRequest.java
index efbac5f..c33dc2e 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertRequest.java
@@ -39,6 +39,6 @@
         var table = readTable(in, tables);
         var tuple = readTuple(in, table, false);
 
-        return table.recordView().upsertAsync(tuple);
+        return table.upsertAsync(tuple);
     }
 }
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertSchemalessRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertSchemalessRequest.java
index fc6a30c..26f4181 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertSchemalessRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertSchemalessRequest.java
@@ -39,6 +39,6 @@
         var table = readTable(in, tables);
         var tuple = readTupleSchemaless(in);
 
-        return table.recordView().upsertAsync(tuple);
+        return table.upsertAsync(tuple);
     }
 }
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
index cc0d7cf..73d8cfb 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
@@ -26,7 +26,7 @@
 import org.apache.ignite.internal.client.proto.ClientMessageUnpacker;
 import org.apache.ignite.internal.client.proto.ClientOp;
 import org.apache.ignite.table.InvokeProcessor;
-import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Tuple;
 import org.apache.ignite.tx.Transaction;
 import org.jetbrains.annotations.NotNull;
@@ -35,7 +35,7 @@
 /**
  * Client key-value view implementation for binary user-object representation.
  */
-public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
+public class ClientKeyValueBinaryView implements KeyValueBinaryView {
     /** Underlying table. */
     private final ClientTable tbl;
 
@@ -161,12 +161,7 @@
 
     /** {@inheritDoc} */
     @Override public @NotNull CompletableFuture<Boolean> removeAsync(@NotNull Tuple key) {
-        Objects.requireNonNull(key);
-
-        return tbl.doSchemaOutOpAsync(
-            ClientOp.TUPLE_DELETE,
-            (s, w) -> tbl.writeTuple(key, s, w, true),
-            ClientMessageUnpacker::unpackBoolean);
+        return tbl.deleteAsync(key);
     }
 
     /** {@inheritDoc} */
@@ -192,13 +187,7 @@
 
     /** {@inheritDoc} */
     @Override public @NotNull CompletableFuture<Collection<Tuple>> removeAllAsync(@NotNull Collection<Tuple> keys) {
-        Objects.requireNonNull(keys);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_DELETE_ALL,
-            (s, w) -> tbl.writeTuples(keys, s, w, true),
-            (schema, in) -> tbl.readTuples(schema, in, true),
-            Collections.emptyList());
+        return tbl.deleteAllAsync(keys);
     }
 
     /** {@inheritDoc} */
@@ -268,7 +257,7 @@
             InvokeProcessor<Tuple, Tuple, R> proc,
             Serializable... args
     ) {
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
@@ -277,7 +266,7 @@
             InvokeProcessor<Tuple, Tuple, R> proc,
             Serializable... args
     ) {
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
@@ -286,7 +275,7 @@
             InvokeProcessor<Tuple, Tuple, R> proc,
             Serializable... args
     ) {
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
@@ -295,18 +284,18 @@
             InvokeProcessor<Tuple, Tuple, R> proc,
             Serializable... args
     ) {
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
     @Override public @Nullable Transaction transaction() {
         // TODO: Transactions IGNITE-15240
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
-    @Override public KeyValueView<Tuple, Tuple> withTransaction(Transaction tx) {
+    @Override public KeyValueBinaryView withTransaction(Transaction tx) {
         // TODO: Transactions IGNITE-15240
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 }
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java
deleted file mode 100644
index 033348c..0000000
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.client.table;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import org.apache.ignite.internal.client.proto.ClientMessageUnpacker;
-import org.apache.ignite.internal.client.proto.ClientOp;
-import org.apache.ignite.table.InvokeProcessor;
-import org.apache.ignite.table.RecordView;
-import org.apache.ignite.table.Tuple;
-import org.apache.ignite.tx.Transaction;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * Client record view implementation for binary user-object representation.
- */
-public class ClientRecordBinaryView implements RecordView<Tuple> {
-    /** Underlying table. */
-    private final ClientTable tbl;
-
-    /**
-     * Constructor.
-     *
-     * @param tbl Table.
-     */
-    public ClientRecordBinaryView(ClientTable tbl) {
-        assert tbl != null;
-
-        this.tbl = tbl;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Tuple get(@NotNull Tuple keyRec) {
-        return getAsync(keyRec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Tuple> getAsync(@NotNull Tuple keyRec) {
-        Objects.requireNonNull(keyRec);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_GET,
-            (schema, out) -> tbl.writeTuple(keyRec, schema, out, true),
-            (inSchema, in) -> ClientTable.readValueTuple(inSchema, in, keyRec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public Collection<Tuple> getAll(@NotNull Collection<Tuple> keyRecs) {
-        return getAllAsync(keyRecs).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Collection<Tuple>> getAllAsync(@NotNull Collection<Tuple> keyRecs) {
-        Objects.requireNonNull(keyRecs);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_GET_ALL,
-            (s, w) -> tbl.writeTuples(keyRecs, s, w, true),
-            tbl::readTuples,
-            Collections.emptyList());
-    }
-
-    /** {@inheritDoc} */
-    @Override public void upsert(@NotNull Tuple rec) {
-        upsertAsync(rec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Void> upsertAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        // TODO IGNITE-15194: Convert Tuple to a schema-order Array as a first step.
-        // If it does not match the latest schema, then request latest and convert again.
-        return tbl.doSchemaOutOpAsync(
-            ClientOp.TUPLE_UPSERT,
-            (s, w) -> tbl.writeTuple(rec, s, w),
-            r -> null);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void upsertAll(@NotNull Collection<Tuple> recs) {
-        upsertAllAsync(recs).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Void> upsertAllAsync(@NotNull Collection<Tuple> recs) {
-        Objects.requireNonNull(recs);
-
-        return tbl.doSchemaOutOpAsync(
-            ClientOp.TUPLE_UPSERT_ALL,
-            (s, w) -> tbl.writeTuples(recs, s, w, false),
-            r -> null);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Tuple getAndUpsert(@NotNull Tuple rec) {
-        return getAndUpsertAsync(rec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Tuple> getAndUpsertAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_GET_AND_UPSERT,
-            (s, w) -> tbl.writeTuple(rec, s, w, false),
-            (schema, in) -> ClientTable.readValueTuple(schema, in, rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean insert(@NotNull Tuple rec) {
-        return insertAsync(rec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> insertAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        return tbl.doSchemaOutOpAsync(
-            ClientOp.TUPLE_INSERT,
-            (s, w) -> tbl.writeTuple(rec, s, w, false),
-            ClientMessageUnpacker::unpackBoolean);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Collection<Tuple> insertAll(@NotNull Collection<Tuple> recs) {
-        return insertAllAsync(recs).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Collection<Tuple>> insertAllAsync(@NotNull Collection<Tuple> recs) {
-        Objects.requireNonNull(recs);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_INSERT_ALL,
-            (s, w) -> tbl.writeTuples(recs, s, w, false),
-            tbl::readTuples,
-            Collections.emptyList());
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean replace(@NotNull Tuple rec) {
-        return replaceAsync(rec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        return tbl.doSchemaOutOpAsync(
-            ClientOp.TUPLE_REPLACE,
-            (s, w) -> tbl.writeTuple(rec, s, w, false),
-            ClientMessageUnpacker::unpackBoolean);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean replace(@NotNull Tuple oldRec, @NotNull Tuple newRec) {
-        return replaceAsync(oldRec, newRec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull Tuple oldRec, @NotNull Tuple newRec) {
-        Objects.requireNonNull(oldRec);
-        Objects.requireNonNull(newRec);
-
-        return tbl.doSchemaOutOpAsync(
-            ClientOp.TUPLE_REPLACE_EXACT,
-            (s, w) -> {
-                tbl.writeTuple(oldRec, s, w, false, false);
-                tbl.writeTuple(newRec, s, w, false, true);
-            },
-            ClientMessageUnpacker::unpackBoolean);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Tuple getAndReplace(@NotNull Tuple rec) {
-        return getAndReplaceAsync(rec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Tuple> getAndReplaceAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_GET_AND_REPLACE,
-            (s, w) -> tbl.writeTuple(rec, s, w, false),
-            (schema, in) -> ClientTable.readValueTuple(schema, in, rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean delete(@NotNull Tuple keyRec) {
-        return deleteAsync(keyRec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> deleteAsync(@NotNull Tuple keyRec) {
-        Objects.requireNonNull(keyRec);
-
-        return tbl.doSchemaOutOpAsync(
-            ClientOp.TUPLE_DELETE,
-            (s, w) -> tbl.writeTuple(keyRec, s, w, true),
-            ClientMessageUnpacker::unpackBoolean);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean deleteExact(@NotNull Tuple rec) {
-        return deleteExactAsync(rec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> deleteExactAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        return tbl.doSchemaOutOpAsync(
-            ClientOp.TUPLE_DELETE_EXACT,
-            (s, w) -> tbl.writeTuple(rec, s, w, false),
-            ClientMessageUnpacker::unpackBoolean);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Tuple getAndDelete(@NotNull Tuple rec) {
-        return getAndDeleteAsync(rec).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Tuple> getAndDeleteAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_GET_AND_DELETE,
-            (s, w) -> tbl.writeTuple(rec, s, w, false),
-            (schema, in) -> ClientTable.readValueTuple(schema, in, rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public Collection<Tuple> deleteAll(@NotNull Collection<Tuple> recs) {
-        return deleteAllAsync(recs).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Collection<Tuple>> deleteAllAsync(@NotNull Collection<Tuple> recs) {
-        Objects.requireNonNull(recs);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_DELETE_ALL,
-            (s, w) -> tbl.writeTuples(recs, s, w, true),
-            (schema, in) -> tbl.readTuples(schema, in, true),
-            Collections.emptyList());
-    }
-
-    /** {@inheritDoc} */
-    @Override public Collection<Tuple> deleteAllExact(@NotNull Collection<Tuple> recs) {
-        return deleteAllExactAsync(recs).join();
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Collection<Tuple>> deleteAllExactAsync(@NotNull Collection<Tuple> recs) {
-        Objects.requireNonNull(recs);
-
-        return tbl.doSchemaOutInOpAsync(
-            ClientOp.TUPLE_DELETE_ALL_EXACT,
-            (s, w) -> tbl.writeTuples(recs, s, w, false),
-            tbl::readTuples,
-            Collections.emptyList());
-    }
-
-    /** {@inheritDoc} */
-    @Override public <T extends Serializable> T invoke(@NotNull Tuple keyRec, InvokeProcessor<Tuple, Tuple, T> proc) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull <T extends Serializable> CompletableFuture<T> invokeAsync(@NotNull Tuple keyRec, InvokeProcessor<Tuple, Tuple, T> proc) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /** {@inheritDoc} */
-    @Override public <T extends Serializable> Map<Tuple, T> invokeAll(@NotNull Collection<Tuple> keyRecs, InvokeProcessor<Tuple, Tuple, T> proc) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull <T extends Serializable> CompletableFuture<Map<Tuple, T>> invokeAllAsync(@NotNull Collection<Tuple> keyRecs, InvokeProcessor<Tuple, Tuple, T> proc) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /** {@inheritDoc} */
-    @Override public @Nullable Transaction transaction() {
-        // TODO: Transactions IGNITE-15240
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /** {@inheritDoc} */
-    @Override public ClientRecordBinaryView withTransaction(Transaction tx) {
-        // TODO: Transactions IGNITE-15240
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-}
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTable.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTable.java
index 188f775..d8b9fe2 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTable.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTable.java
@@ -17,16 +17,20 @@
 
 package org.apache.ignite.internal.client.table;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.Function;
+
 import org.apache.ignite.client.IgniteClientException;
 import org.apache.ignite.internal.client.ReliableChannel;
 import org.apache.ignite.internal.client.proto.ClientMessagePacker;
@@ -35,6 +39,8 @@
 import org.apache.ignite.internal.tostring.IgniteToStringBuilder;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.table.InvokeProcessor;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
@@ -42,6 +48,7 @@
 import org.apache.ignite.table.mapper.KeyMapper;
 import org.apache.ignite.table.mapper.RecordMapper;
 import org.apache.ignite.table.mapper.ValueMapper;
+import org.apache.ignite.tx.Transaction;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.msgpack.core.MessageFormat;
@@ -68,6 +75,9 @@
     /** */
     private final Object latestSchemaLock = new Object();
 
+    /** */
+    private final KeyValueBinaryView kvView;
+
     /**
      * Constructor.
      *
@@ -83,6 +93,7 @@
         this.ch = ch;
         this.id = id;
         this.name = name;
+        this.kvView = new ClientKeyValueBinaryView(this);
     }
 
     /**
@@ -101,21 +112,284 @@
 
     /** {@inheritDoc} */
     @Override public <R> RecordView<R> recordView(RecordMapper<R> recMapper) {
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
-    @Override public <K, V> KeyValueView<K, V> keyValueView(KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    @Override public RecordView<Tuple> recordView() {
-        return new ClientRecordBinaryView(this);
+    @Override public <K, V> KeyValueView<K, V> kvView(KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
-    @Override public KeyValueView<Tuple, Tuple> keyValueView() {
-        return new ClientKeyValueBinaryView(this);
+    @Override public KeyValueBinaryView kvView() {
+        return kvView;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Table withTransaction(Transaction tx) {
+        // TODO: Transactions IGNITE-15240
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Tuple get(@NotNull Tuple keyRec) {
+        return getAsync(keyRec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Tuple> getAsync(@NotNull Tuple keyRec) {
+        Objects.requireNonNull(keyRec);
+
+        return doSchemaOutInOpAsync(
+                ClientOp.TUPLE_GET,
+                (schema, out) -> writeTuple(keyRec, schema, out, true),
+                (inSchema, in) -> readValueTuple(inSchema, in, keyRec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Tuple> getAll(@NotNull Collection<Tuple> keyRecs) {
+        return getAllAsync(keyRecs).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Collection<Tuple>> getAllAsync(@NotNull Collection<Tuple> keyRecs) {
+        Objects.requireNonNull(keyRecs);
+
+        return doSchemaOutInOpAsync(
+                ClientOp.TUPLE_GET_ALL,
+                (s, w) -> writeTuples(keyRecs, s, w, true),
+                this::readTuples,
+                Collections.emptyList());
+    }
+
+    /** {@inheritDoc} */
+    @Override public void upsert(@NotNull Tuple rec) {
+        upsertAsync(rec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Void> upsertAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        // TODO IGNITE-15194: Convert Tuple to a schema-order Array as a first step.
+        // If it does not match the latest schema, then request latest and convert again.
+        return doSchemaOutOpAsync(
+                ClientOp.TUPLE_UPSERT,
+                (s, w) -> writeTuple(rec, s, w),
+                r -> null);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void upsertAll(@NotNull Collection<Tuple> recs) {
+        upsertAllAsync(recs).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Void> upsertAllAsync(@NotNull Collection<Tuple> recs) {
+        Objects.requireNonNull(recs);
+
+        return doSchemaOutOpAsync(
+                ClientOp.TUPLE_UPSERT_ALL,
+                (s, w) -> writeTuples(recs, s, w, false),
+                r -> null);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Tuple getAndUpsert(@NotNull Tuple rec) {
+        return getAndUpsertAsync(rec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Tuple> getAndUpsertAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        return doSchemaOutInOpAsync(
+                ClientOp.TUPLE_GET_AND_UPSERT,
+                (s, w) -> writeTuple(rec, s, w, false),
+                (schema, in) -> readValueTuple(schema, in, rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean insert(@NotNull Tuple rec) {
+        return insertAsync(rec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> insertAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        return doSchemaOutOpAsync(
+                ClientOp.TUPLE_INSERT,
+                (s, w) -> writeTuple(rec, s, w, false),
+                ClientMessageUnpacker::unpackBoolean);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Tuple> insertAll(@NotNull Collection<Tuple> recs) {
+        return insertAllAsync(recs).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Collection<Tuple>> insertAllAsync(@NotNull Collection<Tuple> recs) {
+        Objects.requireNonNull(recs);
+
+        return doSchemaOutInOpAsync(
+                ClientOp.TUPLE_INSERT_ALL,
+                (s, w) -> writeTuples(recs, s, w, false),
+                this::readTuples,
+                Collections.emptyList());
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean replace(@NotNull Tuple rec) {
+        return replaceAsync(rec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        return doSchemaOutOpAsync(
+                ClientOp.TUPLE_REPLACE,
+                (s, w) -> writeTuple(rec, s, w, false),
+                ClientMessageUnpacker::unpackBoolean);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean replace(@NotNull Tuple oldRec, @NotNull Tuple newRec) {
+        return replaceAsync(oldRec, newRec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull Tuple oldRec, @NotNull Tuple newRec) {
+        Objects.requireNonNull(oldRec);
+        Objects.requireNonNull(newRec);
+
+        return doSchemaOutOpAsync(
+                ClientOp.TUPLE_REPLACE_EXACT,
+                (s, w) -> {
+                    writeTuple(oldRec, s, w, false, false);
+                    writeTuple(newRec, s, w, false, true);
+                },
+                ClientMessageUnpacker::unpackBoolean);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Tuple getAndReplace(@NotNull Tuple rec) {
+        return getAndReplaceAsync(rec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Tuple> getAndReplaceAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        return doSchemaOutInOpAsync(
+                ClientOp.TUPLE_GET_AND_REPLACE,
+                (s, w) -> writeTuple(rec, s, w, false),
+                (schema, in) -> readValueTuple(schema, in, rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean delete(@NotNull Tuple keyRec) {
+        return deleteAsync(keyRec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> deleteAsync(@NotNull Tuple keyRec) {
+        Objects.requireNonNull(keyRec);
+
+        return doSchemaOutOpAsync(
+                ClientOp.TUPLE_DELETE,
+                (s, w) -> writeTuple(keyRec, s, w, true),
+                ClientMessageUnpacker::unpackBoolean);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean deleteExact(@NotNull Tuple rec) {
+        return deleteExactAsync(rec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> deleteExactAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        return doSchemaOutOpAsync(
+                ClientOp.TUPLE_DELETE_EXACT,
+                (s, w) -> writeTuple(rec, s, w, false),
+                ClientMessageUnpacker::unpackBoolean);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Tuple getAndDelete(@NotNull Tuple rec) {
+        return getAndDeleteAsync(rec).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Tuple> getAndDeleteAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        return doSchemaOutInOpAsync(
+                ClientOp.TUPLE_GET_AND_DELETE,
+                (s, w) -> writeTuple(rec, s, w, false),
+                (schema, in) -> readValueTuple(schema, in, rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Tuple> deleteAll(@NotNull Collection<Tuple> recs) {
+        return deleteAllAsync(recs).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Collection<Tuple>> deleteAllAsync(@NotNull Collection<Tuple> recs) {
+        Objects.requireNonNull(recs);
+
+        return doSchemaOutInOpAsync(
+                ClientOp.TUPLE_DELETE_ALL,
+                (s, w) -> writeTuples(recs, s, w, true),
+                (schema, in) -> readTuples(schema, in, true),
+                Collections.emptyList());
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Tuple> deleteAllExact(@NotNull Collection<Tuple> recs) {
+        return deleteAllExactAsync(recs).join();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Collection<Tuple>> deleteAllExactAsync(@NotNull Collection<Tuple> recs) {
+        Objects.requireNonNull(recs);
+
+        return doSchemaOutInOpAsync(
+                ClientOp.TUPLE_DELETE_ALL_EXACT,
+                (s, w) -> writeTuples(recs, s, w, false),
+                this::readTuples,
+                Collections.emptyList());
+    }
+
+    /** {@inheritDoc} */
+    @Override public <T extends Serializable> T invoke(@NotNull Tuple keyRec, InvokeProcessor<Tuple, Tuple, T> proc) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull <T extends Serializable> CompletableFuture<T> invokeAsync(@NotNull Tuple keyRec, InvokeProcessor<Tuple, Tuple, T> proc) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public <T extends Serializable> Map<Tuple, T> invokeAll(@NotNull Collection<Tuple> keyRecs, InvokeProcessor<Tuple, Tuple, T> proc) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull <T extends Serializable> CompletableFuture<Map<Tuple, T>> invokeAllAsync(@NotNull Collection<Tuple> keyRecs, InvokeProcessor<Tuple, Tuple, T> proc) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public @Nullable Transaction transaction() {
+        // TODO: Transactions IGNITE-15240
+        throw new UnsupportedOperationException();
     }
 
     private CompletableFuture<ClientSchema> getLatestSchema() {
@@ -310,6 +584,10 @@
             writeTuple(tuple, schema, out, keyOnly, true);
     }
 
+    public static Tuple readTuple(ClientSchema schema, ClientMessageUnpacker in) {
+        return readTuple(schema, in, false);
+    }
+
     private static Tuple readTuple(ClientSchema schema, ClientMessageUnpacker in, boolean keyOnly) {
         var tuple = new ClientTuple(schema);
 
@@ -321,7 +599,7 @@
         return tuple;
     }
 
-    static Tuple readValueTuple(ClientSchema schema, ClientMessageUnpacker in, Tuple keyTuple) {
+    public static Tuple readValueTuple(ClientSchema schema, ClientMessageUnpacker in, Tuple keyTuple) {
         var tuple = new ClientTuple(schema);
 
         for (var i = 0; i < schema.columns().length; i++) {
@@ -337,7 +615,7 @@
         return tuple;
     }
 
-    static Tuple readValueTuple(ClientSchema schema, ClientMessageUnpacker in) {
+    public static Tuple readValueTuple(ClientSchema schema, ClientMessageUnpacker in) {
         var keyColCnt = schema.keyColumnCount();
         var colCnt = schema.columns().length;
 
@@ -353,7 +631,7 @@
         return valTuple;
     }
 
-    static IgniteBiTuple<Tuple, Tuple> readKvTuple(ClientSchema schema, ClientMessageUnpacker in) {
+    public static IgniteBiTuple<Tuple, Tuple> readKvTuple(ClientSchema schema, ClientMessageUnpacker in) {
         var keyColCnt = schema.keyColumnCount();
         var colCnt = schema.columns().length;
 
@@ -385,11 +663,11 @@
         return res;
     }
 
-    Collection<Tuple> readTuples(ClientSchema schema, ClientMessageUnpacker in) {
+    public Collection<Tuple> readTuples(ClientSchema schema, ClientMessageUnpacker in) {
         return readTuples(schema, in, false);
     }
 
-    Collection<Tuple> readTuples(ClientSchema schema, ClientMessageUnpacker in, boolean keyOnly) {
+    private Collection<Tuple> readTuples(ClientSchema schema, ClientMessageUnpacker in, boolean keyOnly) {
         var cnt = in.unpackInt();
         var res = new ArrayList<Tuple>(cnt);
 
@@ -399,7 +677,7 @@
         return res;
     }
 
-    <T> CompletableFuture<T> doSchemaOutInOpAsync(
+    public <T> CompletableFuture<T> doSchemaOutInOpAsync(
             int opCode,
             BiConsumer<ClientSchema, ClientMessagePacker> writer,
             BiFunction<ClientSchema, ClientMessageUnpacker, T> reader
@@ -407,7 +685,7 @@
         return doSchemaOutInOpAsync(opCode, writer, reader, null);
     }
 
-    <T> CompletableFuture<T> doSchemaOutInOpAsync(
+    public <T> CompletableFuture<T> doSchemaOutInOpAsync(
             int opCode,
             BiConsumer<ClientSchema, ClientMessagePacker> writer,
             BiFunction<ClientSchema, ClientMessageUnpacker, T> reader,
@@ -421,7 +699,7 @@
                 .thenCompose(t -> loadSchemaAndReadData(t, reader));
     }
 
-    <T> CompletableFuture<T> doSchemaOutOpAsync(
+    protected <T> CompletableFuture<T> doSchemaOutOpAsync(
             int opCode,
             BiConsumer<ClientSchema, ClientMessagePacker> writer,
             Function<ClientMessageUnpacker, T> reader) {
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTables.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTables.java
index eb0a139..49d2854 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTables.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTables.java
@@ -54,7 +54,7 @@
         Objects.requireNonNull(name);
         Objects.requireNonNull(tableInitChange);
 
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
@@ -67,7 +67,7 @@
         Objects.requireNonNull(name);
         Objects.requireNonNull(tableChange);
 
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
@@ -80,7 +80,7 @@
         Objects.requireNonNull(name);
         Objects.requireNonNull(tableInitChange);
 
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTuple.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTuple.java
index 6665cfa..3fc9fc5 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTuple.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTuple.java
@@ -135,12 +135,12 @@
 
     /** {@inheritDoc} */
     @Override public BinaryObject binaryObjectValue(@NotNull String columnName) {
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
     @Override public BinaryObject binaryObjectValue(int columnIndex) {
-        throw new UnsupportedOperationException("Not implemented yet.");
+        throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueBinaryViewTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueBinaryViewTest.java
index d45ba7c..64fd808 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueBinaryViewTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueBinaryViewTest.java
@@ -21,7 +21,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletionException;
-import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Test;
@@ -34,23 +34,23 @@
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- * Binary KeyValueView tests.
+ * KeyValueBinaryView tests.
  */
 public class ClientKeyValueBinaryViewTest extends AbstractClientTableTest {
     @Test
     public void testGetMissingRowReturnsNull() {
         Table table = defaultTable();
-        KeyValueView<Tuple, Tuple> kvView = table.keyValueView();
+        KeyValueBinaryView kvView = table.kvView();
 
         assertNull(kvView.get(defaultTupleKey()));
     }
 
     @Test
-    public void testRecordUpsertKvGet() {
+    public void testTableUpsertKvGet() {
         Table table = defaultTable();
-        table.recordView().upsert(tuple());
+        table.upsert(tuple());
 
-        KeyValueView<Tuple, Tuple> kvView = table.keyValueView();
+        KeyValueBinaryView kvView = table.kvView();
 
         Tuple key = defaultTupleKey();
         Tuple val = kvView.get(key);
@@ -61,15 +61,15 @@
     }
 
     @Test
-    public void testKvPutRecordGet() {
+    public void testKvPutTableGet() {
         Table table = defaultTable();
-        KeyValueView<Tuple, Tuple> kvView = table.keyValueView();
+        KeyValueBinaryView kvView = table.kvView();
 
         Tuple key = defaultTupleKey();
         Tuple val = Tuple.create().set("name", "bar");
 
         kvView.put(key, val);
-        Tuple res = table.recordView().get(key);
+        Tuple res = table.get(key);
 
         assertEquals("bar", res.stringValue("name"));
         assertEquals(DEFAULT_ID, res.longValue("id"));
@@ -78,7 +78,7 @@
     @Test
     public void testPutGet() {
         Table table = defaultTable();
-        KeyValueView<Tuple, Tuple> kvView = table.keyValueView();
+        KeyValueBinaryView kvView = table.kvView();
 
         Tuple key = defaultTupleKey();
         Tuple val = Tuple.create().set("name", DEFAULT_NAME);
@@ -92,7 +92,7 @@
     @Test
     public void testGetUpdatePut() {
         Table table = defaultTable();
-        KeyValueView<Tuple, Tuple> kvView = table.keyValueView();
+        KeyValueBinaryView kvView = table.kvView();
 
         Tuple key = defaultTupleKey();
         Tuple val = Tuple.create().set("name", DEFAULT_NAME);
@@ -109,7 +109,7 @@
 
     @Test
     public void testGetAll() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
 
         kvView.put(tupleKey(1L), tupleVal("1"));
         kvView.put(tupleKey(2L), tupleVal("2"));
@@ -130,7 +130,7 @@
 
     @Test
     public void testGetAllEmptyKeysReturnsEmptyMap() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         Map<Tuple, Tuple> res = kvView.getAll(List.of());
@@ -139,7 +139,7 @@
 
     @Test
     public void testGetAllNonExistentKeysReturnsEmptyMap() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         Map<Tuple, Tuple> res = kvView.getAll(List.of(tupleKey(-1L)));
@@ -148,7 +148,7 @@
 
     @Test
     public void testContains() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         assertTrue(kvView.contains(tupleKey(1L)));
@@ -157,7 +157,7 @@
 
     @Test
     public void testContainsThrowsOnEmptyKey() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
 
         var ex = assertThrows(CompletionException.class, () -> kvView.contains(Tuple.create()));
         assertTrue(ex.getMessage().contains("Missed key column: id"), ex.getMessage());
@@ -165,7 +165,7 @@
 
     @Test
     public void testPutAll() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.putAll(Map.of(tupleKey(1L), tupleVal("1"), tupleKey(2L), tupleVal("2")));
 
         assertEquals("1", kvView.get(tupleKey(1L)).stringValue("name"));
@@ -174,7 +174,7 @@
 
     @Test
     public void testPutIfAbsent() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
 
         assertTrue(kvView.putIfAbsent(tupleKey(1L), tupleVal("1")));
         assertFalse(kvView.putIfAbsent(tupleKey(1L), tupleVal("1")));
@@ -184,7 +184,7 @@
 
     @Test
     public void testRemove() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         assertFalse(kvView.remove(tupleKey(2L)));
@@ -195,7 +195,7 @@
 
     @Test
     public void testRemoveExact() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         assertFalse(kvView.remove(tupleKey(1L), tupleVal("2")));
@@ -208,7 +208,7 @@
 
     @Test
     public void testRemoveAll() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.putAll(Map.of(tupleKey(1L), tupleVal("1"), tupleKey(2L), tupleVal("2")));
 
         Collection<Tuple> res = kvView.removeAll(List.of(tupleKey(2L), tupleKey(3L)));
@@ -222,7 +222,7 @@
 
     @Test
     public void testReplace() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         assertFalse(kvView.replace(tupleKey(3L), tupleVal("3")));
@@ -232,7 +232,7 @@
 
     @Test
     public void testReplaceExact() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         assertFalse(kvView.replace(tupleKey(1L), tupleVal("2"), tupleVal("3")));
@@ -242,7 +242,7 @@
 
     @Test
     public void testGetAndReplace() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         assertNull(kvView.getAndReplace(tupleKey(2L), tupleVal("2")));
@@ -254,7 +254,7 @@
 
     @Test
     public void testGetAndRemove() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         Tuple removed = kvView.getAndRemove(tupleKey(1L));
@@ -270,7 +270,7 @@
 
     @Test
     public void testGetAndPut() {
-        KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
+        KeyValueBinaryView kvView = defaultTable().kvView();
         kvView.put(tupleKey(1L), tupleVal("1"));
 
         Tuple res1 = kvView.getAndPut(tupleKey(2L), tupleVal("2"));
diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientTableTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientTableTest.java
index 944a323..7484406 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ClientTableTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ClientTableTest.java
@@ -22,7 +22,7 @@
 import java.util.concurrent.CompletionException;
 import org.apache.ignite.client.fakes.FakeSchemaRegistry;
 import org.apache.ignite.internal.client.table.ClientTuple;
-import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -40,7 +40,7 @@
 public class ClientTableTest extends AbstractClientTableTest {
     @Test
     public void testGetWithMissedKeyColumnThrowsException() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
 
         var key = Tuple.create().set("name", "123");
 
@@ -52,7 +52,7 @@
 
     @Test
     public void testUpsertGet() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         var tuple = tuple();
 
         table.upsert(tuple);
@@ -87,7 +87,7 @@
 
     @Test
     public void testUpsertGetAsync() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
 
         var tuple = tuple(42L, "Jack");
         var key = Tuple.create().set("id", 42L);
@@ -105,14 +105,13 @@
         FakeSchemaRegistry.setLastVer(2);
 
         var table = defaultTable();
-        var recView = table.recordView();
         Tuple tuple = tuple();
-        recView.upsert(tuple);
+        table.upsert(tuple);
 
         FakeSchemaRegistry.setLastVer(1);
 
         try (var client2 = startClient()) {
-            RecordView<Tuple> table2 = client2.tables().table(table.tableName()).recordView();
+            Table table2 = client2.tables().table(table.tableName());
             var tuple2 = tuple();
             var resTuple = table2.get(tuple2);
 
@@ -126,7 +125,7 @@
 
     @Test
     public void testInsert() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
 
         var tuple = tuple();
         var tuple2 = tuple(DEFAULT_ID, "abc");
@@ -141,7 +140,7 @@
 
     @Test
     public void testInsertCustomTuple() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         var tuple = new CustomTuple(25L, "Foo");
 
         assertTrue(table.insert(tuple));
@@ -154,7 +153,7 @@
 
     @Test
     public void testGetAll() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         table.insert(tuple(1L, "1"));
         table.insert(tuple(2L, "2"));
         table.insert(tuple(3L, "3"));
@@ -173,7 +172,7 @@
 
     @Test
     public void testUpsertAll() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
 
         List<Tuple> data = Arrays.asList(tuple(1L, "1"), tuple(2L, "2"));
         table.upsertAll(data);
@@ -191,7 +190,7 @@
 
     @Test
     public void testInsertAll() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
 
         List<Tuple> data = Arrays.asList(tuple(1L, "1"), tuple(2L, "2"));
         var skippedTuples = table.insertAll(data);
@@ -212,7 +211,7 @@
     
     @Test
     public void testReplace() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         table.insert(tuple(1L, "1"));
 
         assertFalse(table.replace(tuple(3L, "3")));
@@ -224,7 +223,7 @@
 
     @Test
     public void testReplaceExact() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         table.insert(tuple(1L, "1"));
 
         assertFalse(table.replace(tuple(3L, "3"), tuple(3L, "4")));
@@ -237,7 +236,7 @@
 
     @Test
     public void testGetAndReplace() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         var tuple = tuple(1L, "1");
         table.insert(tuple);
 
@@ -251,7 +250,7 @@
 
     @Test
     public void testDelete() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         table.insert(tuple(1L, "1"));
 
         assertFalse(table.delete(tuple(2L)));
@@ -261,7 +260,7 @@
 
     @Test
     public void testDeleteExact() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         table.insert(tuple(1L, "1"));
         table.insert(tuple(2L, "2"));
 
@@ -277,7 +276,7 @@
 
     @Test
     public void testGetAndDelete() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
         var tuple = tuple(1L, "1");
         table.insert(tuple);
 
@@ -290,7 +289,7 @@
 
     @Test
     public void testDeleteAll() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
 
         List<Tuple> data = Arrays.asList(tuple(1L, "1"), tuple(2L, "2"));
         table.insertAll(data);
@@ -311,7 +310,7 @@
 
     @Test
     public void testDeleteAllExact() {
-        var table = defaultTable().recordView();
+        var table = defaultTable();
 
         List<Tuple> data = Arrays.asList(tuple(1L, "1"), tuple(2L, "2"));
         table.insertAll(data);
diff --git a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteTables.java b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteTables.java
index 032199a..e48ef8c 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteTables.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteTables.java
@@ -134,6 +134,7 @@
         return new TableImpl(
             new FakeInternalTable(name, new IgniteUuid(UUID.randomUUID(), 0)),
             new FakeSchemaRegistry(this::getSchema),
+            null,
             null
         );
     }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITDynamicTableCreationTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITDynamicTableCreationTest.java
index dc65651..50d60d7 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITDynamicTableCreationTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITDynamicTableCreationTest.java
@@ -33,8 +33,7 @@
 import org.apache.ignite.schema.SchemaBuilders;
 import org.apache.ignite.schema.definition.ColumnType;
 import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.KeyValueView;
-import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.AfterEach;
@@ -121,28 +120,26 @@
 
         // Put data on node 1.
         Table tbl1 = clusterNodes.get(1).tables().table(schTbl1.canonicalName());
-        RecordView<Tuple> recView1 = tbl1.recordView();
-        KeyValueView<Tuple, Tuple> kvView1 = tbl1.keyValueView();
+        KeyValueBinaryView kvView1 = tbl1.kvView();
 
-        recView1.insert(Tuple.create().set("key", 1L).set("val", 111));
+        tbl1.insert(Tuple.create().set("key", 1L).set("val", 111));
         kvView1.put(Tuple.create().set("key", 2L), Tuple.create().set("val", 222));
 
         // Get data on node 2.
         Table tbl2 = clusterNodes.get(2).tables().table(schTbl1.canonicalName());
-        RecordView<Tuple> recView2 = tbl2.recordView();
-        KeyValueView<Tuple, Tuple> kvView2 = tbl2.keyValueView();
+        KeyValueBinaryView kvView2 = tbl2.kvView();
 
         final Tuple keyTuple1 = Tuple.create().set("key", 1L);
         final Tuple keyTuple2 = Tuple.create().set("key", 2L);
 
         assertThrows(IllegalArgumentException.class, () -> kvView2.get(keyTuple1).value("key"));
         assertThrows(IllegalArgumentException.class, () -> kvView2.get(keyTuple2).value("key"));
-        assertEquals(1, (Long)recView2.get(keyTuple1).value("key"));
-        assertEquals(2, (Long)recView2.get(keyTuple2).value("key"));
+        assertEquals(1, (Long)tbl2.get(keyTuple1).value("key"));
+        assertEquals(2, (Long)tbl2.get(keyTuple2).value("key"));
 
-        assertEquals(111, (Integer)recView2.get(keyTuple1).value("val"));
+        assertEquals(111, (Integer)tbl2.get(keyTuple1).value("val"));
         assertEquals(111, (Integer)kvView2.get(keyTuple1).value("val"));
-        assertEquals(222, (Integer)recView2.get(keyTuple2).value("val"));
+        assertEquals(222, (Integer)tbl2.get(keyTuple2).value("val"));
         assertEquals(222, (Integer)kvView2.get(keyTuple2).value("val"));
 
         assertThrows(IllegalArgumentException.class, () -> kvView1.get(keyTuple1).value("key"));
@@ -184,10 +181,9 @@
 
         // Put data on node 1.
         Table tbl1 = clusterNodes.get(1).tables().table(scmTbl1.canonicalName());
-        RecordView<Tuple> recView1 = tbl1.recordView();
-        KeyValueView<Tuple, Tuple> kvView1 = tbl1.keyValueView();
+        KeyValueBinaryView kvView1 = tbl1.kvView();
 
-        recView1.insert(Tuple.create().set("key", uuid).set("affKey", 42L)
+        tbl1.insert(Tuple.create().set("key", uuid).set("affKey", 42L)
             .set("valStr", "String value").set("valInt", 73).set("valNull", null));
 
         kvView1.put(Tuple.create().set("key", uuid2).set("affKey", 4242L),
@@ -195,8 +191,7 @@
 
         // Get data on node 2.
         Table tbl2 = clusterNodes.get(2).tables().table(scmTbl1.canonicalName());
-        RecordView<Tuple> recView2 = tbl2.recordView();
-        KeyValueView<Tuple, Tuple> kvView2 = tbl2.keyValueView();
+        KeyValueBinaryView kvView2 = tbl2.kvView();
 
         final Tuple keyTuple1 = Tuple.create().set("key", uuid).set("affKey", 42L);
         final Tuple keyTuple2 = Tuple.create().set("key", uuid2).set("affKey", 4242L);
@@ -208,18 +203,18 @@
         assertThrows(IllegalArgumentException.class, () -> kvView2.get(keyTuple2).value("affKey"));
 
         // Record binary view MUST return key columns in value.
-        assertEquals(uuid, recView2.get(keyTuple1).value("key"));
-        assertEquals(42L, (Long)recView2.get(keyTuple1).value("affKey"));
-        assertEquals(uuid2, recView2.get(keyTuple2).value("key"));
-        assertEquals(4242L, (Long)recView2.get(keyTuple2).value("affKey"));
+        assertEquals(uuid, tbl2.get(keyTuple1).value("key"));
+        assertEquals(42L, (Long)tbl2.get(keyTuple1).value("affKey"));
+        assertEquals(uuid2, tbl2.get(keyTuple2).value("key"));
+        assertEquals(4242L, (Long)tbl2.get(keyTuple2).value("affKey"));
 
-        assertEquals("String value", recView2.get(keyTuple1).value("valStr"));
-        assertEquals(73, (Integer)recView2.get(keyTuple1).value("valInt"));
-        assertNull(recView2.get(keyTuple1).value("valNull"));
+        assertEquals("String value", tbl2.get(keyTuple1).value("valStr"));
+        assertEquals(73, (Integer)tbl2.get(keyTuple1).value("valInt"));
+        assertNull(tbl2.get(keyTuple1).value("valNull"));
 
-        assertEquals("String value 2", recView2.get(keyTuple2).value("valStr"));
-        assertEquals(7373, (Integer)recView2.get(keyTuple2).value("valInt"));
-        assertNull(recView2.get(keyTuple2).value("valNull"));
+        assertEquals("String value 2", tbl2.get(keyTuple2).value("valStr"));
+        assertEquals(7373, (Integer)tbl2.get(keyTuple2).value("valInt"));
+        assertNull(tbl2.get(keyTuple2).value("valNull"));
 
         assertEquals("String value", kvView2.get(keyTuple1).value("valStr"));
         assertEquals(73, (Integer)kvView2.get(keyTuple1).value("valInt"));
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITIgniteNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITIgniteNodeRestartTest.java
index 62e683c..eb375a5 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITIgniteNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITIgniteNodeRestartTest.java
@@ -175,7 +175,7 @@
             Tuple key = Tuple.create().set("id", i);
             Tuple val = Tuple.create().set("name", "name " + i);
 
-            table.keyValueView().put(key, val);
+            table.kvView().put(key, val);
         }
 
         IgnitionManager.stop(NODE_NAME);
@@ -185,7 +185,7 @@
         assertNotNull(ignite.tables().table(TABLE_NAME));
 
         for (int i = 0; i < 100; i++) {
-            assertEquals("name " + i, table.keyValueView().get(Tuple.create()
+            assertEquals("name " + i, table.kvView().get(Tuple.create()
                 .set("id", i))
                 .stringValue("name"));
         }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITLiveSchemaChangeKVViewTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITLiveSchemaChangeKVViewTest.java
index 311fc35..edcd8e5 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITLiveSchemaChangeKVViewTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITLiveSchemaChangeKVViewTest.java
@@ -23,7 +23,7 @@
 import org.apache.ignite.internal.schema.SchemaMismatchException;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.schema.definition.SchemaManagementMode;
-import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Test;
@@ -45,7 +45,7 @@
 
         createTable(grid);
 
-        KeyValueView<Tuple, Tuple> view = grid.get(0).tables().table(TABLE).keyValueView();
+        KeyValueBinaryView view = grid.get(0).tables().table(TABLE).kvView();
 
         assertThrows(SchemaMismatchException.class, () -> view.put(Tuple.create().set("key", 1L), Tuple.create().set("unknownColumn", 10)));
     }
@@ -61,9 +61,9 @@
 
         Table tbl = grid.get(1).tables().table(TABLE);
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
-        KeyValueView<Tuple, Tuple> kvBinaryView = tbl.keyValueView();
+        KeyValueBinaryView kvBinaryView = tbl.kvView();
 
         Tuple key = Tuple.create().set("key", 1L);
         Tuple val = Tuple.create().set("valStrNew", "111").set("valIntNew", 333);
@@ -86,9 +86,9 @@
 
         Table tbl = grid.get(0).tables().table(TABLE);
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
-        KeyValueView<Tuple, Tuple> kvBinaryView = tbl.keyValueView();
+        KeyValueBinaryView kvBinaryView = tbl.kvView();
 
         Tuple key = Tuple.create().set("key", 1L);
         Tuple val = Tuple.create().set("valStrNew", "111").set("valIntNew", 333);
@@ -99,7 +99,7 @@
         assertEquals("111", res.value("valStrNew"));
         assertEquals(Integer.valueOf(333), res.value("valIntNew"));
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.STRICT);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.STRICT);
 
         Tuple anotherKey = Tuple.create().set("key", 2L);
         Tuple anotherVal = Tuple.create().set("valStrNew", "111").set("valIntNew", 333);
@@ -125,9 +125,9 @@
 
         Table tbl = grid.get(1).tables().table(TABLE);
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
-        KeyValueView<Tuple, Tuple> view = tbl.keyValueView();
+        KeyValueBinaryView view = tbl.kvView();
 
         Tuple oldSchemaKey = Tuple.create().set("key", 32L);
         Tuple oldSchemaVal = Tuple.create().set("valInt", 111).set("valStr", "str");
@@ -155,9 +155,9 @@
 
         Table tbl = grid.get(1).tables().table(TABLE);
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
-        KeyValueView<Tuple, Tuple> view = tbl.keyValueView();
+        KeyValueBinaryView view = tbl.kvView();
 
         Tuple oldSchemaKey = Tuple.create().set("key", 32L);
 
@@ -187,9 +187,9 @@
 
         Table tbl = grid.get(0).tables().table(TABLE);
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
-        KeyValueView<Tuple, Tuple> view = tbl.keyValueView();
+        KeyValueBinaryView view = tbl.kvView();
 
         Tuple oldSchemaKey = Tuple.create().set("key", 32L);
         Tuple oldSchemaVal = Tuple.create().set("valInt", 111).set("valStr", "str");
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITLiveSchemaChangeTableTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITLiveSchemaChangeTableTest.java
index 7278d61..d80703c 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITLiveSchemaChangeTableTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITLiveSchemaChangeTableTest.java
@@ -25,7 +25,6 @@
 import org.apache.ignite.internal.schema.SchemaMismatchException;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.schema.definition.SchemaManagementMode;
-import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Test;
@@ -50,9 +49,7 @@
 
         Table tbl = grid.get(0).tables().table(TABLE);
 
-        Tuple tuple = Tuple.create().set("key", 1L).set("unknownColumn", 10);
-
-        assertThrows(SchemaMismatchException.class, () -> tbl.recordView().insert(tuple));
+        assertThrows(SchemaMismatchException.class, () -> tbl.insert(Tuple.create().set("key", 1L).set("unknownColumn", 10)));
     }
 
     /**
@@ -65,15 +62,14 @@
         createTable(grid);
 
         Table tbl = grid.get(0).tables().table(TABLE);
-        RecordView<Tuple> recView = tbl.recordView();
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
         Tuple row = Tuple.create().set("key", 1L).set("valStrNew", "111").set("valIntNew", 333);
 
-        recView.insert(row);
+        tbl.insert(row);
 
-        Tuple res = recView.get(Tuple.create().set("key", 1L));
+        Tuple res = tbl.get(Tuple.create().set("key", 1L));
 
         assertEquals("111", res.value("valStrNew"));
         assertEquals(Integer.valueOf(333), res.value("valIntNew"));
@@ -89,19 +85,18 @@
         createTable(grid);
 
         Table tbl = grid.get(0).tables().table(TABLE);
-        RecordView<Tuple> recView = tbl.recordView();
 
         Tuple oldSchemaTuple = Tuple.create().set("key", 32L).set("valInt", 111).set("valStr", "str");
 
-        recView.insert(oldSchemaTuple);
+        tbl.insert(oldSchemaTuple);
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
         Tuple upsertOldSchemaTuple = Tuple.create().set("key", 32L).set("valStrNew", "111").set("valIntNew", 333);
 
-        recView.upsert(upsertOldSchemaTuple);
+        tbl.upsert(upsertOldSchemaTuple);
 
-        Tuple oldSchemaRes = recView.get(Tuple.create().set("key", 32L));
+        Tuple oldSchemaRes = tbl.get(Tuple.create().set("key", 32L));
 
         assertEquals("111", oldSchemaRes.value("valStrNew"));
         assertEquals(Integer.valueOf(333), oldSchemaRes.value("valIntNew"));
@@ -117,18 +112,17 @@
         createTable(grid);
 
         Table tbl = grid.get(0).tables().table(TABLE);
-        RecordView<Tuple> recView = tbl.recordView();
 
         Tuple oldSchemaTuple = Tuple.create().set("key", 32L).set("valInt", 111).set("valStr", "str");
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
         Tuple row = Tuple.create().set("key", 1L).set("valStrNew", "111").set("valIntNew", 333);
 
-        recView.insert(row);
-        recView.insert(oldSchemaTuple);
+        tbl.insert(row);
+        tbl.insert(oldSchemaTuple);
 
-        Tuple res = recView.get(Tuple.create().set("key", 1L));
+        Tuple res = tbl.get(Tuple.create().set("key", 1L));
 
         assertEquals("111", res.value("valStrNew"));
         assertEquals(Integer.valueOf(333), res.value("valIntNew"));
@@ -149,30 +143,29 @@
         createTable(grid);
 
         Table tbl = grid.get(0).tables().table(TABLE);
-        RecordView<Tuple> recView = tbl.recordView();
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
         Tuple val = Tuple.create().set("key", 1L).set("valStrNew", "111").set("valIntNew", 333);
 
-        recView.insert(val);
+        tbl.insert(val);
 
-        Tuple res = recView.get(Tuple.create().set("key", 1L));
+        Tuple res = tbl.get(Tuple.create().set("key", 1L));
         assertEquals("111", res.value("valStrNew"));
         assertEquals(Integer.valueOf(333), res.value("valIntNew"));
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.STRICT);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.STRICT);
 
         Tuple anotherKey = Tuple.create().set("key", 2L).set("valStrNew", "111").set("valIntNew", 333);
 
-        recView.insert(anotherKey);
+        tbl.insert(anotherKey);
 
-        Tuple newRes = recView.get(Tuple.create().set("key", 2L));
+        Tuple newRes = tbl.get(Tuple.create().set("key", 2L));
 
         assertEquals("111", newRes.value("valStrNew"));
         assertEquals(Integer.valueOf(333), newRes.value("valIntNew"));
 
-        assertThrows(SchemaMismatchException.class, () -> recView.insert(Tuple.create().set("key", 1L).set("unknownColumn", 10)));
+        assertThrows(SchemaMismatchException.class, () -> tbl.insert(Tuple.create().set("key", 1L).set("unknownColumn", 10)));
     }
 
     /**
@@ -185,19 +178,18 @@
         createTable(grid);
 
         Table tbl = grid.get(0).tables().table(TABLE);
-        RecordView<Tuple> recView = tbl.recordView();
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
         Tuple oldSchemaVal = Tuple.create().set("key", 32L).set("valInt", 111).set("valStr", "str");
         Tuple upsertOldSchemaVal = Tuple.create().set("key", 32L).set("valStrNew", "111").set("valIntNew", 333);
         Tuple secondUpsertOldSchemaVal = Tuple.create().set("key", 32L).set("valStrNew", "111").set("valIntNew", 333).set("anotherNewVal", 48L);
 
-        recView.insert(oldSchemaVal);
-        recView.upsert(upsertOldSchemaVal);
-        recView.upsert(secondUpsertOldSchemaVal);
+        tbl.insert(oldSchemaVal);
+        tbl.upsert(upsertOldSchemaVal);
+        tbl.upsert(secondUpsertOldSchemaVal);
 
-        Tuple oldSchemaRes = recView.get(Tuple.create().set("key", 32L));
+        Tuple oldSchemaRes = tbl.get(Tuple.create().set("key", 32L));
 
         assertEquals("111", oldSchemaRes.value("valStrNew"));
         assertEquals(Integer.valueOf(333), oldSchemaRes.value("valIntNew"));
@@ -214,9 +206,8 @@
         createTable(grid);
 
         Table tbl = grid.get(0).tables().table(TABLE);
-        RecordView<Tuple> recView = tbl.recordView();
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
         UUID uuid = UUID.randomUUID();
 
@@ -231,9 +222,9 @@
             .set("valStrNew", "111")
             .set("valUUIDNew", uuid);
 
-        recView.insert(row);
+        tbl.insert(row);
 
-        Tuple res = recView.get(Tuple.create().set("key", 1L));
+        Tuple res = tbl.get(Tuple.create().set("key", 1L));
 
         assertEquals(Byte.valueOf((byte)10), res.value("valByteNew"));
         assertEquals(Short.valueOf((short)48), res.value("valShortNew"));
@@ -247,9 +238,9 @@
 
         Tuple secondRow = Tuple.create().set("key", 2L);
 
-        recView.insert(secondRow);
+        tbl.insert(secondRow);
 
-        Tuple nullRes = recView.get(secondRow);
+        Tuple nullRes = tbl.get(secondRow);
 
         assertNull(nullRes.value("valByteNew"));
         assertNull(nullRes.value("valShortNew"));
@@ -271,9 +262,8 @@
         createTable(grid);
 
         Table tbl = grid.get(0).tables().table(TABLE);
-        RecordView<Tuple> recView = tbl.recordView();
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
         UUID uuid = UUID.randomUUID();
 
@@ -288,7 +278,7 @@
             .set("valStrNew", "111")
             .set("valUUIDNew", uuid);
 
-        recView.insert(row);
+        tbl.insert(row);
 
         SchemaDescriptor schema = ((TableImpl)tbl).schemaView().schema();
 
@@ -305,16 +295,15 @@
         createTable(grid);
 
         Table tbl = grid.get(0).tables().table(TABLE);
-        RecordView<Tuple> recView = tbl.recordView();
 
-        ((TableImpl)tbl).schemaMode(SchemaManagementMode.LIVE);
+        ((TableImpl)tbl).schemaType(SchemaManagementMode.LIVE);
 
         Tuple rowWithObject = Tuple.create().set("key", 1L).set("newBrokenColumn", new Object());
 
-        assertThrows(InvalidTypeException.class, () -> recView.insert(rowWithObject));
+        assertThrows(InvalidTypeException.class, () -> tbl.insert(rowWithObject));
 
         Tuple rowWithNull = Tuple.create().set("key", 1L).set("valStrNew", null).set("valIntNew", 333);
 
-        assertThrows(InvalidTypeException.class, () -> recView.insert(rowWithNull));
+        assertThrows(InvalidTypeException.class, () -> tbl.insert(rowWithNull));
     }
 }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITSchemaChangeKVViewTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITSchemaChangeKVViewTest.java
index a0a4278..94f673b 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITSchemaChangeKVViewTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITSchemaChangeKVViewTest.java
@@ -25,7 +25,7 @@
 import org.apache.ignite.schema.SchemaBuilders;
 import org.apache.ignite.schema.definition.ColumnDefinition;
 import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Test;
 
@@ -46,7 +46,7 @@
 
         createTable(grid);
 
-        KeyValueView<Tuple, Tuple> kvView = grid.get(0).tables().table(TABLE).keyValueView();
+        KeyValueBinaryView kvView = grid.get(0).tables().table(TABLE).kvView();
 
         {
             kvView.put(
@@ -90,7 +90,7 @@
 
         createTable(grid);
 
-        KeyValueView<Tuple, Tuple> kvView = grid.get(0).tables().table(TABLE).keyValueView();
+        KeyValueBinaryView kvView = grid.get(0).tables().table(TABLE).kvView();
 
         {
             kvView.put(Tuple.create().set("key", 1L), Tuple.create().set("valInt", 111));
@@ -132,7 +132,7 @@
 
         createTable(grid);
 
-        KeyValueView<Tuple, Tuple> kvView = grid.get(0).tables().table(TABLE).keyValueView();
+        KeyValueBinaryView kvView = grid.get(0).tables().table(TABLE).kvView();
 
         {
             kvView.put(Tuple.create().set("key", 1L), Tuple.create().set("valInt", 111));
@@ -183,7 +183,7 @@
 
         final ColumnDefinition column = SchemaBuilders.column("val", ColumnType.string()).asNullable().withDefaultValueExpression("default").build();
 
-        KeyValueView<Tuple, Tuple> kvView = grid.get(0).tables().table(TABLE).keyValueView();
+        KeyValueBinaryView kvView = grid.get(0).tables().table(TABLE).kvView();
 
         {
             kvView.put(Tuple.create().set("key", 1L), Tuple.create().set("valInt", 111));
@@ -262,7 +262,7 @@
 
         createTable(grid);
 
-        KeyValueView<Tuple, Tuple> kvView = grid.get(0).tables().table(TABLE).keyValueView();
+        KeyValueBinaryView kvView = grid.get(0).tables().table(TABLE).kvView();
 
         final String colName = "valStr";
 
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITSchemaChangeTableViewTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITSchemaChangeTableViewTest.java
index 834ad5e..f823abf 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITSchemaChangeTableViewTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITSchemaChangeTableViewTest.java
@@ -25,7 +25,7 @@
 import org.apache.ignite.schema.SchemaBuilders;
 import org.apache.ignite.schema.definition.ColumnDefinition;
 import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Test;
 
@@ -46,7 +46,7 @@
 
         createTable(grid);
 
-        RecordView<Tuple> tbl = grid.get(0).tables().table(TABLE).recordView();
+        final Table tbl = grid.get(0).tables().table(TABLE);
 
         {
             tbl.insert(Tuple.create().set("key", 1L).set("valInt", 111).set("valStr", "str"));
@@ -87,7 +87,7 @@
 
         createTable(grid);
 
-        RecordView<Tuple> tbl = grid.get(0).tables().table(TABLE).recordView();
+        Table tbl = grid.get(0).tables().table(TABLE);
 
         {
             tbl.insert(Tuple.create().set("key", 1L).set("valInt", 111));
@@ -125,7 +125,7 @@
 
         createTable(grid);
 
-        RecordView<Tuple> tbl = grid.get(0).tables().table(TABLE).recordView();
+        Table tbl = grid.get(0).tables().table(TABLE);
 
         {
             tbl.insert(Tuple.create().set("key", 1L).set("valInt", 111));
@@ -170,7 +170,7 @@
 
         createTable(grid);
 
-        RecordView<Tuple> tbl = grid.get(0).tables().table(TABLE).recordView();
+        Table tbl = grid.get(0).tables().table(TABLE);
 
         {
             tbl.insert(Tuple.create().set("key", 1L).set("valInt", 111));
@@ -216,7 +216,7 @@
 
         final ColumnDefinition column = SchemaBuilders.column("val", ColumnType.string()).asNullable().withDefaultValueExpression("default").build();
 
-        RecordView<Tuple> tbl = grid.get(0).tables().table(TABLE).recordView();
+        Table tbl = grid.get(0).tables().table(TABLE);
 
         {
             tbl.insert(Tuple.create().set("key", 1L).set("valInt", 111));
@@ -288,7 +288,7 @@
 
         createTable(grid);
 
-        RecordView<Tuple> tbl = grid.get(0).tables().table(TABLE).recordView();
+        Table tbl = grid.get(0).tables().table(TABLE);
 
         final String colName = "valStr";
 
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITTableCreationTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITTableCreationTest.java
index b8f9c00..1635f78 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITTableCreationTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITTableCreationTest.java
@@ -27,8 +27,7 @@
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.table.KeyValueView;
-import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.AfterEach;
@@ -183,23 +182,21 @@
 
         { /* Table 1. */
             Table tbl1 = clusterNodes.get(1).tables().table("tbl1");
-            RecordView<Tuple> recView = tbl1.recordView();
-            KeyValueView<Tuple, Tuple> kvView1 = tbl1.keyValueView();
+            KeyValueBinaryView kvView1 = tbl1.kvView();
 
-            recView.insert(Tuple.create().set("key", 1L).set("val", 111));
+            tbl1.insert(Tuple.create().set("key", 1L).set("val", 111));
             kvView1.put(Tuple.create().set("key", 2L), Tuple.create().set("val", 222));
 
             Table tbl2 = clusterNodes.get(2).tables().table("tbl1");
-            RecordView<Tuple> recView2 = tbl2.recordView();
-            KeyValueView<Tuple, Tuple> kvView2 = tbl2.keyValueView();
+            KeyValueBinaryView kvView2 = tbl2.kvView();
 
             final Tuple keyTuple1 = Tuple.create().set("key", 1L);
             final Tuple keyTuple2 = Tuple.create().set("key", 2L);
 
-            assertEquals(111, (Integer)recView2.get(keyTuple1).value("val"));
-            assertEquals(111, (Integer)kvView2.get(keyTuple1).value("val"));
-            assertEquals(222, (Integer)recView2.get(keyTuple2).value("val"));
-            assertEquals(222, (Integer)kvView2.get(keyTuple2).value("val"));
+            assertEquals(111, (Integer)tbl2.get(keyTuple1).value("val"));
+            assertEquals(111, (Integer)kvView1.get(keyTuple1).value("val"));
+            assertEquals(222, (Integer)tbl2.get(keyTuple2).value("val"));
+            assertEquals(222, (Integer)kvView1.get(keyTuple2).value("val"));
         }
 
         { /* Table 2. */
@@ -208,10 +205,9 @@
 
             // Put data on node 1.
             Table tbl1 = clusterNodes.get(1).tables().table("tbl1");
-            RecordView<Tuple> recView = tbl1.recordView();
-            KeyValueView<Tuple, Tuple> kvView1 = tbl1.keyValueView();
+            KeyValueBinaryView kvView1 = tbl1.kvView();
 
-            recView.insert(Tuple.create().set("key", uuid).set("affKey", 42L)
+            tbl1.insert(Tuple.create().set("key", uuid).set("affKey", 42L)
                 .set("valStr", "String value").set("valInt", 73).set("valNullable", null));
 
             kvView1.put(Tuple.create().set("key", uuid2).set("affKey", 4242L),
@@ -219,23 +215,22 @@
 
             // Get data on node 2.
             Table tbl2 = clusterNodes.get(2).tables().table("tbl1");
-            RecordView<Tuple> recView2 = tbl2.recordView();
-            KeyValueView<Tuple, Tuple> kvView2 = tbl2.keyValueView();
+            KeyValueBinaryView kvView2 = tbl2.kvView();
 
             final Tuple keyTuple1 = Tuple.create().set("key", uuid).set("affKey", 42L);
             final Tuple keyTuple2 = Tuple.create().set("key", uuid2).set("affKey", 4242L);
 
-            assertEquals("String value", recView2.get(keyTuple1).value("valStr"));
+            assertEquals("String value", tbl2.get(keyTuple1).value("valStr"));
             assertEquals("String value", kvView2.get(keyTuple1).value("valStr"));
-            assertEquals("String value 2", recView2.get(keyTuple2).value("valStr"));
+            assertEquals("String value 2", tbl2.get(keyTuple2).value("valStr"));
             assertEquals("String value 2", kvView2.get(keyTuple2).value("valStr"));
-            assertEquals(73, (Integer)recView2.get(keyTuple1).value("valInt"));
+            assertEquals(73, (Integer)tbl2.get(keyTuple1).value("valInt"));
             assertEquals(73, (Integer)kvView2.get(keyTuple1).value("valInt"));
-            assertEquals(7373, (Integer)recView2.get(keyTuple2).value("valInt"));
+            assertEquals(7373, (Integer)tbl2.get(keyTuple2).value("valInt"));
             assertEquals(7373, (Integer)kvView2.get(keyTuple2).value("valInt"));
-            assertNull(recView2.get(keyTuple1).value("valNullable"));
+            assertNull(tbl2.get(keyTuple1).value("valNullable"));
             assertNull(kvView2.get(keyTuple1).value("valNullable"));
-            assertNull(recView2.get(keyTuple2).value("valNullable"));
+            assertNull(tbl2.get(keyTuple2).value("valNullable"));
             assertNull(kvView2.get(keyTuple2).value("valNullable"));
         }
     }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITThinClientConnectionTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITThinClientConnectionTest.java
index 08e0403..ff92c7b 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITThinClientConnectionTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ITThinClientConnectionTest.java
@@ -34,7 +34,6 @@
 import org.apache.ignite.schema.SchemaBuilders;
 import org.apache.ignite.schema.definition.ColumnType;
 import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.AfterEach;
@@ -125,15 +124,13 @@
                 var tuple = Tuple.create().set(keyCol, 1).set(valCol, "Hello");
                 var keyTuple = Tuple.create().set(keyCol, 1);
 
-                RecordView<Tuple> recView = table.recordView();
+                table.upsert(tuple);
+                assertEquals("Hello", table.get(keyTuple).stringValue(valCol));
 
-                recView.upsert(tuple);
-                assertEquals("Hello", recView.get(keyTuple).stringValue(valCol));
-
-                var kvView = table.keyValueView();
+                var kvView = table.kvView();
                 assertEquals("Hello", kvView.get(keyTuple).stringValue(valCol));
 
-                assertTrue(recView.delete(keyTuple));
+                assertTrue(table.delete(keyTuple));
             }
         }
     }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ITJdbcMetadataSelfTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ITJdbcMetadataSelfTest.java
index f6d345f..ef27ca9 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ITJdbcMetadataSelfTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ITJdbcMetadataSelfTest.java
@@ -92,8 +92,8 @@
         Table tbl1 = clusterNodes.get(0).tables().table(perTbl.canonicalName());
         Table tbl2 = clusterNodes.get(0).tables().table(orgTbl.canonicalName());
 
-        tbl1.recordView().insert(Tuple.create().set("ORGID", 1).set("NAME", "111").set("AGE", 111));
-        tbl2.recordView().insert(Tuple.create().set("ID", 1).set("NAME", "AAA").set("BIGDATA", BigDecimal.valueOf(10)));
+        tbl1.insert(Tuple.create().set("ORGID", 1).set("NAME", "111").set("AGE", 111));
+        tbl2.insert(Tuple.create().set("ID", 1).set("NAME", "AAA").set("BIGDATA", BigDecimal.valueOf(10)));
     }
 
     /**
diff --git a/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ITDistributedTableTest.java b/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ITDistributedTableTest.java
index ae32af4..b2fec0d 100644
--- a/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ITDistributedTableTest.java
+++ b/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ITDistributedTableTest.java
@@ -63,8 +63,7 @@
 import org.apache.ignite.raft.client.service.RaftGroupService;
 import org.apache.ignite.raft.jraft.RaftMessagesFactory;
 import org.apache.ignite.raft.jraft.rpc.impl.RaftGroupServiceImpl;
-import org.apache.ignite.table.KeyValueView;
-import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.apache.ignite.utils.ClusterServiceTestUtils;
@@ -301,11 +300,11 @@
             @Override public Row resolve(BinaryRow row) {
                 return new Row(SCHEMA, row);
             }
-        }, null);
+        }, null, null);
 
-        partitionedTableRecordView(tbl.recordView(), PARTS * 10);
+        partitionedTableView(tbl, PARTS * 10);
 
-        partitionedTableKeyValueView(tbl.keyValueView(), PARTS * 10);
+        partitionedTableKVBinaryView(tbl.kvView(), PARTS * 10);
     }
 
     /**
@@ -314,7 +313,7 @@
      * @param view Table view.
      * @param keysCnt Count of keys.
      */
-    public void partitionedTableRecordView(RecordView<Tuple> view, int keysCnt) {
+    public void partitionedTableView(Table view, int keysCnt) {
         LOG.info("Test for Table view [keys={}]", keysCnt);
 
         for (int i = 0; i < keysCnt; i++) {
@@ -405,7 +404,7 @@
      * @param view Table view.
      * @param keysCnt Count of keys.
      */
-    public void partitionedTableKeyValueView(KeyValueView<Tuple, Tuple> view, int keysCnt) {
+    public void partitionedTableKVBinaryView(KeyValueBinaryView view, int keysCnt) {
         LOG.info("Tes for Key-Value binary view [keys={}]", keysCnt);
 
         for (int i = 0; i < keysCnt; i++) {
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/AbstractTableView.java b/modules/table/src/main/java/org/apache/ignite/internal/table/AbstractTableView.java
index 931e996..aab4ad0 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/AbstractTableView.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/AbstractTableView.java
@@ -22,6 +22,7 @@
 import org.apache.ignite.internal.schema.SchemaRegistry;
 import org.apache.ignite.lang.IgniteInternalException;
 import org.apache.ignite.tx.Transaction;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -32,7 +33,7 @@
     protected final InternalTable tbl;
 
     /** Schema registry. */
-    protected final SchemaRegistry schemaReg;
+    final SchemaRegistry schemaReg;
 
     /** The transaction */
     protected final @Nullable Transaction tx;
@@ -50,6 +51,26 @@
     }
 
     /**
+     * @return Schema registry for the table.
+     */
+    public @NotNull SchemaRegistry schemaRegistry() {
+        return schemaReg;
+    }
+
+    /**
+     * @return Current transaction.
+     */
+    public @Nullable Transaction transaction() {
+        return tx;
+    }
+
+    /**
+     * @param tx The transaction.
+     * @return Transactional view.
+     */
+    public abstract AbstractTableView withTransaction(Transaction tx);
+
+    /**
      * Waits for operation completion.
      *
      * @param fut Future to wait to.
@@ -71,11 +92,4 @@
             throw new IgniteInternalException(e);
         }
     }
-
-    /**
-     * @return Current transaction.
-     */
-    public @Nullable Transaction transaction() {
-        return tx;
-    }
 }
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueBinaryViewImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/KVBinaryViewImpl.java
similarity index 96%
rename from modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueBinaryViewImpl.java
rename to modules/table/src/main/java/org/apache/ignite/internal/table/KVBinaryViewImpl.java
index 31ea280..4134b43 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueBinaryViewImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/KVBinaryViewImpl.java
@@ -29,7 +29,7 @@
 import org.apache.ignite.internal.schema.row.Row;
 import org.apache.ignite.internal.table.distributed.TableManager;
 import org.apache.ignite.table.InvokeProcessor;
-import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Tuple;
 import org.apache.ignite.tx.Transaction;
 import org.jetbrains.annotations.NotNull;
@@ -37,7 +37,7 @@
 /**
  * Key-value view implementation for binary user-object representation.
  */
-public class KeyValueBinaryViewImpl extends AbstractTableView implements KeyValueView<Tuple, Tuple> {
+public class KVBinaryViewImpl extends AbstractTableView implements KeyValueBinaryView {
     /** Marshaller. */
     private final TupleMarshallerImpl marsh;
 
@@ -50,7 +50,7 @@
      * @param tbl Table storage.
      * @param schemaReg Schema registry.
      */
-    public KeyValueBinaryViewImpl(InternalTable tbl, SchemaRegistry schemaReg, TableManager tblMgr, Transaction tx) {
+    public KVBinaryViewImpl(InternalTable tbl, SchemaRegistry schemaReg, TableManager tblMgr, Transaction tx) {
         super(tbl, schemaReg, tx);
 
         this.tblMgr = tblMgr;
@@ -296,8 +296,8 @@
     }
 
     /** {@inheritDoc} */
-    @Override public KeyValueBinaryViewImpl withTransaction(Transaction tx) {
-        return new KeyValueBinaryViewImpl(tbl, schemaReg, tblMgr, tx);
+    @Override public KVBinaryViewImpl withTransaction(Transaction tx) {
+        return new KVBinaryViewImpl(tbl, schemaReg, tblMgr, tx);
     }
 
     /**
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueViewImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/KVViewImpl.java
similarity index 96%
rename from modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueViewImpl.java
rename to modules/table/src/main/java/org/apache/ignite/internal/table/KVViewImpl.java
index a0c4b5c..07d04a0 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueViewImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/KVViewImpl.java
@@ -38,7 +38,7 @@
 /**
  * Key-value view implementation.
  */
-public class KeyValueViewImpl<K, V> extends AbstractTableView implements KeyValueView<K, V> {
+public class KVViewImpl<K, V> extends AbstractTableView implements KeyValueView<K, V> {
     /**
      * Constructor.
      * @param tbl Table storage.
@@ -47,8 +47,8 @@
      * @param valueMapper Value class mapper.
      * @param tx The transaction.
      */
-    public KeyValueViewImpl(InternalTable tbl, SchemaRegistry schemaReg, KeyMapper<K> keyMapper,
-                            ValueMapper<V> valueMapper, @Nullable Transaction tx) {
+    public KVViewImpl(InternalTable tbl, SchemaRegistry schemaReg, KeyMapper<K> keyMapper,
+        ValueMapper<V> valueMapper, @Nullable Transaction tx) {
         super(tbl, schemaReg, tx);
     }
 
@@ -232,7 +232,7 @@
     }
 
     /** {@inheritDoc} */
-    @Override public KeyValueViewImpl<K, V> withTransaction(Transaction tx) {
+    @Override public KVViewImpl<K, V> withTransaction(Transaction tx) {
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/RecordBinaryViewImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/RecordBinaryViewImpl.java
deleted file mode 100644
index b5843fe..0000000
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/RecordBinaryViewImpl.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.table;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-import org.apache.ignite.internal.schema.BinaryRow;
-import org.apache.ignite.internal.schema.SchemaRegistry;
-import org.apache.ignite.internal.schema.marshaller.TupleMarshaller;
-import org.apache.ignite.internal.schema.row.Row;
-import org.apache.ignite.internal.table.distributed.TableManager;
-import org.apache.ignite.table.InvokeProcessor;
-import org.apache.ignite.table.RecordView;
-import org.apache.ignite.table.Tuple;
-import org.apache.ignite.tx.Transaction;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * Table view implementation for binary objects.
- */
-public class RecordBinaryViewImpl extends AbstractTableView implements RecordView<Tuple> {
-    /** Marshaller. */
-    private final TupleMarshallerImpl marsh;
-
-    /** Table manager. */
-    private final TableManager tblMgr;
-
-    /**
-     * Constructor.
-     *
-     * @param tbl Table.
-     * @param schemaReg Table schema registry.
-     * @param tblMgr Table manager.
-     * @param tx The transaction.
-     */
-    public RecordBinaryViewImpl(InternalTable tbl, SchemaRegistry schemaReg, TableManager tblMgr, @Nullable Transaction tx) {
-        super(tbl, schemaReg, tx);
-
-        marsh = new TupleMarshallerImpl(tblMgr, tbl, schemaReg);
-
-        this.tblMgr = tblMgr;
-    }
-
-
-    /** {@inheritDoc} */
-    @Override public RecordBinaryViewImpl withTransaction(Transaction tx) {
-        return new RecordBinaryViewImpl(tbl, schemaReg, tblMgr, tx);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Tuple get(@NotNull Tuple keyRec) {
-        return sync(getAsync(keyRec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Tuple> getAsync(@NotNull Tuple keyRec) {
-        Objects.requireNonNull(keyRec);
-
-        final Row keyRow = marshaller().marshalKey(keyRec); // Convert to portable format to pass TX/storage layer.
-
-        return tbl.get(keyRow, tx).thenApply(this::wrap);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Collection<Tuple> getAll(@NotNull Collection<Tuple> keyRecs) {
-        return sync(getAllAsync(keyRecs));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Collection<Tuple>> getAllAsync(@NotNull Collection<Tuple> keyRecs) {
-        Objects.requireNonNull(keyRecs);
-
-        HashSet<BinaryRow> keys = new HashSet<>(keyRecs.size());
-
-        for (Tuple keyRec : keyRecs) {
-            final Row keyRow = marshaller().marshalKey(keyRec);
-
-            keys.add(keyRow);
-        }
-
-        return tbl.getAll(keys, tx).thenApply(this::wrap);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void upsert(@NotNull Tuple rec) {
-        sync(upsertAsync(rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Void> upsertAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        final Row keyRow = marshaller().marshal(rec);
-
-        return tbl.upsert(keyRow, tx);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void upsertAll(@NotNull Collection<Tuple> recs) {
-        sync(upsertAllAsync(recs));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Void> upsertAllAsync(@NotNull Collection<Tuple> recs) {
-        Objects.requireNonNull(recs);
-
-        HashSet<BinaryRow> keys = new HashSet<>(recs.size());
-
-        for (Tuple keyRec : recs) {
-            final Row keyRow = marshaller().marshal(keyRec);
-
-            keys.add(keyRow);
-        }
-
-        return tbl.upsertAll(keys, tx);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Tuple getAndUpsert(@NotNull Tuple rec) {
-        return sync(getAndUpsertAsync(rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Tuple> getAndUpsertAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        final Row keyRow = marshaller().marshal(rec);
-
-        return tbl.getAndUpsert(keyRow, tx).thenApply(this::wrap);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean insert(@NotNull Tuple rec) {
-        return sync(insertAsync(rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> insertAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        final Row keyRow = marshaller().marshal(rec);
-
-        return tbl.insert(keyRow, tx);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Collection<Tuple> insertAll(@NotNull Collection<Tuple> recs) {
-        return sync(insertAllAsync(recs));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Collection<Tuple>> insertAllAsync(@NotNull Collection<Tuple> recs) {
-        Objects.requireNonNull(recs);
-
-        HashSet<BinaryRow> keys = new HashSet<>(recs.size());
-
-        for (Tuple keyRec : recs) {
-            final Row keyRow = marshaller().marshal(keyRec);
-
-            keys.add(keyRow);
-        }
-
-        return tbl.insertAll(keys, tx).thenApply(this::wrap);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean replace(@NotNull Tuple rec) {
-        return sync(replaceAsync(rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        final Row keyRow = marshaller().marshal(rec);
-
-        return tbl.replace(keyRow, tx);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean replace(@NotNull Tuple oldRec, @NotNull Tuple newRec) {
-        return sync(replaceAsync(oldRec, newRec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull Tuple oldRec, @NotNull Tuple newRec) {
-        Objects.requireNonNull(oldRec);
-        Objects.requireNonNull(newRec);
-
-        final Row oldRow = marshaller().marshal(oldRec);
-        final Row newRow = marshaller().marshal(newRec);
-
-        return tbl.replace(oldRow, newRow, tx);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Tuple getAndReplace(@NotNull Tuple rec) {
-        return sync(getAndReplaceAsync(rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Tuple> getAndReplaceAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        final Row keyRow = marshaller().marshal(rec);
-
-        return tbl.getAndReplace(keyRow, tx).thenApply(this::wrap);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean delete(@NotNull Tuple keyRec) {
-        return sync(deleteAsync(keyRec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> deleteAsync(@NotNull Tuple keyRec) {
-        Objects.requireNonNull(keyRec);
-
-        final Row keyRow = marshaller().marshalKey(keyRec);
-
-        return tbl.delete(keyRow, tx);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean deleteExact(@NotNull Tuple rec) {
-        return sync(deleteExactAsync(rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Boolean> deleteExactAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        final Row row = marshaller().marshal(rec);
-
-        return tbl.deleteExact(row, tx);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Tuple getAndDelete(@NotNull Tuple rec) {
-        return sync(getAndDeleteAsync(rec));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Tuple> getAndDeleteAsync(@NotNull Tuple rec) {
-        Objects.requireNonNull(rec);
-
-        final Row row = marshaller().marshalKey(rec);
-
-        return tbl.getAndDelete(row, tx).thenApply(this::wrap);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Collection<Tuple> deleteAll(@NotNull Collection<Tuple> recs) {
-        return sync(deleteAllAsync(recs));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Collection<Tuple>> deleteAllAsync(@NotNull Collection<Tuple> recs) {
-        Objects.requireNonNull(recs);
-
-        HashSet<BinaryRow> keys = new HashSet<>(recs.size());
-
-        for (Tuple keyRec : recs) {
-            final Row keyRow = marshaller().marshalKey(keyRec);
-
-            keys.add(keyRow);
-        }
-
-        return tbl.deleteAll(keys, tx).thenApply(this::wrap);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Collection<Tuple> deleteAllExact(@NotNull Collection<Tuple> recs) {
-        return sync(deleteAllExactAsync(recs));
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull CompletableFuture<Collection<Tuple>> deleteAllExactAsync(
-        @NotNull Collection<Tuple> recs
-    ) {
-        Objects.requireNonNull(recs);
-
-        HashSet<BinaryRow> keys = new HashSet<>(recs.size());
-
-        for (Tuple keyRec : recs) {
-            final Row keyRow = marshaller().marshal(keyRec);
-
-            keys.add(keyRow);
-        }
-
-        return tbl.deleteAllExact(keys, tx).thenApply(this::wrap);
-    }
-
-    /** {@inheritDoc} */
-    @Override public <T extends Serializable> T invoke(
-        @NotNull Tuple keyRec,
-        InvokeProcessor<Tuple, Tuple, T> proc
-    ) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull <T extends Serializable> CompletableFuture<T> invokeAsync(
-        @NotNull Tuple keyRec,
-        InvokeProcessor<Tuple, Tuple, T> proc
-    ) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /** {@inheritDoc} */
-    @Override public <T extends Serializable> Map<Tuple, T> invokeAll(
-        @NotNull Collection<Tuple> keyRecs,
-        InvokeProcessor<Tuple, Tuple, T> proc
-    ) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull <T extends Serializable> CompletableFuture<Map<Tuple, T>> invokeAllAsync(
-        @NotNull Collection<Tuple> keyRecs,
-        InvokeProcessor<Tuple, Tuple, T> proc
-    ) {
-        throw new UnsupportedOperationException("Not implemented yet.");
-    }
-
-    /**
-     * @return Marshaller.
-     */
-    private TupleMarshaller marshaller() {
-        return marsh;
-    }
-
-    /**
-     * @param row Binary row.
-     * @return Table row tuple.
-     */
-    private Tuple wrap(BinaryRow row) {
-        if (row == null)
-            return null;
-
-        final Row wrapped = schemaReg.resolve(row);
-
-        return TableRow.tuple(wrapped);
-    }
-
-    /**
-     * @param rows Binary rows.
-     * @return Table rows.
-     */
-    private Collection<Tuple> wrap(Collection<BinaryRow> rows) {
-        if (rows == null)
-            return null;
-
-        return rows.stream().filter(Objects::nonNull).map(this::wrap).collect(Collectors.toSet());
-    }
-}
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/RecordViewImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/RecordViewImpl.java
index 8bdcc44..709f113 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/RecordViewImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/RecordViewImpl.java
@@ -50,6 +50,24 @@
     }
 
     /** {@inheritDoc} */
+    @Override public R fill(R recObjToFill) {
+        return sync(fillAsync(recObjToFill));
+    }
+
+    /** {@inheritDoc} */
+    @Override public CompletableFuture<R> fillAsync(R recObjToFill) {
+        Objects.requireNonNull(recObjToFill);
+
+        RecordSerializer<R> marsh = serializer();
+
+        Row kRow = marsh.serialize(recObjToFill);  // Convert to portable format to pass TX/storage layer.
+
+        return tbl.get(kRow, tx)  // Load async.
+            .thenApply(this::wrap) // Binary -> schema-aware row
+            .thenApply(r -> marsh.deserialize(r, recObjToFill)); // Deserialize and fill record.
+    }
+
+    /** {@inheritDoc} */
     @Override public R get(@NotNull R keyRec) {
         return sync(getAsync(keyRec));
     }
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/TableImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/TableImpl.java
index 34e27d2..3cca8b2 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/TableImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/TableImpl.java
@@ -17,10 +17,22 @@
 
 package org.apache.ignite.internal.table;
 
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+import org.apache.ignite.internal.schema.BinaryRow;
 import org.apache.ignite.internal.schema.SchemaRegistry;
+import org.apache.ignite.internal.schema.marshaller.TupleMarshaller;
+import org.apache.ignite.internal.schema.row.Row;
 import org.apache.ignite.internal.table.distributed.TableManager;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.schema.definition.SchemaManagementMode;
+import org.apache.ignite.table.InvokeProcessor;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
@@ -28,31 +40,33 @@
 import org.apache.ignite.table.mapper.KeyMapper;
 import org.apache.ignite.table.mapper.RecordMapper;
 import org.apache.ignite.table.mapper.ValueMapper;
+import org.apache.ignite.tx.Transaction;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Table view implementation for binary objects.
  */
-public class TableImpl implements Table {
+public class TableImpl extends AbstractTableView implements Table {
+    /** Marshaller. */
+    private final TupleMarshallerImpl marsh;
+
     /** Table manager. */
     private final TableManager tblMgr;
 
-    /** Internal table. */
-    private final InternalTable tbl;
-
-    /** Schema registry. */
-    private final SchemaRegistry schemaReg;
-
     /**
      * Constructor.
      *
      * @param tbl Table.
      * @param schemaReg Table schema registry.
      * @param tblMgr Table manager.
+     * @param tx The transaction.
      */
-    public TableImpl(InternalTable tbl, SchemaRegistry schemaReg, TableManager tblMgr) {
-        this.tbl = tbl;
-        this.schemaReg = schemaReg;
+    public TableImpl(InternalTable tbl, SchemaRegistry schemaReg, TableManager tblMgr, @Nullable Transaction tx) {
+        super(tbl, schemaReg, tx);
+
+        marsh = new TupleMarshallerImpl(tblMgr, tbl, schemaReg);
+
         this.tblMgr = tblMgr;
     }
 
@@ -81,28 +95,335 @@
 
     /** {@inheritDoc} */
     @Override public <R> RecordView<R> recordView(RecordMapper<R> recMapper) {
-        return new RecordViewImpl<>(tbl, schemaReg, recMapper, null);
+        return new RecordViewImpl<>(tbl, schemaReg, recMapper, tx);
     }
 
     /** {@inheritDoc} */
-    @Override public RecordView<Tuple> recordView() {
-        return new RecordBinaryViewImpl(tbl, schemaReg, tblMgr, null);
+    @Override public <K, V> KeyValueView<K, V> kvView(KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
+        return new KVViewImpl<>(tbl, schemaReg, keyMapper, valMapper, tx);
     }
 
     /** {@inheritDoc} */
-    @Override public <K, V> KeyValueView<K, V> keyValueView(KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
-        return new KeyValueViewImpl<>(tbl, schemaReg, keyMapper, valMapper, null);
+    @Override public KeyValueBinaryView kvView() {
+        return new KVBinaryViewImpl(tbl, schemaReg, tblMgr, tx);
     }
 
     /** {@inheritDoc} */
-    @Override public KeyValueView<Tuple, Tuple> keyValueView() {
-        return new KeyValueBinaryViewImpl(tbl, schemaReg, tblMgr, null);
+    @Override public TableImpl withTransaction(Transaction tx) {
+        return new TableImpl(tbl, schemaReg, tblMgr, tx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Tuple get(@NotNull Tuple keyRec) {
+        return sync(getAsync(keyRec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Tuple> getAsync(@NotNull Tuple keyRec) {
+        Objects.requireNonNull(keyRec);
+
+        final Row keyRow = marshaller().marshalKey(keyRec); // Convert to portable format to pass TX/storage layer.
+
+        return tbl.get(keyRow, tx).thenApply(this::wrap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Tuple> getAll(@NotNull Collection<Tuple> keyRecs) {
+        return sync(getAllAsync(keyRecs));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Collection<Tuple>> getAllAsync(@NotNull Collection<Tuple> keyRecs) {
+        Objects.requireNonNull(keyRecs);
+
+        HashSet<BinaryRow> keys = new HashSet<>(keyRecs.size());
+
+        for (Tuple keyRec : keyRecs) {
+            final Row keyRow = marshaller().marshalKey(keyRec);
+
+            keys.add(keyRow);
+        }
+
+        return tbl.getAll(keys, tx).thenApply(this::wrap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void upsert(@NotNull Tuple rec) {
+        sync(upsertAsync(rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Void> upsertAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        final Row keyRow = marshaller().marshal(rec);
+
+        return tbl.upsert(keyRow, tx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void upsertAll(@NotNull Collection<Tuple> recs) {
+        sync(upsertAllAsync(recs));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Void> upsertAllAsync(@NotNull Collection<Tuple> recs) {
+        Objects.requireNonNull(recs);
+
+        HashSet<BinaryRow> keys = new HashSet<>(recs.size());
+
+        for (Tuple keyRec : recs) {
+            final Row keyRow = marshaller().marshal(keyRec);
+
+            keys.add(keyRow);
+        }
+
+        return tbl.upsertAll(keys, tx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Tuple getAndUpsert(@NotNull Tuple rec) {
+        return sync(getAndUpsertAsync(rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Tuple> getAndUpsertAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        final Row keyRow = marshaller().marshal(rec);
+
+        return tbl.getAndUpsert(keyRow, tx).thenApply(this::wrap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean insert(@NotNull Tuple rec) {
+        return sync(insertAsync(rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> insertAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        final Row keyRow = marshaller().marshal(rec);
+
+        return tbl.insert(keyRow, tx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Tuple> insertAll(@NotNull Collection<Tuple> recs) {
+        return sync(insertAllAsync(recs));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Collection<Tuple>> insertAllAsync(@NotNull Collection<Tuple> recs) {
+        Objects.requireNonNull(recs);
+
+        HashSet<BinaryRow> keys = new HashSet<>(recs.size());
+
+        for (Tuple keyRec : recs) {
+            final Row keyRow = marshaller().marshal(keyRec);
+
+            keys.add(keyRow);
+        }
+
+        return tbl.insertAll(keys, tx).thenApply(this::wrap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean replace(@NotNull Tuple rec) {
+        return sync(replaceAsync(rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        final Row keyRow = marshaller().marshal(rec);
+
+        return tbl.replace(keyRow, tx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean replace(@NotNull Tuple oldRec, @NotNull Tuple newRec) {
+        return sync(replaceAsync(oldRec, newRec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> replaceAsync(@NotNull Tuple oldRec, @NotNull Tuple newRec) {
+        Objects.requireNonNull(oldRec);
+        Objects.requireNonNull(newRec);
+
+        final Row oldRow = marshaller().marshal(oldRec);
+        final Row newRow = marshaller().marshal(newRec);
+
+        return tbl.replace(oldRow, newRow, tx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Tuple getAndReplace(@NotNull Tuple rec) {
+        return sync(getAndReplaceAsync(rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Tuple> getAndReplaceAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        final Row keyRow = marshaller().marshal(rec);
+
+        return tbl.getAndReplace(keyRow, tx).thenApply(this::wrap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean delete(@NotNull Tuple keyRec) {
+        return sync(deleteAsync(keyRec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> deleteAsync(@NotNull Tuple keyRec) {
+        Objects.requireNonNull(keyRec);
+
+        final Row keyRow = marshaller().marshalKey(keyRec);
+
+        return tbl.delete(keyRow, tx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean deleteExact(@NotNull Tuple rec) {
+        return sync(deleteExactAsync(rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Boolean> deleteExactAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        final Row row = marshaller().marshal(rec);
+
+        return tbl.deleteExact(row, tx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Tuple getAndDelete(@NotNull Tuple rec) {
+        return sync(getAndDeleteAsync(rec));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Tuple> getAndDeleteAsync(@NotNull Tuple rec) {
+        Objects.requireNonNull(rec);
+
+        final Row row = marshaller().marshalKey(rec);
+
+        return tbl.getAndDelete(row, tx).thenApply(this::wrap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Tuple> deleteAll(@NotNull Collection<Tuple> recs) {
+        return sync(deleteAllAsync(recs));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Collection<Tuple>> deleteAllAsync(@NotNull Collection<Tuple> recs) {
+        Objects.requireNonNull(recs);
+
+        HashSet<BinaryRow> keys = new HashSet<>(recs.size());
+
+        for (Tuple keyRec : recs) {
+            final Row keyRow = marshaller().marshalKey(keyRec);
+
+            keys.add(keyRow);
+        }
+
+        return tbl.deleteAll(keys, tx).thenApply(this::wrap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Tuple> deleteAllExact(@NotNull Collection<Tuple> recs) {
+        return sync(deleteAllExactAsync(recs));
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull CompletableFuture<Collection<Tuple>> deleteAllExactAsync(
+        @NotNull Collection<Tuple> recs
+    ) {
+        Objects.requireNonNull(recs);
+
+        HashSet<BinaryRow> keys = new HashSet<>(recs.size());
+
+        for (Tuple keyRec : recs) {
+            final Row keyRow = marshaller().marshal(keyRec);
+
+            keys.add(keyRow);
+        }
+
+        return tbl.deleteAllExact(keys, tx).thenApply(this::wrap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public <T extends Serializable> T invoke(
+        @NotNull Tuple keyRec,
+        InvokeProcessor<Tuple, Tuple, T> proc
+    ) {
+        throw new UnsupportedOperationException("Not implemented yet.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull <T extends Serializable> CompletableFuture<T> invokeAsync(
+        @NotNull Tuple keyRec,
+        InvokeProcessor<Tuple, Tuple, T> proc
+    ) {
+        throw new UnsupportedOperationException("Not implemented yet.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public <T extends Serializable> Map<Tuple, T> invokeAll(
+        @NotNull Collection<Tuple> keyRecs,
+        InvokeProcessor<Tuple, Tuple, T> proc
+    ) {
+        throw new UnsupportedOperationException("Not implemented yet.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public @NotNull <T extends Serializable> CompletableFuture<Map<Tuple, T>> invokeAllAsync(
+        @NotNull Collection<Tuple> keyRecs,
+        InvokeProcessor<Tuple, Tuple, T> proc
+    ) {
+        throw new UnsupportedOperationException("Not implemented yet.");
     }
 
     /**
-     * @param schemaMode New schema management mode.
+     * @return Marshaller.
      */
-    public void schemaMode(SchemaManagementMode schemaMode) {
+    private TupleMarshaller marshaller() {
+        return marsh;
+    }
+
+    /**
+     * @param row Binary row.
+     * @return Table row tuple.
+     */
+    private Tuple wrap(BinaryRow row) {
+        if (row == null)
+            return null;
+
+        final Row wrapped = schemaReg.resolve(row);
+
+        return TableRow.tuple(wrapped);
+    }
+
+    /**
+     * @param rows Binary rows.
+     * @return Table rows.
+     */
+    private Collection<Tuple> wrap(Collection<BinaryRow> rows) {
+        if (rows == null)
+            return null;
+
+        return rows.stream().filter(Objects::nonNull).map(this::wrap).collect(Collectors.toSet());
+    }
+
+    /**
+     * @param schemaMode New schema type.
+     */
+    public void schemaType(SchemaManagementMode schemaMode) {
         this.tbl.schema(schemaMode);
     }
 }
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index eb10ede..b6b2fb1 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -164,7 +164,7 @@
                         @Override public @NotNull CompletableFuture<?> onCreate(
                             @NotNull ConfigurationNotificationEvent<SchemaView> schemasCtx) {
                             try {
-                                ((SchemaRegistryImpl)tables.get(ctx.newValue().name()).schemaView()).
+                                ((SchemaRegistryImpl)tables.get(ctx.newValue().name()).schemaRegistry()).
                                     onSchemaRegistered((SchemaDescriptor)ByteUtils.
                                         fromBytes(schemasCtx.newValue().schema()));
 
@@ -305,7 +305,8 @@
                 var table = new TableImpl(
                     internalTable,
                     schemaRegistry,
-                    TableManager.this
+                    TableManager.this,
+                    null
                 );
 
                 tables.put(name, table);
@@ -533,7 +534,7 @@
                                             );
 
                                             descriptor.columnMapping(SchemaUtils.columnMapper(
-                                                tablesById.get(tblId).schemaView().schema(currTableView.schemas().size()),
+                                                tablesById.get(tblId).schemaRegistry().schema(currTableView.schemas().size()),
                                                 currTableView,
                                                 descriptor,
                                                 tblCh
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/Example.java b/modules/table/src/test/java/org/apache/ignite/internal/table/Example.java
index 0fbd12a..b002232 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/Example.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/Example.java
@@ -43,7 +43,7 @@
      * @return Table implementation.
      */
     private static List<Table> tableFactory() {
-        return Collections.singletonList(new TableImpl(new DummyInternalTableImpl(), null, null));
+        return Collections.singletonList(new TableImpl(new DummyInternalTableImpl(), null, null, null));
     }
 
     /**
@@ -59,7 +59,7 @@
     @MethodSource("tableFactory")
     public void useCase1(Table t) {
         // Search row will allow nulls even in non-null columns.
-        Tuple res = t.recordView().get(Tuple.create().set("id", 1).set("orgId", 1));
+        Tuple res = t.get(Tuple.create().set("id", 1).set("orgId", 1));
 
         String name = res.value("name");
         String lastName = res.value("latName");
@@ -137,7 +137,7 @@
             int department;
         }
 
-        KeyValueView<EmployeeKey, Employee> employeeKv = t.keyValueView(EmployeeKey.class, Employee.class);
+        KeyValueView<EmployeeKey, Employee> employeeKv = t.kvView(EmployeeKey.class, Employee.class);
 
         employeeKv.get(new EmployeeKey(1, 1));
 
@@ -147,7 +147,7 @@
             String lastName;
         }
 
-        KeyValueView<EmployeeKey, TruncatedEmployee> truncatedEmployeeKv = t.keyValueView(EmployeeKey.class, TruncatedEmployee.class);
+        KeyValueView<EmployeeKey, TruncatedEmployee> truncatedEmployeeKv = t.kvView(EmployeeKey.class, TruncatedEmployee.class);
 
         TruncatedEmployee te = truncatedEmployeeKv.get(new EmployeeKey(1, 1));
     }
@@ -179,14 +179,14 @@
             String bankName;
         }
 
-        KeyValueView<Long, CreditCard> credCardKvView = t.keyValueView(Long.class, CreditCard.class);
+        KeyValueView<Long, CreditCard> credCardKvView = t.kvView(Long.class, CreditCard.class);
         CreditCard creditCard = credCardKvView.get(1L);
 
-        KeyValueView<Long, BankAccount> backAccKvView = t.keyValueView(Long.class, BankAccount.class);
+        KeyValueView<Long, BankAccount> backAccKvView = t.kvView(Long.class, BankAccount.class);
         BankAccount bankAccount = backAccKvView.get(2L);
 
         // Truncated view.
-        KeyValueView<Long, BillingDetails> billingDetailsKVView = t.keyValueView(Long.class, BillingDetails.class);
+        KeyValueView<Long, BillingDetails> billingDetailsKVView = t.kvView(Long.class, BillingDetails.class);
         BillingDetails billingDetails = billingDetailsKVView.get(2L);
 
         // Without discriminator it is impossible to deserialize to correct type automatically.
@@ -255,7 +255,7 @@
             String bankName;
         }
 
-        KeyValueView<OrderKey, OrderValue> orderKvView = t.keyValueView(Mappers.ofKeyClass(OrderKey.class),
+        KeyValueView<OrderKey, OrderValue> orderKvView = t.kvView(Mappers.ofKeyClass(OrderKey.class),
             Mappers.ofValueClassBuilder(OrderValue.class)
                 .map("billingDetails", (row) -> {
                     BinaryObject bObj = row.binaryObjectValue("conditionalDetails");
@@ -269,7 +269,7 @@
         OrderValue ov = orderKvView.get(new OrderKey(1, 1));
 
         // Same with direct Row access and BinaryObject wrapper.
-        Tuple res = t.recordView().get(Tuple.create().set("id", 1).set("orgId", 1));
+        Tuple res = t.get(Tuple.create().set("id", 1).set("orgId", 1));
 
         byte[] objData = res.value("billingDetails");
         BinaryObject binObj = BinaryObjects.wrap(objData);
@@ -318,7 +318,7 @@
     @ParameterizedTest
     @MethodSource("tableFactory")
     public void useCase5(Table t) {
-        Tuple res = t.recordView().get(Tuple.create().set("id", 1).set("orgId", 1));
+        Tuple res = t.get(Tuple.create().set("id", 1).set("orgId", 1));
 
         byte[] objData = res.value("originalObject");
         BinaryObject binObj = BinaryObjects.wrap(objData);
@@ -402,7 +402,7 @@
     @MethodSource("tableFactory")
     public void useCase6(Table t) {
         // Search row will allow nulls even in non-null columns.
-        Tuple res = t.recordView().get(Tuple.create().set("id", 1));
+        Tuple res = t.get(Tuple.create().set("id", 1));
 
         String name = res.value("name");
         String lastName = res.value("latName");
@@ -424,7 +424,7 @@
             long id;
         }
 
-        KeyValueView<Long, Employee> employeeView = t.keyValueView(Long.class, Employee.class);
+        KeyValueView<Long, Employee> employeeView = t.kvView(Long.class, Employee.class);
 
         Employee e = employeeView.get(1L);
     }
@@ -449,11 +449,11 @@
             int department;
         }
 
-        KeyValueView<Long, BinaryObject> employeeView = t.keyValueView(Long.class, BinaryObject.class);
+        KeyValueView<Long, BinaryObject> employeeView = t.kvView(Long.class, BinaryObject.class);
 
         employeeView.put(1L, BinaryObjects.wrap(new byte[0] /* serialized Employee */));
 
-        t.keyValueView(
+        t.kvView(
             Mappers.identity(),
             Mappers.ofValueClassBuilder(BinaryObject.class).deserializeTo(Employee.class).build());
     }
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueBinaryViewOperationsTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/KVBinaryViewOperationsTest.java
similarity index 90%
rename from modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueBinaryViewOperationsTest.java
rename to modules/table/src/test/java/org/apache/ignite/internal/table/KVBinaryViewOperationsTest.java
index ef4a133..5196553 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueBinaryViewOperationsTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/KVBinaryViewOperationsTest.java
@@ -22,7 +22,7 @@
 import org.apache.ignite.internal.schema.SchemaDescriptor;
 import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
 import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
-import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -40,7 +40,7 @@
  * TODO: IGNITE-14487 Check non-key fields in Tuple is ignored for keys.
  * TODO: IGNITE-14487 Check key fields in Tuple is ignored for value or exception is thrown?
  */
-public class KeyValueBinaryViewOperationsTest {
+public class KVBinaryViewOperationsTest {
     /**
      *
      */
@@ -52,8 +52,8 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        KeyValueView<Tuple, Tuple> tbl =
-            new KeyValueBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
+        KeyValueBinaryView tbl =
+            new KVBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple key = Tuple.create().set("id", 1L);
         final Tuple val = Tuple.create().set("val", 11L);
@@ -95,8 +95,8 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        KeyValueView<Tuple, Tuple> tbl =
-            new KeyValueBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
+        KeyValueBinaryView tbl =
+            new KVBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple key = Tuple.create().set("id", 1L);
         final Tuple val = Tuple.create().set("val", 11L);
@@ -128,8 +128,8 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        KeyValueView<Tuple, Tuple> tbl =
-            new KeyValueBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
+        KeyValueBinaryView tbl =
+            new KVBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple key = Tuple.create().set("id", 1L);
         final Tuple val = Tuple.create().set("val", 11L);
@@ -162,8 +162,8 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        KeyValueView<Tuple, Tuple> tbl =
-            new KeyValueBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
+        KeyValueBinaryView tbl =
+            new KVBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple key = Tuple.create().set("id", 1L);
         final Tuple key2 = Tuple.create().set("id", 2L);
@@ -205,8 +205,8 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        final KeyValueView<Tuple, Tuple> tbl =
-            new KeyValueBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
+        final KeyValueBinaryView tbl =
+            new KVBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple key = Tuple.create().set("id", 1L);
         final Tuple key2 = Tuple.create().set("id", 2L);
@@ -260,8 +260,8 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        KeyValueView<Tuple, Tuple> tbl =
-            new KeyValueBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
+        KeyValueBinaryView tbl =
+            new KVBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple key = Tuple.create().set("id", 1L);
         final Tuple key2 = Tuple.create().set("id", 2L);
@@ -306,8 +306,8 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        KeyValueView<Tuple, Tuple> tbl =
-            new KeyValueBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
+        KeyValueBinaryView tbl =
+            new KVBinaryViewImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple key = Tuple.create().set("id", 1L);
         final Tuple key2 = Tuple.create().set("id", 2L);
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/StrictSchemaOperationsTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/StrictSchemaOperationsTest.java
index ab5088f..bf02686 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/StrictSchemaOperationsTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/StrictSchemaOperationsTest.java
@@ -24,7 +24,6 @@
 import org.apache.ignite.internal.schema.SchemaMismatchException;
 import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
 import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
-import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Test;
@@ -46,9 +45,9 @@
             new Column[] {new Column("val", NativeTypes.INT64, true)}
         );
 
-        RecordView<Tuple> recView = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
-        assertThrows(SchemaMismatchException.class, () -> recView.insert(Tuple.create().set("id", 0L).set("invalidCol", 0)));
+        assertThrows(SchemaMismatchException.class, () -> tbl.insert(Tuple.create().set("id", 0L).set("invalidCol", 0)));
     }
 
     /**
@@ -65,17 +64,17 @@
             new Column[] {new Column("val", NativeTypes.INT64, true)}
         );
 
-        Table tbl = createTableImpl(schema);
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
-        assertThrows(SchemaMismatchException.class, () -> tbl.recordView().get(Tuple.create().set("id", 0L).set("affId", 1L).set("val", 0L)));
-        assertThrows(SchemaMismatchException.class, () -> tbl.recordView().get(Tuple.create().set("id", 0L)));
+        assertThrows(SchemaMismatchException.class, () -> tbl.get(Tuple.create().set("id", 0L).set("affId", 1L).set("val", 0L)));
+        assertThrows(SchemaMismatchException.class, () -> tbl.get(Tuple.create().set("id", 0L)));
 
-        assertThrows(SchemaMismatchException.class, () -> tbl.keyValueView().get(Tuple.create().set("id", 0L)));
-        assertThrows(SchemaMismatchException.class, () -> tbl.keyValueView().get(Tuple.create().set("id", 0L).set("affId", 1L).set("val", 0L)));
+        assertThrows(SchemaMismatchException.class, () -> tbl.kvView().get(Tuple.create().set("id", 0L)));
+        assertThrows(SchemaMismatchException.class, () -> tbl.kvView().get(Tuple.create().set("id", 0L).set("affId", 1L).set("val", 0L)));
 
-        assertThrows(SchemaMismatchException.class, () -> tbl.keyValueView().put(Tuple.create().set("id", 0L), Tuple.create()));
-        assertThrows(SchemaMismatchException.class, () -> tbl.keyValueView().put(Tuple.create().set("id", 0L).set("affId", 1L).set("val", 0L), Tuple.create()));
-        assertThrows(SchemaMismatchException.class, () -> tbl.keyValueView().put(Tuple.create().set("id", 0L).set("affId", 1L),
+        assertThrows(SchemaMismatchException.class, () -> tbl.kvView().put(Tuple.create().set("id", 0L), Tuple.create()));
+        assertThrows(SchemaMismatchException.class, () -> tbl.kvView().put(Tuple.create().set("id", 0L).set("affId", 1L).set("val", 0L), Tuple.create()));
+        assertThrows(SchemaMismatchException.class, () -> tbl.kvView().put(Tuple.create().set("id", 0L).set("affId", 1L),
             Tuple.create().set("id", 0L).set("val", 0L)));
     }
 
@@ -93,7 +92,7 @@
             }
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         // Check not-nullable column.
         assertThrows(IllegalArgumentException.class, () -> tbl.insert(Tuple.create().set("id", null)));
@@ -118,7 +117,7 @@
             }
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         Tuple tuple = Tuple.create().set("id", 1L);
 
@@ -145,7 +144,7 @@
                 new Column("valLimited", NativeTypes.blobOf(2), true)
             });
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         Tuple tuple = Tuple.create().set("id", 1L);
 
@@ -158,8 +157,4 @@
         assertThrows(InvalidTypeException.class, () -> tbl.insert(tuple.set("valLimited", new byte[3])));
 
     }
-
-    private TableImpl createTableImpl(SchemaDescriptor schema) {
-        return new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null);
-    }
 }
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/RecordBinaryViewOperationsTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/TableBinaryViewOperationsTest.java
similarity index 92%
rename from modules/table/src/test/java/org/apache/ignite/internal/table/RecordBinaryViewOperationsTest.java
rename to modules/table/src/test/java/org/apache/ignite/internal/table/TableBinaryViewOperationsTest.java
index 5166a80..26db2d5 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/RecordBinaryViewOperationsTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/TableBinaryViewOperationsTest.java
@@ -25,9 +25,8 @@
 import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
 import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
 import org.apache.ignite.internal.table.impl.TestTupleBuilder;
-import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
-import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -43,7 +42,7 @@
  * TODO: IGNITE-14486 Add tests for bulk operations.
  * TODO: IGNITE-14486 Add tests for async operations.
  */
-public class RecordBinaryViewOperationsTest {
+public class TableBinaryViewOperationsTest {
     /**
      *
      */
@@ -55,7 +54,7 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple tuple = Tuple.create().set("id", 1L).set("val", 11L);
         final Tuple newTuple = Tuple.create().set("id", 1L).set("val", 22L);
@@ -87,7 +86,7 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple tuple = Tuple.create().set("id", 1L).set("val", 11L);
         final Tuple newTuple = Tuple.create().set("id", 1L).set("val", 22L);
@@ -119,7 +118,7 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple tuple = Tuple.create().set("id", 1L).set("val", 11L);
         final Tuple newTuple = Tuple.create().set("id", 1L).set("val", 22L);
@@ -148,7 +147,7 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         tbl.upsert(Tuple.create().set("id", 1L).set("val", 11L));
 
@@ -176,7 +175,7 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple keyTuple = Tuple.create().set("id", 1L);
         final Tuple tuple = Tuple.create().set("id", 1L).set("val", 11L);
@@ -227,7 +226,7 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple keyTuple = Tuple.create().set("id", 1L);
         final Tuple tuple = Tuple.create().set("id", 1L).set("val", 11L);
@@ -260,7 +259,7 @@
             new Column[] {new Column("val", NativeTypes.INT64, false)}
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple tuple = Tuple.create().set("id", 1L).set("val", 11L);
         final Tuple tuple2 = Tuple.create().set("id", 1L).set("val", 22L);
@@ -298,7 +297,7 @@
             }
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple keyTuple0 = new TestTupleBuilder().set("id", 0).set("id1", 0);
         final Tuple keyTuple1 = new TestTupleBuilder().set("id1", 0);
@@ -333,7 +332,7 @@
             }
         );
 
-        RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+        Table tbl = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
 
         final Tuple keyTuple0 = Tuple.create().set("id", 0L);
         final Tuple keyTuple1 = Tuple.create().set("id", 1L);
@@ -406,8 +405,4 @@
                 Assertions.assertEquals(val1, val2, "Equality check failed: colIdx=" + col.schemaIndex());
         }
     }
-
-    @NotNull private TableImpl createTableImpl(SchemaDescriptor schema) {
-        return new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null);
-    }
 }
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/TxTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/TxTest.java
index d42cebf..61fcda8 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/TxTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/TxTest.java
@@ -25,8 +25,7 @@
 import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
 import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
 import org.apache.ignite.internal.util.Pair;
-import org.apache.ignite.table.KeyValueView;
-import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.KeyValueBinaryView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.apache.ignite.tx.IgniteTransactions;
@@ -78,12 +77,12 @@
             new Column[]{new Column("balance", NativeTypes.DOUBLE, false)}
         );
 
-        accounts = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null);
+        accounts = new TableImpl(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), null, null);
         Tuple r1 = Tuple.create().set("accountNumber", 1L).set("balance", BALANCE_1);
         Tuple r2 = Tuple.create().set("accountNumber", 2L).set("balance", BALANCE_2);
 
-        accounts.recordView().insert(r1);
-        accounts.recordView().insert(r2);
+        accounts.insert(r1);
+        accounts.insert(r2);
 
         Mockito.doAnswer(invocation -> {
             Consumer<Transaction> argument = invocation.getArgument(0);
@@ -102,7 +101,7 @@
     @Test
     public void testTxSync() {
         igniteTransactions.runInTransaction(tx -> {
-            RecordView<Tuple> txAcc = accounts.recordView().withTransaction(tx);
+            Table txAcc = accounts.withTransaction(tx);
 
             CompletableFuture<Tuple> read1 = txAcc.getAsync(makeKey(1));
             CompletableFuture<Tuple> read2 = txAcc.getAsync(makeKey(2));
@@ -115,8 +114,8 @@
 
         Mockito.verify(tx).commit();
 
-        assertEquals(BALANCE_1 - DELTA, accounts.recordView().get(makeKey(1)).doubleValue("balance"));
-        assertEquals(BALANCE_2 + DELTA, accounts.recordView().get(makeKey(2)).doubleValue("balance"));
+        assertEquals(BALANCE_1 - DELTA, accounts.get(makeKey(1)).doubleValue("balance"));
+        assertEquals(BALANCE_2 + DELTA, accounts.get(makeKey(2)).doubleValue("balance"));
     }
 
     /**
@@ -125,7 +124,7 @@
     @Test
     public void testTxSyncKeyValue() {
         igniteTransactions.runInTransaction(tx -> {
-            KeyValueView<Tuple, Tuple> txAcc = accounts.keyValueView().withTransaction(tx);
+            KeyValueBinaryView txAcc = accounts.kvView().withTransaction(tx);
 
             CompletableFuture<Tuple> read1 = txAcc.getAsync(makeKey(1));
             CompletableFuture<Tuple> read2 = txAcc.getAsync(makeKey(2));
@@ -138,8 +137,8 @@
 
         Mockito.verify(tx).commit();
 
-        assertEquals(BALANCE_1 - DELTA, accounts.recordView().get(makeKey(1)).doubleValue("balance"));
-        assertEquals(BALANCE_2 + DELTA, accounts.recordView().get(makeKey(2)).doubleValue("balance"));
+        assertEquals(BALANCE_1 - DELTA, accounts.get(makeKey(1)).doubleValue("balance"));
+        assertEquals(BALANCE_2 + DELTA, accounts.get(makeKey(2)).doubleValue("balance"));
     }
 
     /**
@@ -147,9 +146,9 @@
      */
     @Test
     public void testTxAsync() {
-        igniteTransactions.beginAsync().thenApply(tx -> accounts.recordView().withTransaction(tx)).
+        igniteTransactions.beginAsync().thenApply(tx -> accounts.withTransaction(tx)).
             thenCompose(txAcc -> txAcc.getAsync(makeKey(1))
-            .thenCombine(txAcc.getAsync(makeKey(2)), Pair::new)
+            .thenCombine(txAcc.getAsync(makeKey(2)), (v1, v2) -> new Pair<>(v1, v2))
             .thenCompose(pair -> allOf(
                 txAcc.upsertAsync(makeRecord(1, pair.getFirst().doubleValue("balance") - DELTA)),
                 txAcc.upsertAsync(makeRecord(2, pair.getSecond().doubleValue("balance") + DELTA))
@@ -160,8 +159,8 @@
 
         Mockito.verify(tx).commitAsync();
 
-        assertEquals(BALANCE_1 - DELTA, accounts.recordView().get(makeKey(1)).doubleValue("balance"));
-        assertEquals(BALANCE_2 + DELTA, accounts.recordView().get(makeKey(2)).doubleValue("balance"));
+        assertEquals(BALANCE_1 - DELTA, accounts.get(makeKey(1)).doubleValue("balance"));
+        assertEquals(BALANCE_2 + DELTA, accounts.get(makeKey(2)).doubleValue("balance"));
     }
 
     /**
@@ -169,9 +168,9 @@
      */
     @Test
     public void testTxAsyncKeyValue() {
-        igniteTransactions.beginAsync().thenApply(tx -> accounts.keyValueView().withTransaction(tx)).
+        igniteTransactions.beginAsync().thenApply(tx -> accounts.kvView().withTransaction(tx)).
             thenCompose(txAcc -> txAcc.getAsync(makeKey(1))
-            .thenCombine(txAcc.getAsync(makeKey(2)), Pair::new)
+            .thenCombine(txAcc.getAsync(makeKey(2)), (v1, v2) -> new Pair<>(v1, v2))
             .thenCompose(pair -> allOf(
                 txAcc.putAsync(makeKey(1), makeValue(pair.getFirst().doubleValue("balance") - DELTA)),
                 txAcc.putAsync(makeKey(2), makeValue(pair.getSecond().doubleValue("balance") + DELTA))
@@ -182,8 +181,8 @@
 
         Mockito.verify(tx).commitAsync();
 
-        assertEquals(BALANCE_1 - DELTA, accounts.recordView().get(makeKey(1)).doubleValue("balance"));
-        assertEquals(BALANCE_2 + DELTA, accounts.recordView().get(makeKey(2)).doubleValue("balance"));
+        assertEquals(BALANCE_1 - DELTA, accounts.get(makeKey(1)).doubleValue("balance"));
+        assertEquals(BALANCE_2 + DELTA, accounts.get(makeKey(2)).doubleValue("balance"));
     }
 
     /**