This is an automated email from the ASF dual-hosted git repository.

nizhikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 7183a728656 IGNITE-25090 Move binary classes to binary-api (#12362)
7183a728656 is described below

commit 7183a7286564e4ce915ef2cf9151ec13f7c63611
Author: Nikolay <[email protected]>
AuthorDate: Wed Sep 24 13:44:03 2025 +0300

    IGNITE-25090 Move binary classes to binary-api (#12362)
---
 modules/binary/api/pom.xml                         |   7 ++
 .../internal/UnregisteredBinaryTypeException.java  |  11 +--
 .../binary/BinaryAbstractIdentityResolver.java     |   0
 .../apache/ignite/internal/binary/BinaryArray.java |   0
 .../binary/BinaryArrayIdentityResolver.java        |   0
 .../binary/BinaryCachingMetadataHandler.java       |   0
 .../internal/binary/BinaryClassDescriptor.java     |  11 +--
 .../ignite/internal/binary/BinaryContext.java      |   2 +-
 .../internal/binary/BinaryContextHolder.java       |   0
 .../ignite/internal/binary/BinaryEnumArray.java    |   0
 .../ignite/internal/binary/BinaryEnumCache.java    |   0
 .../internal/binary/BinaryEnumObjectImpl.java      |   8 +-
 .../internal/binary/BinaryFieldAccessor.java       |   0
 .../ignite/internal/binary/BinaryFieldImpl.java    |   0
 .../internal/binary/BinaryFieldMetadata.java       |   0
 .../internal/binary/BinaryIdentityResolver.java    |   0
 .../internal/binary/BinaryInternalMapper.java      |   0
 .../ignite/internal/binary/BinaryMarshaller.java   |   0
 .../ignite/internal/binary/BinaryMetadata.java     |   0
 .../internal/binary/BinaryMetadataCollector.java   |   0
 .../internal/binary/BinaryMetadataHandler.java     |   3 +-
 .../internal/binary/BinaryMethodWriteReplacer.java |   0
 .../internal/binary/BinaryNoopMetadataHandler.java |   0
 .../ignite/internal/binary/BinaryObjectEx.java     |   0
 .../ignite/internal/binary/BinaryObjectExImpl.java |   0
 .../ignite/internal/binary/BinaryObjectImpl.java   |  10 +-
 .../internal/binary/BinaryObjectOffheapImpl.java   |   0
 .../ignite/internal/binary/BinaryPrimitives.java   |   0
 .../ignite/internal/binary/BinaryReaderEx.java     |   0
 .../ignite/internal/binary/BinaryReaderExImpl.java |   0
 .../internal/binary/BinaryReaderHandles.java       |   0
 .../internal/binary/BinaryReaderHandlesHolder.java |   0
 .../binary/BinaryReaderHandlesHolderImpl.java      |   0
 .../ignite/internal/binary/BinarySchema.java       |   0
 .../internal/binary/BinarySchemaRegistry.java      |   0
 .../binary/BinarySerializedFieldComparator.java    |   0
 .../internal/binary/BinaryThreadLocalContext.java  |   0
 .../ignite/internal/binary/BinaryTreeMap.java      |   0
 .../binary/BinaryTreeMapWriteReplacer.java         |   0
 .../ignite/internal/binary/BinaryTreeSet.java      |   0
 .../binary/BinaryTreeSetWriteReplacer.java         |   0
 .../ignite/internal/binary/BinaryTypeImpl.java     |   0
 .../ignite/internal/binary/BinaryTypeProxy.java    |   0
 .../apache/ignite/internal/binary/BinaryUtils.java |  35 ++++---
 .../ignite/internal/binary/BinaryWriteMode.java    |   0
 .../internal/binary/BinaryWriteReplacer.java       |   0
 .../ignite/internal/binary/BinaryWriterEx.java     |   0
 .../ignite/internal/binary/BinaryWriterExImpl.java |   0
 .../internal/binary/BinaryWriterHandles.java       |   0
 .../internal/binary/BinaryWriterSchemaHolder.java  |   0
 .../binary/CrossObjectReferenceResolver.java       |   0
 .../internal/binary/GridBinaryMarshaller.java      |  14 ++-
 .../ignite/internal/binary/ObjectDetachHelper.java |   0
 .../internal/binary/RawBinaryObjectExtractor.java  |   0
 .../binary/builder/BinaryAbstractLazyValue.java    |   0
 .../internal/binary/builder/BinaryBuilderEnum.java |   0
 .../binary/builder/BinaryBuilderReader.java        |   0
 .../builder/BinaryBuilderSerializationAware.java   |   0
 .../binary/builder/BinaryBuilderSerializer.java    |   0
 .../binary/builder/BinaryEnumArrayLazyValue.java   |   0
 .../binary/builder/BinaryLazyArrayList.java        |   0
 .../binary/builder/BinaryLazyLinkedList.java       |   0
 .../internal/binary/builder/BinaryLazyMap.java     |   0
 .../internal/binary/builder/BinaryLazySet.java     |   0
 .../internal/binary/builder/BinaryLazyValue.java   |   0
 .../binary/builder/BinaryModifiableLazyValue.java  |   0
 .../binary/builder/BinaryObjectArrayLazyValue.java |   0
 .../binary/builder/BinaryObjectBuilderImpl.java    |   0
 .../binary/builder/BinaryObjectBuilders.java       |   0
 .../binary/builder/BinaryPlainBinaryObject.java    |   0
 .../binary/builder/BinaryPlainLazyValue.java       |   0
 .../binary/builder/BinaryValueWithType.java        |   0
 ...imizedMarshallerInaccessibleClassException.java |   0
 .../internal/processors/cache/CacheObject.java     |   9 +-
 .../processors/cache/CacheObjectUtils.java         | 110 ++++++++++++++++++++-
 .../processors/cache/CacheObjectValueContext.java  |   5 +-
 .../internal/processors/cache/KeyCacheObject.java  |   0
 .../org/apache/ignite/platform/PlatformType.java   |   0
 .../ignite/IgniteCommonsSystemProperties.java      |  40 ++++++++
 .../ignite/internal/GridDirectTransient.java       |   2 +-
 .../ignite/internal/IgniteInternalFuture.java      |   0
 .../apache/ignite/internal/util/CommonUtils.java   |  13 +++
 .../ignite/internal/util/MutableSingletonList.java |   0
 .../org/apache/ignite/IgniteSystemProperties.java  |  39 --------
 .../java/org/apache/ignite/cache/QueryEntity.java  |   6 +-
 .../ignite/internal/GridKernalContextImpl.java     |   5 +
 .../cache/query/index/sorted/IndexKeyType.java     |   3 +-
 .../processors/cache/CacheObjectAdapter.java       | 110 +--------------------
 .../processors/cache/CacheObjectByteArrayImpl.java |   8 +-
 .../internal/processors/cache/CacheObjectImpl.java |   5 +
 .../wal/reader/StandaloneGridKernalContext.java    |   6 ++
 .../processors/platform/PlatformContextImpl.java   |   2 +-
 .../internal/processors/query/QueryUtils.java      |  15 +--
 .../processors/security/IgniteSecurityAdapter.java |  32 +++++-
 .../cache/AbstractDataTypesCoverageTest.java       |   2 +-
 .../cache/IgniteIncompleteCacheObjectSelfTest.java |   4 +-
 .../sandbox/IgniteOperationsInsideSandboxTest.java |   5 +
 .../java/org/apache/ignite/dump/JsonArrayTest.java |   2 +-
 .../apache/ignite/internal/pagemem/PageUtils.java  |   0
 .../internal/util/offheap/GridOffHeapEvent.java    |   0
 .../util/offheap/GridOffHeapEventListener.java     |   0
 .../offheap/GridOffHeapOutOfMemoryException.java   |   0
 .../util/offheap/unsafe/GridUnsafeMemory.java      |   6 +-
 103 files changed, 298 insertions(+), 232 deletions(-)

diff --git a/modules/binary/api/pom.xml b/modules/binary/api/pom.xml
index 65d79c7a212..ec8c662bb79 100644
--- a/modules/binary/api/pom.xml
+++ b/modules/binary/api/pom.xml
@@ -41,6 +41,13 @@
             <scope>provided</scope>
         </dependency>
 
+        <!-- TODO: remove me after extraction of implementation -->
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>ignite-grid-unsafe</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
         <dependency>
             <groupId>org.jetbrains</groupId>
             <artifactId>annotations</artifactId>
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/UnregisteredBinaryTypeException.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/UnregisteredBinaryTypeException.java
similarity index 90%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/UnregisteredBinaryTypeException.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/UnregisteredBinaryTypeException.java
index de507be5405..49360862e81 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/UnregisteredBinaryTypeException.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/UnregisteredBinaryTypeException.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal;
 
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.binary.BinaryMetadata;
-import org.apache.ignite.internal.util.future.GridFutureAdapter;
 
 /**
  * Exception thrown during serialization if binary metadata isn't registered 
and it's registration isn't allowed.
@@ -38,7 +37,7 @@ public class UnregisteredBinaryTypeException extends 
IgniteException {
         "dev-list. Debug info [typeId=%d, binaryMetadata=%s, fut=%s]";
 
     /** */
-    private static String createMessage(int typeId, BinaryMetadata 
binaryMetadata, GridFutureAdapter<?> fut) {
+    private static String createMessage(int typeId, BinaryMetadata 
binaryMetadata, IgniteInternalFuture<?> fut) {
         return String.format(MESSAGE, typeId, binaryMetadata, fut);
     }
 
@@ -49,7 +48,7 @@ public class UnregisteredBinaryTypeException extends 
IgniteException {
     private final BinaryMetadata binaryMetadata;
 
     /** */
-    private final GridFutureAdapter<?> fut;
+    private final IgniteInternalFuture<?> fut;
 
     /**
      * @param typeId Type ID.
@@ -63,7 +62,7 @@ public class UnregisteredBinaryTypeException extends 
IgniteException {
      * @param typeId Type ID.
      * @param fut Future to wait in handler.
      */
-    public UnregisteredBinaryTypeException(int typeId, GridFutureAdapter<?> 
fut) {
+    public UnregisteredBinaryTypeException(int typeId, IgniteInternalFuture<?> 
fut) {
         this(typeId, null, fut);
     }
 
@@ -72,7 +71,7 @@ public class UnregisteredBinaryTypeException extends 
IgniteException {
      * @param binaryMetadata Binary metadata.
      * @param fut Future to wait in handler.
      */
-    private UnregisteredBinaryTypeException(int typeId, BinaryMetadata 
binaryMetadata, GridFutureAdapter<?> fut) {
+    private UnregisteredBinaryTypeException(int typeId, BinaryMetadata 
binaryMetadata, IgniteInternalFuture<?> fut) {
         super(createMessage(typeId, binaryMetadata, fut));
 
         this.typeId = typeId;
@@ -97,7 +96,7 @@ public class UnregisteredBinaryTypeException extends 
IgniteException {
     /**
      * @return Future to wait in handler.
      */
-    public GridFutureAdapter<?> future() {
+    public IgniteInternalFuture<?> future() {
         return fut;
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryAbstractIdentityResolver.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryAbstractIdentityResolver.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryAbstractIdentityResolver.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryAbstractIdentityResolver.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryArray.java 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryArray.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryArray.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryArray.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryCachingMetadataHandler.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryCachingMetadataHandler.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryCachingMetadataHandler.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryCachingMetadataHandler.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
similarity index 98%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
index ce3a05dd8d4..d8f2c428231 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
@@ -44,8 +44,7 @@ import org.apache.ignite.binary.Binarylizable;
 import org.apache.ignite.internal.UnregisteredBinaryTypeException;
 import org.apache.ignite.internal.UnregisteredClassException;
 import org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller;
-import org.apache.ignite.internal.processors.cache.CacheObjectImpl;
-import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
@@ -54,7 +53,6 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.marshaller.MarshallerExclusions;
 import org.jetbrains.annotations.Nullable;
 
-import static 
org.apache.ignite.internal.processors.query.QueryUtils.isGeometryClass;
 import static org.apache.ignite.internal.util.CommonUtils.isLambda;
 
 /**
@@ -202,7 +200,7 @@ class BinaryClassDescriptor {
         initialSerializer = serializer;
 
         // If serializer is not defined at this point, then we have to use 
OptimizedMarshaller.
-        useOptMarshaller = serializer == null || isGeometryClass(cls);
+        useOptMarshaller = serializer == null || 
CommonUtils.isGeometryClass(cls);
 
         // Reset reflective serializer so that we rely on existing 
reflection-based serialization.
         if (serializer instanceof BinaryReflectiveSerializer)
@@ -233,7 +231,7 @@ class BinaryClassDescriptor {
                 mode = serializer != null ? BinaryWriteMode.BINARY : 
BinaryUtils.mode(cls);
         }
 
-        if (useOptMarshaller && userType && !CommonUtils.isIgnite(cls) && 
!CommonUtils.isJdk(cls) && !QueryUtils.isGeometryClass(cls)) {
+        if (useOptMarshaller && userType && !CommonUtils.isIgnite(cls) && 
!CommonUtils.isJdk(cls) && !CommonUtils.isGeometryClass(cls)) {
             CommonUtils.warnDevOnly(ctx.log(), "Class \"" + cls.getName() + 
"\" cannot be serialized using " +
                 BinaryMarshaller.class.getSimpleName() + " because it either 
implements Externalizable interface " +
                 "or have writeObject/readObject methods. " + 
OptimizedMarshaller.class.getSimpleName() + " will be " +
@@ -1066,8 +1064,9 @@ class BinaryClassDescriptor {
      * @param obj Object.
      */
     private void postWriteHashCode(BinaryWriterExImpl writer, Object obj) {
+        boolean postWriteRequired = !(obj instanceof CacheObject) || 
((CacheObject)obj).postWriteRequired();
         // No need to call "postWriteHashCode" here because we do not care 
about hash code.
-        if (!(obj instanceof CacheObjectImpl))
+        if (postWriteRequired)
             writer.postWriteHashCode(registered ? null : cls.getName());
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
similarity index 99%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
index 6101c0aa2e6..151254243c6 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
@@ -1200,7 +1200,7 @@ public class BinaryContext {
      *
      * @param typeId Type ID.
      * @param clsName Class Name.
-     * @param failIfUnregistered If {@code true} then throw {@link 
UnregisteredBinaryTypeException} with {@link
+     * @param failIfUnregistered If {@code true} then throw {@link 
UnregisteredBinaryTypeException} with {@code
      * org.apache.ignite.internal.processors.marshaller.MappingExchangeResult} 
future instead of synchronously awaiting
      * for its completion.
      * @param onlyLocReg Whether to register only on the current node.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContextHolder.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContextHolder.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContextHolder.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContextHolder.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumArray.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryEnumArray.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumArray.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryEnumArray.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumCache.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryEnumCache.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumCache.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryEnumCache.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
similarity index 97%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
index bed1815de78..08e928b1955 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java
@@ -28,7 +28,7 @@ import org.apache.ignite.binary.BinaryObjectBuilder;
 import org.apache.ignite.binary.BinaryObjectException;
 import org.apache.ignite.binary.BinaryType;
 import org.apache.ignite.internal.processors.cache.CacheObject;
-import org.apache.ignite.internal.processors.cache.CacheObjectAdapter;
+import org.apache.ignite.internal.processors.cache.CacheObjectUtils;
 import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
 import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.GridUnsafe;
@@ -38,7 +38,7 @@ import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.Nullable;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static 
org.apache.ignite.internal.processors.cache.CacheObjectAdapter.objectPutSize;
+import static 
org.apache.ignite.internal.processors.cache.CacheObjectUtils.objectPutSize;
 
 /**
  * Binary enum object.
@@ -342,12 +342,12 @@ class BinaryEnumObjectImpl implements BinaryObjectEx, 
Externalizable, CacheObjec
     @Override public int putValue(long addr) throws IgniteCheckedException {
         assert valBytes != null : "Value bytes must be initialized before 
object is stored";
 
-        return CacheObjectAdapter.putValue(addr, cacheObjectType(), valBytes);
+        return CacheObjectUtils.putValue(addr, cacheObjectType(), valBytes);
     }
 
     /** {@inheritDoc} */
     @Override public boolean putValue(final ByteBuffer buf, int off, int len) 
throws IgniteCheckedException {
-        return CacheObjectAdapter.putValue(cacheObjectType(), buf, off, len, 
valBytes, 0);
+        return CacheObjectUtils.putValue(cacheObjectType(), buf, off, len, 
valBytes, 0);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldAccessor.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryFieldAccessor.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldAccessor.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryFieldAccessor.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldMetadata.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryFieldMetadata.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldMetadata.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryFieldMetadata.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryIdentityResolver.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryIdentityResolver.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryIdentityResolver.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryIdentityResolver.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryInternalMapper.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryInternalMapper.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryInternalMapper.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryInternalMapper.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMetadata.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMetadata.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMetadata.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMetadata.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataCollector.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataCollector.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataCollector.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataCollector.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataHandler.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataHandler.java
similarity index 94%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataHandler.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataHandler.java
index 36e8f457d24..557a4f314c3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataHandler.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataHandler.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.binary;
 import java.util.Collection;
 import org.apache.ignite.binary.BinaryObjectException;
 import org.apache.ignite.binary.BinaryType;
-import 
org.apache.ignite.internal.processors.cache.binary.MetadataUpdateProposedMessage;
 
 /**
  * Binary metadata handler.
@@ -28,7 +27,7 @@ import 
org.apache.ignite.internal.processors.cache.binary.MetadataUpdateProposed
 public interface BinaryMetadataHandler {
     /**
      * Adds a new or updates an existing metadata to the latest version.
-     * See {@link MetadataUpdateProposedMessage} javadoc for detailed protocol 
description.
+     * See {@code MetadataUpdateProposedMessage} javadoc for detailed protocol 
description.
      *
      * @param typeId Type ID.
      * @param meta Metadata.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMethodWriteReplacer.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMethodWriteReplacer.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMethodWriteReplacer.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMethodWriteReplacer.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryNoopMetadataHandler.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryNoopMetadataHandler.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryNoopMetadataHandler.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryNoopMetadataHandler.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
similarity index 98%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
index 0c9fa15f50e..aef10000644 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
@@ -35,7 +35,7 @@ import org.apache.ignite.binary.BinaryType;
 import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
 import org.apache.ignite.internal.binary.streams.BinaryStreams;
 import org.apache.ignite.internal.processors.cache.CacheObject;
-import org.apache.ignite.internal.processors.cache.CacheObjectAdapter;
+import org.apache.ignite.internal.processors.cache.CacheObjectUtils;
 import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.util.GridUnsafe;
@@ -197,22 +197,22 @@ final class BinaryObjectImpl extends BinaryObjectExImpl 
implements Externalizabl
 
     /** {@inheritDoc} */
     @Override public boolean putValue(ByteBuffer buf) throws 
IgniteCheckedException {
-        return putValue(buf, 0, 
CacheObjectAdapter.objectPutSize(valBytes.length));
+        return putValue(buf, 0, 
CacheObjectUtils.objectPutSize(valBytes.length));
     }
 
     /** {@inheritDoc} */
     @Override public int putValue(long addr) throws IgniteCheckedException {
-        return CacheObjectAdapter.putValue(addr, cacheObjectType(), valBytes, 
0, valBytes.length);
+        return CacheObjectUtils.putValue(addr, cacheObjectType(), valBytes, 0, 
valBytes.length);
     }
 
     /** {@inheritDoc} */
     @Override public boolean putValue(final ByteBuffer buf, int off, int len) 
throws IgniteCheckedException {
-        return CacheObjectAdapter.putValue(cacheObjectType(), buf, off, len, 
valBytes, 0);
+        return CacheObjectUtils.putValue(cacheObjectType(), buf, off, len, 
valBytes, 0);
     }
 
     /** {@inheritDoc} */
     @Override public int valueBytesLength(CacheObjectValueContext ctx) throws 
IgniteCheckedException {
-        return CacheObjectAdapter.objectPutSize(valBytes.length);
+        return CacheObjectUtils.objectPutSize(valBytes.length);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandles.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandles.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandles.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandles.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySchema.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinarySchema.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySchema.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinarySchema.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySchemaRegistry.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinarySchemaRegistry.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySchemaRegistry.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinarySchemaRegistry.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryThreadLocalContext.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryThreadLocalContext.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryThreadLocalContext.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryThreadLocalContext.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTreeMap.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTreeMap.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTreeMap.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTreeMap.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTreeMapWriteReplacer.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTreeMapWriteReplacer.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTreeMapWriteReplacer.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTreeMapWriteReplacer.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTreeSet.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTreeSet.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTreeSet.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTreeSet.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTreeSetWriteReplacer.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTreeSetWriteReplacer.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTreeSetWriteReplacer.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTreeSetWriteReplacer.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTypeImpl.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTypeImpl.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryTypeProxy.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
similarity index 98%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
index c8a3692e381..690e6c91f30 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
@@ -56,11 +56,12 @@ import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.function.Function;
+import java.util.function.IntFunction;
 import java.util.function.ToIntFunction;
 import java.util.stream.Collectors;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteCommonsSystemProperties;
 import org.apache.ignite.IgniteException;
-import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.binary.BinaryCollectionFactory;
 import org.apache.ignite.binary.BinaryInvalidTypeException;
 import org.apache.ignite.binary.BinaryMapFactory;
@@ -72,7 +73,6 @@ import 
org.apache.ignite.internal.binary.streams.BinaryInputStream;
 import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
 import org.apache.ignite.internal.binary.streams.BinaryStreams;
 import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
-import 
org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor;
 import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.MutableSingletonList;
@@ -85,8 +85,9 @@ import org.apache.ignite.platform.PlatformType;
 import org.jetbrains.annotations.Nullable;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2;
-import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_USE_BINARY_ARRAYS;
+import static 
org.apache.ignite.IgniteCommonsSystemProperties.DFLT_IGNITE_USE_BINARY_ARRAYS;
+import static 
org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2;
+import static 
org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_USE_BINARY_ARRAYS;
 import static org.apache.ignite.internal.util.GridUnsafe.align;
 
 /**
@@ -109,15 +110,12 @@ public class BinaryUtils {
     private static final Collection<Class<?>> IMMUTABLE_CLS = new HashSet<>();
 
     /** */
-    public static final boolean USE_STR_SERIALIZATION_VER_2 = 
IgniteSystemProperties.getBoolean(
+    public static final boolean USE_STR_SERIALIZATION_VER_2 = 
IgniteCommonsSystemProperties.getBoolean(
         IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2, false);
 
-    /** Default value of {@link 
IgniteSystemProperties#IGNITE_USE_BINARY_ARRAYS}. */
-    public static final boolean DFLT_IGNITE_USE_BINARY_ARRAYS = false;
-
-    /** Value of {@link IgniteSystemProperties#IGNITE_USE_BINARY_ARRAYS}. */
+    /** Value of {@link 
IgniteCommonsSystemProperties#IGNITE_USE_BINARY_ARRAYS}. */
     private static boolean USE_BINARY_ARRAYS =
-        IgniteSystemProperties.getBoolean(IGNITE_USE_BINARY_ARRAYS, 
DFLT_IGNITE_USE_BINARY_ARRAYS);
+        IgniteCommonsSystemProperties.getBoolean(IGNITE_USE_BINARY_ARRAYS, 
DFLT_IGNITE_USE_BINARY_ARRAYS);
 
     /** Map from class to associated write replacer. */
     private static final Map<Class, BinaryWriteReplacer> CLS_TO_WRITE_REPLACER 
= Map.of(
@@ -170,7 +168,7 @@ public class BinaryUtils {
 
     /** Whether to sort field in binary objects (doesn't affect 
Binarylizable). */
     public static boolean FIELDS_SORTED_ORDER =
-        
IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_BINARY_SORT_OBJECT_FIELDS);
+        
IgniteCommonsSystemProperties.getBoolean(IgniteCommonsSystemProperties.IGNITE_BINARY_SORT_OBJECT_FIELDS);
 
     /** Field type names. */
     private static final String[] FIELD_TYPE_NAMES;
@@ -2758,18 +2756,19 @@ public class BinaryUtils {
     /**
      * Gets the schema.
      *
-     * @param cacheObjProc Cache object processor.
+     * @param ctx Binary context.
+     * @param metadataProvider Function to provide binary type metadata.
      * @param typeId Type id.
      * @param schemaId Schema id.
      */
-    public static int[] getSchema(IgniteCacheObjectProcessor cacheObjProc, int 
typeId, int schemaId) {
-        assert cacheObjProc != null;
+    public static int[] getSchema(BinaryContext ctx, IntFunction<BinaryType> 
metadataProvider, int typeId, int schemaId) {
+        assert ctx != null;
 
-        BinarySchemaRegistry schemaReg = 
cacheObjProc.binaryContext().schemaRegistry(typeId);
+        BinarySchemaRegistry schemaReg = ctx.schemaRegistry(typeId);
         BinarySchema schema = schemaReg.schema(schemaId);
 
         if (schema == null) {
-            BinaryTypeImpl meta = 
(BinaryTypeImpl)cacheObjProc.metadata(typeId);
+            BinaryTypeImpl meta = 
(BinaryTypeImpl)metadataProvider.apply(typeId);
 
             if (meta != null) {
                 for (BinarySchema typeSchema : meta.metadata().schemas()) {
@@ -2989,12 +2988,12 @@ public class BinaryUtils {
 
     /**
      * Initialize {@link #USE_BINARY_ARRAYS} value with
-     * {@link IgniteSystemProperties#IGNITE_USE_BINARY_ARRAYS} system property 
value.
+     * {@link IgniteCommonsSystemProperties#IGNITE_USE_BINARY_ARRAYS} system 
property value.
      *
      * This method invoked using reflection in tests.
      */
     public static void initUseBinaryArrays() {
-        USE_BINARY_ARRAYS = 
IgniteSystemProperties.getBoolean(IGNITE_USE_BINARY_ARRAYS, 
DFLT_IGNITE_USE_BINARY_ARRAYS);
+        USE_BINARY_ARRAYS = 
IgniteCommonsSystemProperties.getBoolean(IGNITE_USE_BINARY_ARRAYS, 
DFLT_IGNITE_USE_BINARY_ARRAYS);
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriteMode.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriteMode.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriteMode.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriteMode.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriteReplacer.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriteReplacer.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriteReplacer.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriteReplacer.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterHandles.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterHandles.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterHandles.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterHandles.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
similarity index 97%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
index 774a781b88d..311c629b553 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java
@@ -20,9 +20,9 @@ package org.apache.ignite.internal.binary;
 import java.lang.reflect.Array;
 import java.util.Collection;
 import java.util.Map;
+import java.util.function.Supplier;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.binary.BinaryObjectException;
-import org.apache.ignite.internal.IgnitionEx;
 import org.apache.ignite.internal.binary.streams.BinaryInputStream;
 import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
 import org.apache.ignite.internal.binary.streams.BinaryStreams;
@@ -38,6 +38,9 @@ public class GridBinaryMarshaller {
     private static final ThreadLocal<BinaryContextHolder> BINARY_CTX =
         ThreadLocal.withInitial(BinaryContextHolder::new);
 
+    /** Binary context supplier. */
+    private static Supplier<BinaryContext> BINARY_CTX_SUPPLIER;
+
     /** */
     public static final byte TRANSFORMED = -3;
 
@@ -470,6 +473,13 @@ public class GridBinaryMarshaller {
         return ctx;
     }
 
+    /**
+     * @param supplier Context supplier.
+     */
+    public static void binaryContextSupplier(Supplier<BinaryContext> supplier) 
{
+        BINARY_CTX_SUPPLIER = supplier;
+    }
+
     /**
      * @return Thread-bound context.
      */
@@ -477,7 +487,7 @@ public class GridBinaryMarshaller {
         BinaryContext ctx = BINARY_CTX.get().get();
 
         if (ctx == null)
-            return 
IgnitionEx.localIgnite().context().cacheObjects().binaryContext();
+            return BINARY_CTX_SUPPLIER.get();
 
         return ctx;
     }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractor.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractor.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractor.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractor.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryAbstractLazyValue.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryAbstractLazyValue.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryAbstractLazyValue.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryAbstractLazyValue.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializationAware.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializationAware.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializationAware.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializationAware.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyArrayList.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyArrayList.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyArrayList.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyArrayList.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyLinkedList.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyLinkedList.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyLinkedList.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyLinkedList.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyMap.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyMap.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyMap.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyMap.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazySet.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazySet.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazySet.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazySet.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyValue.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyValue.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyValue.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyValue.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryModifiableLazyValue.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryModifiableLazyValue.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryModifiableLazyValue.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryModifiableLazyValue.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilders.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilders.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilders.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilders.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainBinaryObject.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainBinaryObject.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainBinaryObject.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainBinaryObject.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainLazyValue.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainLazyValue.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainLazyValue.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainLazyValue.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerInaccessibleClassException.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerInaccessibleClassException.java
similarity index 100%
rename from 
modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerInaccessibleClassException.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerInaccessibleClassException.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObject.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObject.java
similarity index 94%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObject.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObject.java
index eefd03e0841..09e7a8d5a0e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObject.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObject.java
@@ -101,7 +101,7 @@ public interface CacheObject {
     /**
      * Gets flag indicating whether object value is a platform type. Platform 
types will be automatically
      * deserialized on public API cache operations regardless whether
-     * {@link org.apache.ignite.IgniteCache#withKeepBinary()} is used or not.
+     * {@code org.apache.ignite.IgniteCache#withKeepBinary()} is used or not.
      *
      * @return Platform type flag.
      */
@@ -127,4 +127,11 @@ public interface CacheObject {
      * @throws IgniteCheckedException If failed.
      */
     public void prepareMarshal(CacheObjectValueContext ctx) throws 
IgniteCheckedException;
+
+    /**
+     * @return {@code True} if postWriteHashCode call required, {@code false} 
otherwise.
+     */
+    public default boolean postWriteRequired() {
+        return true;
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectUtils.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectUtils.java
similarity index 68%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectUtils.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectUtils.java
index 5b247e5acf2..aab48ffed1a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectUtils.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectUtils.java
@@ -17,20 +17,26 @@
 
 package org.apache.ignite.internal.processors.cache;
 
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.internal.binary.BinaryUtils;
+import org.apache.ignite.internal.pagemem.PageUtils;
+import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.MutableSingletonList;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Cache object utility methods.
  */
 public class CacheObjectUtils {
+    /** Head size. */
+    protected static final int HEAD_SIZE = 5; // 4 bytes len + 1 byte type
+
     /**
      * @param o Object to unwrap.
      * @param keepBinary Keep binary flag.
@@ -102,7 +108,7 @@ public class CacheObjectUtils {
         for (Object obj : col)
             col0.add(unwrapBinary(ctx, obj, keepBinary, cpy, null));
 
-        return (col0 instanceof MutableSingletonList) ? 
U.convertToSingletonList(col0) : col0;
+        return (col0 instanceof MutableSingletonList) ? 
CommonUtils.convertToSingletonList(col0) : col0;
     }
 
     /**
@@ -210,6 +216,106 @@ public class CacheObjectUtils {
         return o;
     }
 
+    /**
+     * @param dataLen Serialized value length.
+     * @return Full size required to store cache object.
+     * @see #putValue(byte, ByteBuffer, int, int, byte[], int)
+     */
+    public static int objectPutSize(int dataLen) {
+        return dataLen + HEAD_SIZE;
+    }
+
+    /**
+     * @param addr Write address.
+     * @param type Object type.
+     * @param valBytes Value bytes array.
+     * @return Offset shift compared to initial address.
+     */
+    public static int putValue(long addr, byte type, byte[] valBytes) {
+        return putValue(addr, type, valBytes, 0, valBytes.length);
+    }
+
+    /**
+     * @param addr Write address.
+     * @param type Object type.
+     * @param srcBytes Source value bytes array.
+     * @param srcOff Start position in sourceBytes.
+     * @param len Number of bytes for write.
+     * @return Offset shift compared to initial address.
+     */
+    public static int putValue(long addr, byte type, byte[] srcBytes, int 
srcOff, int len) {
+        int off = 0;
+
+        PageUtils.putInt(addr, off, len);
+        off += 4;
+
+        PageUtils.putByte(addr, off, type);
+        off++;
+
+        PageUtils.putBytes(addr, off, srcBytes, srcOff, len);
+        off += len;
+
+        return off;
+    }
+
+    /**
+     * @param cacheObjType Cache object type.
+     * @param buf Buffer to write value to.
+     * @param off Offset in source binary data.
+     * @param len Length of the data to write.
+     * @param valBytes Binary data.
+     * @param start Start offset in binary data.
+     * @return {@code True} if data were successfully written.
+     * @throws IgniteCheckedException If failed.
+     */
+    public static boolean putValue(byte cacheObjType,
+                                   final ByteBuffer buf,
+                                   int off,
+                                   int len,
+                                   byte[] valBytes,
+                                   final int start
+    ) throws IgniteCheckedException {
+        int dataLen = valBytes.length;
+
+        if (buf.remaining() < len)
+            return false;
+
+        if (off == 0 && len >= HEAD_SIZE) {
+            buf.putInt(dataLen);
+            buf.put(cacheObjType);
+
+            len -= HEAD_SIZE;
+        }
+        else if (off >= HEAD_SIZE)
+            off -= HEAD_SIZE;
+        else {
+            // Partial header write.
+            final ByteBuffer head = ByteBuffer.allocate(HEAD_SIZE);
+
+            head.order(buf.order());
+
+            head.putInt(dataLen);
+            head.put(cacheObjType);
+
+            head.position(off);
+
+            if (len < head.capacity())
+                head.limit(off + Math.min(len, head.capacity() - off));
+
+            buf.put(head);
+
+            if (head.limit() < HEAD_SIZE)
+                return true;
+
+            len -= HEAD_SIZE - off;
+            off = 0;
+        }
+
+        buf.put(valBytes, start + off, len);
+
+        return true;
+    }
+
     /**
      * Private constructor.
      */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectValueContext.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectValueContext.java
similarity index 94%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectValueContext.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectValueContext.java
index edefa2672ad..453e2fb795b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectValueContext.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectValueContext.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.processors.cache;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.binary.BinaryContext;
-import 
org.apache.ignite.internal.cache.transform.CacheObjectTransformerProcessor;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -99,7 +98,7 @@ public interface CacheObjectValueContext {
     public boolean isPeerClassLoadingEnabled();
 
     /**
-     * Transforms bytes according to {@link CacheObjectTransformerProcessor} 
when specified.
+     * Transforms bytes according to {@code CacheObjectTransformerProcessor} 
when specified.
      * @param bytes Given bytes.
      * @return Transformed bytes.
      */
@@ -108,7 +107,7 @@ public interface CacheObjectValueContext {
     }
 
     /**
-     * Transforms bytes according to {@link CacheObjectTransformerProcessor} 
when specified.
+     * Transforms bytes according to {@code CacheObjectTransformerProcessor} 
when specified.
      * @param bytes Given bytes.
      * @param offset Index to start from.
      * @param length Data length.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/platform/PlatformType.java 
b/modules/binary/api/src/main/java/org/apache/ignite/platform/PlatformType.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/platform/PlatformType.java
rename to 
modules/binary/api/src/main/java/org/apache/ignite/platform/PlatformType.java
diff --git 
a/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java
 
b/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java
index bafe987218f..6aa8c01e957 100644
--- 
a/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java
@@ -34,6 +34,9 @@ import static 
org.apache.ignite.internal.util.tostring.GridToStringBuilder.DFLT_
  * These properties and variables can be used to affect the behavior of Ignite.
  */
 public class IgniteCommonsSystemProperties {
+    /** Default value of {@link 
IgniteCommonsSystemProperties#IGNITE_USE_BINARY_ARRAYS}. */
+    public static final boolean DFLT_IGNITE_USE_BINARY_ARRAYS = false;
+
     /**
      * Setting to {@code true} enables writing sensitive information in {@code 
toString()} output.
      */
@@ -113,6 +116,43 @@ public class IgniteCommonsSystemProperties {
     @SystemProperty(value = "Defines Ignite installation folder", type = 
String.class, defaults = "")
     public static final String IGNITE_HOME = "IGNITE_HOME";
 
+    /**
+     * Manages type of serialization mechanism for {@link String} that is 
marshalled/unmarshalled by BinaryMarshaller.
+     * Should be used for cases when a String contains a surrogate symbol 
without its pair one. This is frequently used
+     * in algorithms that encrypts data in String format.
+     */
+    @SystemProperty("Manages type of serialization mechanism for String that 
is " +
+        "marshalled/unmarshalled by BinaryMarshaller. Should be used for cases 
when a String contains a surrogate " +
+        "symbol without its pair one. This is frequently used in algorithms 
that encrypts data in String format")
+    public static final String 
IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2 =
+        "IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2";
+
+    /**
+     * Enables storage of typed arrays.
+     * The default value is {@code BinaryUtils#DFLT_IGNITE_USE_BINARY_ARRAYS}.
+     */
+    @SystemProperty(value = "Flag to enable store of array in binary format 
and keep component type",
+        defaults = "" + DFLT_IGNITE_USE_BINARY_ARRAYS)
+    public static final String IGNITE_USE_BINARY_ARRAYS = 
"IGNITE_USE_BINARY_ARRAYS";
+
+    /**
+     * When set to {@code true} fields are written by BinaryMarshaller in 
sorted order. Otherwise
+     * the natural order is used.
+     * <p>
+     * NOTICE: Should be the default in Apache Ignite 3.0
+     */
+    @SystemProperty("Enables fields to be written by BinaryMarshaller in 
sorted order. " +
+        "By default, the natural order is used")
+    public static final String IGNITE_BINARY_SORT_OBJECT_FIELDS = 
"IGNITE_BINARY_SORT_OBJECT_FIELDS";
+
+    /**
+     * Flag that will force Ignite to fill memory block with some recognisable 
pattern right before
+     * this memory block is released. This will help to recognize cases when 
already released memory is accessed.
+     */
+    @SystemProperty("Force Ignite to fill memory block with some recognisable 
pattern right before this " +
+        "memory block is released. This will help to recognize cases when 
already released memory is accessed")
+    public static final String IGNITE_OFFHEAP_SAFE_RELEASE = 
"IGNITE_OFFHEAP_SAFE_RELEASE";
+
     /**
      * @param enumCls Enum type.
      * @param name Name of the system property or environment variable.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/GridDirectTransient.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/GridDirectTransient.java
similarity index 94%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/GridDirectTransient.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/GridDirectTransient.java
index 29e1c4e7239..88f9f9527d5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/GridDirectTransient.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/internal/GridDirectTransient.java
@@ -24,7 +24,7 @@ import java.lang.annotation.Target;
 
 /**
  * Annotates transient fields.
- * Deprecated, see {@link Order} and {@link MessageProcessor} for details.
+ * Deprecated, see {@code Order} and {@code MessageProcessor} for details.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteInternalFuture.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteInternalFuture.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/IgniteInternalFuture.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/IgniteInternalFuture.java
diff --git 
a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
index 3cadcdae1d2..ef31895a40c 100644
--- 
a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
@@ -219,6 +219,9 @@ public abstract class CommonUtils {
     private static final ConcurrentMap<ClassLoader, ConcurrentMap<String, 
Class>> classCache =
         new ConcurrentHashMap<>();
 
+    /** */
+    private static final Class<?> GEOMETRY_CLASS = 
classForName("org.locationtech.jts.geom.Geometry", null);
+
     static {
         primitiveMap.put("byte", byte.class);
         primitiveMap.put("short", short.class);
@@ -2108,4 +2111,14 @@ public abstract class CommonUtils {
 
         return new IgniteException(e.getMessage(), e);
     }
+
+    /**
+     * Checks if the given class is GEOMETRY.
+     *
+     * @param cls Class.
+     * @return {@code true} If this is geometry.
+     */
+    public static boolean isGeometryClass(Class<?> cls) {
+        return GEOMETRY_CLASS != null && GEOMETRY_CLASS.isAssignableFrom(cls);
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/MutableSingletonList.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/util/MutableSingletonList.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/util/MutableSingletonList.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/util/MutableSingletonList.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java 
b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 1b013c1ce53..b8be84ddb73 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -32,7 +32,6 @@ import 
org.apache.ignite.configuration.DataStorageConfiguration;
 import org.apache.ignite.configuration.DeploymentMode;
 import org.apache.ignite.configuration.DiskPageCompression;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.binary.BinaryUtils;
 import 
org.apache.ignite.internal.cache.query.index.sorted.inline.InlineRecommender;
 import 
org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointEntry;
 import 
org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointMarkersStorage;
@@ -55,7 +54,6 @@ import static 
org.apache.ignite.internal.IgniteKernal.DFLT_LONG_OPERATIONS_DUMP_
 import static 
org.apache.ignite.internal.LongJVMPauseDetector.DEFAULT_JVM_PAUSE_DETECTOR_THRESHOLD;
 import static 
org.apache.ignite.internal.LongJVMPauseDetector.DFLT_JVM_PAUSE_DETECTOR_LAST_EVENTS_COUNT;
 import static 
org.apache.ignite.internal.LongJVMPauseDetector.DFLT_JVM_PAUSE_DETECTOR_PRECISION;
-import static 
org.apache.ignite.internal.binary.BinaryUtils.DFLT_IGNITE_USE_BINARY_ARRAYS;
 import static 
org.apache.ignite.internal.cache.query.index.sorted.inline.InlineRecommender.DFLT_THROTTLE_INLINE_SIZE_CALCULATION;
 import static 
org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.DFLT_DISCOVERY_HISTORY_SIZE;
 import static 
org.apache.ignite.internal.processors.affinity.AffinityAssignment.DFLT_AFFINITY_BACKUPS_THRESHOLD;
@@ -510,14 +508,6 @@ public final class IgniteSystemProperties extends 
IgniteCommonsSystemProperties
         "than specified by this property", type = Integer.class, defaults = 
"512")
     public static final String IGNITE_MIN_BUFFERED_COMMUNICATION_MSG_CNT = 
"IGNITE_MIN_BUFFERED_COMMUNICATION_MSG_CNT";
 
-    /**
-     * Flag that will force Ignite to fill memory block with some recognisable 
pattern right before
-     * this memory block is released. This will help to recognize cases when 
already released memory is accessed.
-     */
-    @SystemProperty("Force Ignite to fill memory block with some recognisable 
pattern right before this " +
-        "memory block is released. This will help to recognize cases when 
already released memory is accessed")
-    public static final String IGNITE_OFFHEAP_SAFE_RELEASE = 
"IGNITE_OFFHEAP_SAFE_RELEASE";
-
     /** Maximum size for atomic cache queue delete history (default is 200 000 
entries per partition). */
     @SystemProperty(value = "Maximum size for atomic cache queue delete 
history",
         type = Integer.class, defaults = "" + 
DFLT_ATOMIC_CACHE_DELETE_HISTORY_SIZE + " per partition")
@@ -827,17 +817,6 @@ public final class IgniteSystemProperties extends 
IgniteCommonsSystemProperties
     @SystemProperty("Enables local store keeps primary only. Backward 
compatibility flag")
     public static final String IGNITE_LOCAL_STORE_KEEPS_PRIMARY_ONLY = 
"IGNITE_LOCAL_STORE_KEEPS_PRIMARY_ONLY";
 
-    /**
-     * Manages type of serialization mechanism for {@link String} that is 
marshalled/unmarshalled by BinaryMarshaller.
-     * Should be used for cases when a String contains a surrogate symbol 
without its pair one. This is frequently used
-     * in algorithms that encrypts data in String format.
-     */
-    @SystemProperty("Manages type of serialization mechanism for String that 
is " +
-        "marshalled/unmarshalled by BinaryMarshaller. Should be used for cases 
when a String contains a surrogate " +
-        "symbol without its pair one. This is frequently used in algorithms 
that encrypts data in String format")
-    public static final String 
IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2 =
-        "IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2";
-
     /** Defines path to the file that contains list of classes allowed to safe 
deserialization.*/
     @SystemProperty(value = "Path to the file that contains list of classes 
allowed to safe deserialization",
         type = String.class)
@@ -955,16 +934,6 @@ public final class IgniteSystemProperties extends 
IgniteCommonsSystemProperties
         defaults = "" + DFLT_IO_BALANCE_PERIOD)
     public static final String IGNITE_IO_BALANCE_PERIOD = 
"IGNITE_IO_BALANCE_PERIOD";
 
-    /**
-     * When set to {@code true} fields are written by BinaryMarshaller in 
sorted order. Otherwise
-     * the natural order is used.
-     * <p>
-     * NOTICE: Should be the default in Apache Ignite 3.0
-     */
-    @SystemProperty("Enables fields to be written by BinaryMarshaller in 
sorted order. " +
-        "By default, the natural order is used")
-    public static final String IGNITE_BINARY_SORT_OBJECT_FIELDS = 
"IGNITE_BINARY_SORT_OBJECT_FIELDS";
-
     /**
      * When set to {@code true} BinaryObject will be unwrapped before passing 
to IndexingSpi to preserve
      * old behavior query processor with IndexingSpi.
@@ -1976,14 +1945,6 @@ public final class IgniteSystemProperties extends 
IgniteCommonsSystemProperties
         type = Integer.class, defaults = "" + 
DFLT_THROTTLE_INLINE_SIZE_CALCULATION)
     public static final String IGNITE_THROTTLE_INLINE_SIZE_CALCULATION = 
"IGNITE_THROTTLE_INLINE_SIZE_CALCULATION";
 
-    /**
-     * Enables storage of typed arrays.
-     * The default value is {@link BinaryUtils#DFLT_IGNITE_USE_BINARY_ARRAYS}.
-     */
-    @SystemProperty(value = "Flag to enable store of array in binary format 
and keep component type",
-        defaults = "" + DFLT_IGNITE_USE_BINARY_ARRAYS)
-    public static final String IGNITE_USE_BINARY_ARRAYS = 
"IGNITE_USE_BINARY_ARRAYS";
-
     /**
      * Flag to indicate that disk writes during snapshot process should be in 
a sequential manner when possible. This
      * generates extra disk space usage.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java 
b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
index aa4f2b70a55..35a63290913 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
@@ -813,11 +813,11 @@ public class QueryEntity implements Serializable {
      */
     private static void processAnnotationsInClass(boolean key, Class<?> cls, 
QueryEntityTypeDescriptor type,
         @Nullable QueryEntityClassProperty parent) {
-        if (U.isJdk(cls) || QueryUtils.isGeometryClass(cls)) {
+        if (U.isJdk(cls) || U.isGeometryClass(cls)) {
             if (parent == null && !key && QueryUtils.isSqlType(cls)) { // We 
have to index primitive _val.
                 String idxName = cls.getSimpleName() + "_" + 
QueryUtils.VAL_FIELD_NAME + "_idx";
 
-                type.addIndex(idxName, QueryUtils.isGeometryClass(cls) ?
+                type.addIndex(idxName, U.isGeometryClass(cls) ?
                     QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED, 
QueryIndex.DFLT_INLINE_SIZE);
 
                 type.addFieldToIndex(idxName, QueryUtils.VAL_FIELD_NAME, 0, 
false);
@@ -896,7 +896,7 @@ public class QueryEntity implements Serializable {
                 if (cls != curCls)
                     idxName = cls.getSimpleName() + "_" + idxName;
 
-                desc.addIndex(idxName, QueryUtils.isGeometryClass(prop.type()) 
?
+                desc.addIndex(idxName, U.isGeometryClass(prop.type()) ?
                     QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED, 
sqlAnn.inlineSize());
 
                 desc.addFieldToIndex(idxName, prop.fullName(), 0, 
sqlAnn.descending());
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
index 2fd4474d2dc..5d8ae5d4af9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
@@ -39,6 +39,7 @@ import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.failure.FailureType;
 import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.binary.GridBinaryMarshaller;
 import org.apache.ignite.internal.cache.query.index.IndexProcessor;
 import 
org.apache.ignite.internal.cache.transform.CacheObjectTransformerProcessor;
 import org.apache.ignite.internal.maintenance.MaintenanceProcessor;
@@ -121,6 +122,10 @@ import static 
org.apache.ignite.internal.IgniteComponentType.SPRING;
  */
 @GridToStringExclude
 public class GridKernalContextImpl implements GridKernalContext, 
Externalizable {
+    static {
+        GridBinaryMarshaller.binaryContextSupplier(() -> 
IgnitionEx.localIgnite().context().cacheObjects().binaryContext());
+    }
+
     /** */
     private static final long serialVersionUID = 0L;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/sorted/IndexKeyType.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/sorted/IndexKeyType.java
index 838acace5d0..b75a1d85076 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/sorted/IndexKeyType.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/sorted/IndexKeyType.java
@@ -31,7 +31,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import org.apache.ignite.IgniteException;
-import org.apache.ignite.internal.processors.query.QueryUtils;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
@@ -245,7 +244,7 @@ public enum IndexKeyType {
             // This includes String[] and so on.
             return ARRAY;
         }
-        else if (QueryUtils.isGeometryClass(cls))
+        else if (U.isGeometryClass(cls))
             return GEOMETRY;
         else if (LocalDate.class == cls)
             return DATE;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectAdapter.java
index 357a0ea726a..522ae7d5b0f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectAdapter.java
@@ -24,11 +24,12 @@ import java.io.ObjectOutput;
 import java.nio.ByteBuffer;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.binary.BinaryUtils;
-import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
+import static 
org.apache.ignite.internal.processors.cache.CacheObjectUtils.objectPutSize;
+
 /**
  *
  */
@@ -36,9 +37,6 @@ public abstract class CacheObjectAdapter implements 
CacheObject, Externalizable
     /** */
     private static final long serialVersionUID = 2006765505127197251L;
 
-    /** Head size. */
-    protected static final int HEAD_SIZE = 5; // 4 bytes len + 1 byte type
-
     /** */
     @GridToStringInclude(sensitive = true)
     protected Object val;
@@ -100,47 +98,14 @@ public abstract class CacheObjectAdapter implements 
CacheObject, Externalizable
     @Override public int putValue(long addr) throws IgniteCheckedException {
         assert valBytes != null : "Value bytes must be initialized before 
object is stored";
 
-        return putValue(addr, cacheObjectType(), valBytes);
-    }
-
-    /**
-     * @param addr Write address.
-     * @param type Object type.
-     * @param valBytes Value bytes array.
-     * @return Offset shift compared to initial address.
-     */
-    public static int putValue(long addr, byte type, byte[] valBytes) {
-        return putValue(addr, type, valBytes, 0, valBytes.length);
-    }
-
-    /**
-     * @param addr Write address.
-     * @param type Object type.
-     * @param srcBytes Source value bytes array.
-     * @param srcOff Start position in sourceBytes.
-     * @param len Number of bytes for write.
-     * @return Offset shift compared to initial address.
-     */
-    public static int putValue(long addr, byte type, byte[] srcBytes, int 
srcOff, int len) {
-        int off = 0;
-
-        PageUtils.putInt(addr, off, len);
-        off += 4;
-
-        PageUtils.putByte(addr, off, type);
-        off++;
-
-        PageUtils.putBytes(addr, off, srcBytes, srcOff, len);
-        off += len;
-
-        return off;
+        return CacheObjectUtils.putValue(addr, cacheObjectType(), valBytes);
     }
 
     /** {@inheritDoc} */
     @Override public boolean putValue(final ByteBuffer buf, int off, int len) 
throws IgniteCheckedException {
         assert valBytes != null : "Value bytes must be initialized before 
object is stored";
 
-        return putValue(cacheObjectType(), buf, off, len, valBytes, 0);
+        return CacheObjectUtils.putValue(cacheObjectType(), buf, off, len, 
valBytes, 0);
     }
 
     /** {@inheritDoc} */
@@ -157,71 +122,4 @@ public abstract class CacheObjectAdapter implements 
CacheObject, Externalizable
             "val", val, true,
             "hasValBytes", valBytes != null, false);
     }
-
-    /**
-     * @param dataLen Serialized value length.
-     * @return Full size required to store cache object.
-     * @see #putValue(byte, ByteBuffer, int, int, byte[], int)
-     */
-    public static int objectPutSize(int dataLen) {
-        return dataLen + HEAD_SIZE;
-    }
-
-    /**
-     * @param cacheObjType Cache object type.
-     * @param buf Buffer to write value to.
-     * @param off Offset in source binary data.
-     * @param len Length of the data to write.
-     * @param valBytes Binary data.
-     * @param start Start offset in binary data.
-     * @return {@code True} if data were successfully written.
-     * @throws IgniteCheckedException If failed.
-     */
-    public static boolean putValue(byte cacheObjType,
-        final ByteBuffer buf,
-        int off,
-        int len,
-        byte[] valBytes,
-        final int start
-    ) throws IgniteCheckedException {
-        int dataLen = valBytes.length;
-
-        if (buf.remaining() < len)
-            return false;
-
-        if (off == 0 && len >= HEAD_SIZE) {
-            buf.putInt(dataLen);
-            buf.put(cacheObjType);
-
-            len -= HEAD_SIZE;
-        }
-        else if (off >= HEAD_SIZE)
-            off -= HEAD_SIZE;
-        else {
-            // Partial header write.
-            final ByteBuffer head = ByteBuffer.allocate(HEAD_SIZE);
-
-            head.order(buf.order());
-
-            head.putInt(dataLen);
-            head.put(cacheObjType);
-
-            head.position(off);
-
-            if (len < head.capacity())
-                head.limit(off + Math.min(len, head.capacity() - off));
-
-            buf.put(head);
-
-            if (head.limit() < HEAD_SIZE)
-                return true;
-
-            len -= HEAD_SIZE - off;
-            off = 0;
-        }
-
-        buf.put(valBytes, start + off, len);
-
-        return true;
-    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectByteArrayImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectByteArrayImpl.java
index 7a0fc222d33..5c7c3f25cfa 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectByteArrayImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectByteArrayImpl.java
@@ -81,24 +81,24 @@ public class CacheObjectByteArrayImpl implements 
CacheObject, Externalizable {
     @Override public boolean putValue(ByteBuffer buf) throws 
IgniteCheckedException {
         assert val != null : "Value is not initialized";
 
-        return putValue(buf, 0, CacheObjectAdapter.objectPutSize(val.length));
+        return putValue(buf, 0, CacheObjectUtils.objectPutSize(val.length));
     }
 
     /** {@inheritDoc} */
     @Override public int putValue(long addr) throws IgniteCheckedException {
-        return CacheObjectAdapter.putValue(addr, cacheObjectType(), val);
+        return CacheObjectUtils.putValue(addr, cacheObjectType(), val);
     }
 
     /** {@inheritDoc} */
     @Override public boolean putValue(final ByteBuffer buf, int off, int len) 
throws IgniteCheckedException {
         assert val != null : "Value is not initialized";
 
-        return CacheObjectAdapter.putValue(cacheObjectType(), buf, off, len, 
val, 0);
+        return CacheObjectUtils.putValue(cacheObjectType(), buf, off, len, 
val, 0);
     }
 
     /** {@inheritDoc} */
     @Override public int valueBytesLength(CacheObjectValueContext ctx) throws 
IgniteCheckedException {
-        return CacheObjectAdapter.objectPutSize(val.length);
+        return CacheObjectUtils.objectPutSize(val.length);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
index 26ba2256ea2..fabf36ac20a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
@@ -138,4 +138,9 @@ public class CacheObjectImpl extends CacheObjectAdapter {
     @Override public CacheObject prepareForCache(CacheObjectValueContext ctx) {
         return this;
     }
+
+    /** {@inheritDoc} */
+    @Override public boolean postWriteRequired() {
+        return false;
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java
index 0560280a215..2e729960808 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java
@@ -37,9 +37,11 @@ import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.GridKernalGateway;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.IgnitionEx;
 import org.apache.ignite.internal.LongJVMPauseDetector;
 import org.apache.ignite.internal.MarshallerContextImpl;
 import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.binary.GridBinaryMarshaller;
 import org.apache.ignite.internal.cache.query.index.IndexProcessor;
 import 
org.apache.ignite.internal.cache.transform.CacheObjectTransformerProcessor;
 import org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager;
@@ -119,6 +121,10 @@ import org.jetbrains.annotations.Nullable;
  * @see org.apache.ignite.internal.GridComponent#stop(boolean)
  */
 public class StandaloneGridKernalContext implements GridKernalContext {
+    static {
+        GridBinaryMarshaller.binaryContextSupplier(() -> 
IgnitionEx.localIgnite().context().cacheObjects().binaryContext());
+    }
+
     /** Config for fake Ignite instance. */
     private final IgniteConfiguration cfg;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java
index 1d5c86f3352..d684d02a325 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformContextImpl.java
@@ -360,7 +360,7 @@ public class PlatformContextImpl implements 
PlatformContext, PartitionsExchangeA
 
     /** {@inheritDoc} */
     @Override public void writeSchema(BinaryWriterEx writer, int typeId, int 
schemaId) {
-        writer.writeIntArray(BinaryUtils.getSchema(cacheObjProc, typeId, 
schemaId));
+        
writer.writeIntArray(BinaryUtils.getSchema(cacheObjProc.binaryContext(), 
cacheObjProc::metadata, typeId, schemaId));
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
index 2126e27da38..61f2bfa2d09 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
@@ -130,9 +130,6 @@ public class QueryUtils {
     private static final int DISCO_HIST_SIZE =
         getInteger(IGNITE_INDEXING_DISCOVERY_HISTORY_SIZE, 
DFLT_INDEXING_DISCOVERY_HISTORY_SIZE);
 
-    /** */
-    private static final Class<?> GEOMETRY_CLASS = 
U.classForName("org.locationtech.jts.geom.Geometry", null);
-
     /** */
     private static final Set<Class<?>> SQL_TYPES = createSqlTypes();
 
@@ -1157,17 +1154,7 @@ public class QueryUtils {
     public static boolean isSqlType(Class<?> cls) {
         cls = U.box(cls);
 
-        return SQL_TYPES.contains(cls) || QueryUtils.isGeometryClass(cls);
-    }
-
-    /**
-     * Checks if the given class is GEOMETRY.
-     *
-     * @param cls Class.
-     * @return {@code true} If this is geometry.
-     */
-    public static boolean isGeometryClass(Class<?> cls) {
-        return GEOMETRY_CLASS != null && GEOMETRY_CLASS.isAssignableFrom(cls);
+        return SQL_TYPES.contains(cls) || U.isGeometryClass(cls);
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
index 9cf0a67bb40..c9d7aa28acc 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
@@ -19,19 +19,34 @@ package org.apache.ignite.internal.processors.security;
 
 import java.security.CodeSource;
 import java.security.ProtectionDomain;
-import java.util.Objects;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import org.apache.ignite.binary.BinaryType;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
+import org.apache.ignite.internal.util.typedef.internal.U;
 
 import static 
org.apache.ignite.internal.processors.security.SecurityUtils.doPrivileged;
 import static 
org.apache.ignite.internal.processors.security.SecurityUtils.isInIgnitePackage;
 
 /** */
 public abstract class IgniteSecurityAdapter extends GridProcessorAdapter 
implements IgniteSecurity {
-    /** Code source for ignite-core module. */
-    private static final CodeSource CORE_CODE_SOURCE = 
SecurityUtils.class.getProtectionDomain().getCodeSource();
+    /** Code sources for ignite modules. */
+    private static final Set<CodeSource> MODULES = new HashSet<>(Arrays.asList(
+        SecurityUtils.class.getProtectionDomain().getCodeSource(), 
//ignite-core
+        BinaryType.class.getProtectionDomain().getCodeSource() 
//ignite-binary-api
+    ));
+
+    static {
+        // ignite-binary-impl. Theoretically, can be absent in runtime due to 
other implementation of binary-api.
+        Class<?> jdkMarshCls = 
U.classForName("org.apache.ignite.marshaller.jdk.JdkMarshallerImpl", null);
+
+        if (jdkMarshCls != null)
+            MODULES.add(jdkMarshCls.getProtectionDomain().getCodeSource());
+    }
 
     /** System types cache. */
     private static final ConcurrentMap<Class<?>, Boolean> SYSTEM_TYPES = new 
ConcurrentHashMap<>();
@@ -48,8 +63,15 @@ public abstract class IgniteSecurityAdapter extends 
GridProcessorAdapter impleme
             c -> {
                 ProtectionDomain pd = doPrivileged(c::getProtectionDomain);
 
-                return pd != null
-                    && Objects.equals(CORE_CODE_SOURCE, pd.getCodeSource())
+                if (pd == null)
+                    return false;
+
+                CodeSource cs = pd.getCodeSource();
+
+                if (cs == null)
+                    return false;
+
+                return MODULES.contains(cs)
                     // It allows users create an Uber-JAR that includes both 
Ignite source code and custom classes
                     // and to pass mentioned classes to Ignite via public API 
(e.g. tasks execution).
                     // Otherwise, Ignite will treat custom classes as internal 
and block their execution through the
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/AbstractDataTypesCoverageTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/AbstractDataTypesCoverageTest.java
index f558b3f0512..fae65c4453b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/AbstractDataTypesCoverageTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/AbstractDataTypesCoverageTest.java
@@ -53,8 +53,8 @@ import org.jetbrains.annotations.Nullable;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
+import static 
org.apache.ignite.IgniteCommonsSystemProperties.DFLT_IGNITE_USE_BINARY_ARRAYS;
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_USE_BINARY_ARRAYS;
-import static 
org.apache.ignite.internal.binary.BinaryUtils.DFLT_IGNITE_USE_BINARY_ARRAYS;
 
 /**
  * Abstract data types coverage  test.
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteIncompleteCacheObjectSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteIncompleteCacheObjectSelfTest.java
index ca704daa33b..0e8f4676f0c 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteIncompleteCacheObjectSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteIncompleteCacheObjectSelfTest.java
@@ -48,13 +48,13 @@ public class IgniteIncompleteCacheObjectSelfTest extends 
GridCommonAbstractTest
         final TestCacheObject obj = new TestCacheObject((byte)1);
 
         // Write part of the cache object and cut on header (3 bytes instead 
of 5)
-        assert CacheObjectAdapter.putValue(obj.cacheObjectType(), dataBuf, 
off, len, data, 0);
+        assert CacheObjectUtils.putValue(obj.cacheObjectType(), dataBuf, off, 
len, data, 0);
 
         off += len;
         len = IncompleteCacheObject.HEAD_LEN - len + data.length;
 
         // Write rest data.
-        assert CacheObjectAdapter.putValue(obj.cacheObjectType(), dataBuf, 
off, len, data, 0);
+        assert CacheObjectUtils.putValue(obj.cacheObjectType(), dataBuf, off, 
len, data, 0);
 
         assert !dataBuf.hasRemaining() : "Not all data were written.";
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/IgniteOperationsInsideSandboxTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/IgniteOperationsInsideSandboxTest.java
index 9300660d557..f066b51ca7b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/IgniteOperationsInsideSandboxTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/IgniteOperationsInsideSandboxTest.java
@@ -53,6 +53,8 @@ import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.lang.IgniteCallable;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgniteRunnable;
+import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.resources.IgniteInstanceResource;
 import org.apache.ignite.transactions.Transaction;
 import org.jetbrains.annotations.Nullable;
@@ -304,6 +306,9 @@ public class IgniteOperationsInsideSandboxTest extends 
AbstractSandboxTest {
                     ignite.cache(TEST_CACHE).put(0, new Object());
                     BinaryObject obj = 
(BinaryObject)ignite.cache(TEST_CACHE).withKeepBinary().get(0);
                     obj.toString();
+
+                    JdkMarshaller jdk = Marshallers.jdk();
+                    jdk.toString();
                 }
             });
     }
diff --git 
a/modules/json/src/test/java/org/apache/ignite/dump/JsonArrayTest.java 
b/modules/json/src/test/java/org/apache/ignite/dump/JsonArrayTest.java
index ad2cd069698..a2e4ce43012 100644
--- a/modules/json/src/test/java/org/apache/ignite/dump/JsonArrayTest.java
+++ b/modules/json/src/test/java/org/apache/ignite/dump/JsonArrayTest.java
@@ -29,8 +29,8 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
+import static 
org.apache.ignite.IgniteCommonsSystemProperties.DFLT_IGNITE_USE_BINARY_ARRAYS;
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_USE_BINARY_ARRAYS;
-import static 
org.apache.ignite.internal.binary.BinaryUtils.DFLT_IGNITE_USE_BINARY_ARRAYS;
 
 /** */
 @RunWith(Parameterized.class)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
rename to 
modules/unsafe/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapEvent.java
 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapEvent.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapEvent.java
rename to 
modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapEvent.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapEventListener.java
 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapEventListener.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapEventListener.java
rename to 
modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapEventListener.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapOutOfMemoryException.java
 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapOutOfMemoryException.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapOutOfMemoryException.java
rename to 
modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/GridOffHeapOutOfMemoryException.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
similarity index 98%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
rename to 
modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
index 377d0a436fe..cbdc60cb88d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
+++ 
b/modules/unsafe/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.util.offheap.unsafe;
 
 import java.util.concurrent.atomic.AtomicLong;
-import org.apache.ignite.IgniteSystemProperties;
+import org.apache.ignite.IgniteCommonsSystemProperties;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.offheap.GridOffHeapEventListener;
 import org.apache.ignite.internal.util.offheap.GridOffHeapOutOfMemoryException;
@@ -26,7 +26,7 @@ import 
org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteBiTuple;
 
-import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_OFFHEAP_SAFE_RELEASE;
+import static 
org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_OFFHEAP_SAFE_RELEASE;
 import static 
org.apache.ignite.internal.util.offheap.GridOffHeapEvent.ALLOCATE;
 import static org.apache.ignite.internal.util.offheap.GridOffHeapEvent.RELEASE;
 
@@ -38,7 +38,7 @@ public class GridUnsafeMemory {
     private static final byte FREE = (byte)0;
 
     /** Safe offheap release flag. */
-    private static final boolean SAFE_RELEASE = 
IgniteSystemProperties.getBoolean(IGNITE_OFFHEAP_SAFE_RELEASE);
+    private static final boolean SAFE_RELEASE = 
IgniteCommonsSystemProperties.getBoolean(IGNITE_OFFHEAP_SAFE_RELEASE);
 
     /** Total size. */
     @GridToStringInclude

Reply via email to