You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2017/04/18 08:20:12 UTC

[2/2] ignite git commit: IGNITE-2398 .NET: Change default name mapper behavior to full name

IGNITE-2398 .NET: Change default name mapper behavior to full name

This closes #1787


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3e3b91a8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3e3b91a8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3e3b91a8

Branch: refs/heads/master
Commit: 3e3b91a8a3e50ce8e255bb0ce2bfc4ae9ab858a2
Parents: 99842bf
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Tue Apr 18 11:19:57 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Tue Apr 18 11:19:57 2017 +0300

----------------------------------------------------------------------
 .../ignite/binary/BinaryBasicNameMapper.java    |   3 +
 .../PlatformDotNetConfigurationClosure.java     |  66 +---
 .../utils/PlatformConfigurationUtils.java       |   8 +
 .../internal/processors/query/QueryUtils.java   |   5 +
 .../Apache.Ignite.Core.Tests.csproj             |   7 +
 .../Binary/BinaryBuilderSelfTest.cs             |  90 +++--
 .../Binary/BinaryBuilderSelfTestSimpleName.cs   |  33 ++
 .../Binary/BinaryCompactFooterInteropTest.cs    |   3 +
 .../Binary/BinaryDynamicRegistrationTest.cs     |  10 +-
 .../Binary/BinaryNameMapperTest.cs              | 108 ++++++
 .../Binary/BinarySelfTest.cs                    |  20 +-
 .../Binary/BinarySelfTestSimpleName.cs          |  33 ++
 .../Binary/Serializable/SqlDmlTest.cs           |   3 +
 .../Binary/TypeNameParserTest.cs                | 232 +++++++++++
 .../Cache/Query/CacheDmlQueriesTest.cs          |  11 +
 .../Query/CacheDmlQueriesTestSimpleName.cs      |  35 ++
 .../Cache/Query/CacheLinqTest.cs                |  15 +-
 .../Cache/Query/CacheLinqTestSimpleName.cs      |  35 ++
 .../Query/CacheQueriesCodeConfigurationTest.cs  |  10 +-
 .../Cache/Query/CacheQueriesTest.cs             |  13 +-
 .../Cache/Query/CacheQueriesTestSimpleName.cs   |  35 ++
 .../Continuous/ContinuousQueryAbstractTest.cs   |  36 +-
 .../Cache/Store/CacheStoreTest.cs               |   4 +-
 .../Compute/ComputeApiTest.cs                   |   3 +-
 .../Config/Compute/compute-grid2.xml            |  10 -
 .../Config/cache-binarizables.xml               |  16 +-
 .../Config/cache-query-continuous.xml           |   8 +-
 .../Config/cache-query.xml                      |   2 +-
 .../Services/ServicesTest.cs                    |   3 +
 .../Apache.Ignite.Core.csproj                   |   2 +
 .../Binary/BinaryBasicNameMapper.cs             | 129 +++++++
 .../Cache/Configuration/QueryEntity.cs          |   4 +-
 .../Cache/Configuration/QueryField.cs           |   2 +-
 .../Apache.Ignite.Core/IgniteConfiguration.cs   |  11 +
 .../Apache.Ignite.Core/Impl/Binary/Binary.cs    |  10 +-
 .../Binary/BinarySurrogateTypeDescriptor.cs     |  15 +-
 .../Impl/Binary/BinaryUtils.cs                  | 117 +-----
 .../Impl/Binary/Marshaller.cs                   |  95 ++++-
 .../Impl/Binary/TypeNameParser.cs               | 384 +++++++++++++++++++
 .../Impl/Binary/TypeResolver.cs                 |  95 ++---
 .../Impl/CacheFieldsQueryProvider.cs            |  24 +-
 .../Impl/CacheQueryExpressionVisitor.cs         |   4 +-
 42 files changed, 1403 insertions(+), 346 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/core/src/main/java/org/apache/ignite/binary/BinaryBasicNameMapper.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/binary/BinaryBasicNameMapper.java b/modules/core/src/main/java/org/apache/ignite/binary/BinaryBasicNameMapper.java
index bc338b4..156716c 100644
--- a/modules/core/src/main/java/org/apache/ignite/binary/BinaryBasicNameMapper.java
+++ b/modules/core/src/main/java/org/apache/ignite/binary/BinaryBasicNameMapper.java
@@ -111,6 +111,9 @@ public class BinaryBasicNameMapper implements BinaryNameMapper {
         }
 
         if (idx < 0)
+            idx = clsName.lastIndexOf('+');   // .NET inner class.
+
+        if (idx < 0)
             idx = clsName.lastIndexOf('.');
 
         return idx >= 0 ? clsName.substring(idx + 1) : clsName;

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java
index 0ff78af..b0daf35 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java
@@ -101,13 +101,33 @@ public class PlatformDotNetConfigurationClosure extends PlatformAbstractConfigur
 
         igniteCfg.setPlatformConfiguration(dotNetCfg0);
 
+        // Set Ignite home so that marshaller context works.
+        String ggHome = igniteCfg.getIgniteHome();
+
+        if (ggHome != null)
+            U.setIgniteHome(ggHome);
+
+        // 4. Callback to .Net.
+        prepare(igniteCfg, dotNetCfg0);
+
+        // Make sure binary config is right.
+        setBinaryConfiguration(igniteCfg, dotNetCfg0);
+    }
+
+    /**
+     * Sets binary config.
+     *
+     * @param igniteCfg Ignite config.
+     * @param dotNetCfg Dotnet config.
+     */
+    private void setBinaryConfiguration(IgniteConfiguration igniteCfg, PlatformDotNetConfigurationEx dotNetCfg) {
         // Check marshaller.
         Marshaller marsh = igniteCfg.getMarshaller();
 
         if (marsh == null) {
             igniteCfg.setMarshaller(new BinaryMarshaller());
 
-            dotNetCfg0.warnings(Collections.singleton("Marshaller is automatically set to " +
+            dotNetCfg.warnings(Collections.singleton("Marshaller is automatically set to " +
                 BinaryMarshaller.class.getName() + " (other nodes must have the same marshaller type)."));
         }
         else if (!(marsh instanceof BinaryMarshaller))
@@ -115,50 +135,6 @@ public class PlatformDotNetConfigurationClosure extends PlatformAbstractConfigur
                 " can be used when running Apache Ignite.NET): " + marsh.getClass().getName());
 
         BinaryConfiguration bCfg = igniteCfg.getBinaryConfiguration();
-
-        if (bCfg == null) {
-            bCfg = new BinaryConfiguration();
-
-            bCfg.setNameMapper(new BinaryBasicNameMapper(true));
-            bCfg.setIdMapper(new BinaryBasicIdMapper(true));
-
-            igniteCfg.setBinaryConfiguration(bCfg);
-
-            dotNetCfg0.warnings(Collections.singleton("Binary configuration is automatically initiated, " +
-                "note that binary name mapper is set to " + bCfg.getNameMapper()
-                + " and binary ID mapper is set to " + bCfg.getIdMapper()
-                + " (other nodes must have the same binary name and ID mapper types)."));
-        }
-        else {
-            BinaryNameMapper nameMapper = bCfg.getNameMapper();
-
-            if (nameMapper == null) {
-                bCfg.setNameMapper(new BinaryBasicNameMapper(true));
-
-                dotNetCfg0.warnings(Collections.singleton("Binary name mapper is automatically set to " +
-                    bCfg.getNameMapper()
-                    + " (other nodes must have the same binary name mapper type)."));
-            }
-
-            BinaryIdMapper idMapper = bCfg.getIdMapper();
-
-            if (idMapper == null) {
-                bCfg.setIdMapper(new BinaryBasicIdMapper(true));
-
-                dotNetCfg0.warnings(Collections.singleton("Binary ID mapper is automatically set to " +
-                    bCfg.getIdMapper()
-                    + " (other nodes must have the same binary ID mapper type)."));
-            }
-        }
-
-        // Set Ignite home so that marshaller context works.
-        String ggHome = igniteCfg.getIgniteHome();
-
-        if (ggHome != null)
-            U.setIgniteHome(ggHome);
-
-        // 4. Callback to .Net.
-        prepare(igniteCfg, dotNetCfg0);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java
index 6a15b85..98ce61d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java
@@ -34,6 +34,7 @@ import java.util.Set;
 import javax.cache.configuration.Factory;
 import javax.cache.expiry.ExpiryPolicy;
 import org.apache.ignite.IgniteException;
+import org.apache.ignite.binary.BinaryBasicNameMapper;
 import org.apache.ignite.binary.BinaryRawReader;
 import org.apache.ignite.binary.BinaryRawWriter;
 import org.apache.ignite.cache.CacheAtomicityMode;
@@ -563,6 +564,11 @@ public class PlatformConfigurationUtils {
 
             if (in.readBoolean())  // compact footer is set
                 cfg.getBinaryConfiguration().setCompactFooter(in.readBoolean());
+
+            if (in.readBoolean()) {
+                // Simple name mapper.
+                cfg.getBinaryConfiguration().setNameMapper(new BinaryBasicNameMapper(true));
+            }
         }
 
         int attrCnt = in.readInt();
@@ -969,6 +975,8 @@ public class PlatformConfigurationUtils {
             w.writeBoolean(true);  // binary config exists
             w.writeBoolean(true);  // compact footer is set
             w.writeBoolean(bc.isCompactFooter());
+            w.writeBoolean(bc.getNameMapper() instanceof BinaryBasicNameMapper &&
+                    ((BinaryBasicNameMapper)(bc.getNameMapper())).isSimpleName());
         }
         else
             w.writeBoolean(false);

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
----------------------------------------------------------------------
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 118f8b8..f00cbd6 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
@@ -615,6 +615,11 @@ public class QueryUtils {
         if (parentEnd >= 0)
             clsName = clsName.substring(parentEnd + 1);
 
+        parentEnd = clsName.lastIndexOf('+');   // .NET parent
+
+        if (parentEnd >= 0)
+            clsName = clsName.substring(parentEnd + 1);
+
         return clsName;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
index 838a1e0..a13878a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
@@ -68,9 +68,12 @@
     <Reference Include="System.Xml.Linq" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Binary\BinaryBuilderSelfTestSimpleName.cs" />
     <Compile Include="Binary\BinaryEqualityComparerTest.cs" />
     <Compile Include="Binary\BinaryBuilderSelfTestDynamicRegistration.cs" />
+    <Compile Include="Binary\BinaryNameMapperTest.cs" />
     <Compile Include="Binary\BinaryReaderWriterTest.cs" />
+    <Compile Include="Binary\BinarySelfTestSimpleName.cs" />
     <Compile Include="Binary\IO\BinaryStreamsTest.cs" />
     <Compile Include="Binary\JavaBinaryInteropTest.cs" />
     <Compile Include="Binary\JavaTypeMappingTest.cs" />
@@ -80,6 +83,7 @@
     <Compile Include="Binary\Serializable\ObjectReferenceTests.cs" />
     <Compile Include="Binary\Serializable\PrimitivesTest.cs" />
     <Compile Include="Binary\Serializable\SqlDmlTest.cs" />
+    <Compile Include="Binary\TypeNameParserTest.cs" />
     <Compile Include="Binary\TypeResolverTest.cs" />
     <Compile Include="Cache\Affinity\AffinityKeyTest.cs" />
     <Compile Include="Cache\Affinity\AffinityTopologyVersionTest.cs" />
@@ -87,6 +91,9 @@
     <Compile Include="Cache\CacheResultTest.cs" />
     <Compile Include="Cache\Query\CacheDmlQueriesTest.cs" />
     <Compile Include="Cache\CacheAbstractTransactionalTest.cs" />
+    <Compile Include="Cache\Query\CacheDmlQueriesTestSimpleName.cs" />
+    <Compile Include="Cache\Query\CacheLinqTestSimpleName.cs" />
+    <Compile Include="Cache\Query\CacheQueriesTestSimpleName.cs" />
     <Compile Include="Cache\Store\CacheStoreAdapterTest.cs" />
     <Compile Include="Cache\Store\NamedNodeCacheStoreTest.cs" />
     <Compile Include="Collections\MultiValueDictionaryTest.cs" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
index c104e15..e8d0049 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
@@ -58,8 +58,8 @@ namespace Apache.Ignite.Core.Tests.Binary
                 {
                     TypeConfigurations = GetTypeConfigurations(),
                     IdMapper = new IdMapper(),
-                    NameMapper = new NameMapper(),
-                    CompactFooter = GetCompactFooter()
+                    NameMapper = new NameMapper(GetNameMapper()),
+                    CompactFooter = GetCompactFooter(),
                 }
             };
 
@@ -114,6 +114,22 @@ namespace Apache.Ignite.Core.Tests.Binary
         }
 
         /// <summary>
+        /// Gets the name mapper.
+        /// </summary>
+        protected virtual IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.FullNameInstance;
+        }
+
+        /// <summary>
+        /// Gets the name of the type.
+        /// </summary>
+        private string GetTypeName(Type type)
+        {
+            return GetNameMapper().GetTypeName(type.AssemblyQualifiedName);
+        }
+
+        /// <summary>
         /// Tear down routine.
         /// </summary>
         [TestFixtureTearDown]
@@ -249,7 +265,7 @@ namespace Apache.Ignite.Core.Tests.Binary
             // 4. Objects.
             IBinaryObject binObj = api.ToBinary<IBinaryObject>(new ToBinary(1));
 
-            Assert.AreEqual(typeof(ToBinary).Name, binObj.GetBinaryType().TypeName);
+            Assert.AreEqual(GetTypeName(typeof(ToBinary)), binObj.GetBinaryType().TypeName);
             Assert.AreEqual(1, binObj.GetBinaryType().Fields.Count);
             Assert.AreEqual("Val", binObj.GetBinaryType().Fields.First());
             Assert.AreEqual(BinaryTypeNames.TypeNameInt, binObj.GetBinaryType().GetFieldTypeName("Val"));
@@ -280,7 +296,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             IBinaryType meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(Remove).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(Remove)), meta.TypeName);
             Assert.AreEqual(0, meta.Fields.Count);
 
             // Populate it with field.
@@ -301,7 +317,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(Remove).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(Remove)), meta.TypeName);
             Assert.AreEqual(1, meta.Fields.Count);
             Assert.AreEqual("val", meta.Fields.First());
             Assert.AreEqual(BinaryTypeNames.TypeNameObject, meta.GetFieldTypeName("val"));
@@ -358,7 +374,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             IBinaryType meta = outerbinObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(BuilderInBuilderOuter).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(BuilderInBuilderOuter)), meta.TypeName);
             Assert.AreEqual(1, meta.Fields.Count);
             Assert.AreEqual("inner", meta.Fields.First());
             Assert.AreEqual(BinaryTypeNames.TypeNameObject, meta.GetFieldTypeName("inner"));
@@ -367,7 +383,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             meta = innerbinObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(BuilderInBuilderInner).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(BuilderInBuilderInner)), meta.TypeName);
             Assert.AreEqual(1, meta.Fields.Count);
             Assert.AreEqual("outer", meta.Fields.First());
             Assert.AreEqual(BinaryTypeNames.TypeNameObject, meta.GetFieldTypeName("outer"));
@@ -386,7 +402,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             meta = outerbinObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(BuilderInBuilderOuter).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(BuilderInBuilderOuter)), meta.TypeName);
             Assert.AreEqual(2, meta.Fields.Count);
             Assert.IsTrue(meta.Fields.Contains("inner"));
             Assert.IsTrue(meta.Fields.Contains("inner2"));
@@ -423,7 +439,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             IBinaryType meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(DecimalHolder).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(DecimalHolder)), meta.TypeName);
             Assert.AreEqual(2, meta.Fields.Count);
             Assert.IsTrue(meta.Fields.Contains("val"));
             Assert.IsTrue(meta.Fields.Contains("valArr"));
@@ -456,7 +472,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             IBinaryType meta = binCol.GetBinaryType();
 
-            Assert.AreEqual(typeof(BuilderCollection).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(BuilderCollection)), meta.TypeName);
             Assert.AreEqual(1, meta.Fields.Count);
             Assert.AreEqual("col", meta.Fields.First());
             Assert.AreEqual(BinaryTypeNames.TypeNameCollection, meta.GetFieldTypeName("col"));
@@ -469,7 +485,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             meta = binItem.GetBinaryType();
 
-            Assert.AreEqual(typeof(BuilderCollectionItem).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(BuilderCollectionItem)), meta.TypeName);
             Assert.AreEqual(1, meta.Fields.Count);
             Assert.AreEqual("val", meta.Fields.First());
             Assert.AreEqual(BinaryTypeNames.TypeNameInt, meta.GetFieldTypeName("val"));
@@ -549,7 +565,7 @@ namespace Apache.Ignite.Core.Tests.Binary
             IBinaryType meta = binObj.GetBinaryType();
 
             Assert.IsNotNull(meta);
-            Assert.AreEqual(typeof(Empty).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(Empty)), meta.TypeName);
             Assert.AreEqual(0, meta.Fields.Count);
 
             Empty obj = binObj.Deserialize<Empty>();
@@ -690,11 +706,11 @@ namespace Apache.Ignite.Core.Tests.Binary
         /// <summary>
         /// Checks the primitive fields values.
         /// </summary>
-        private static void CheckPrimitiveFields1(IBinaryObject binObj)
+        private void CheckPrimitiveFields1(IBinaryObject binObj)
         {
             IBinaryType meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(Primitives).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(Primitives)), meta.TypeName);
 
             Assert.AreEqual(9, meta.Fields.Count);
 
@@ -842,11 +858,11 @@ namespace Apache.Ignite.Core.Tests.Binary
         /// <summary>
         /// Checks the primitive array fields.
         /// </summary>
-        private static void CheckPrimitiveArrayFields1(IBinaryObject binObj)
+        private void CheckPrimitiveArrayFields1(IBinaryObject binObj)
         {
             IBinaryType meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(PrimitiveArrays).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(PrimitiveArrays)), meta.TypeName);
 
             Assert.AreEqual(9, meta.Fields.Count);
 
@@ -1009,7 +1025,7 @@ namespace Apache.Ignite.Core.Tests.Binary
         {
             IBinaryType meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(StringDateGuidEnum).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(StringDateGuidEnum)), meta.TypeName);
 
             Assert.AreEqual(10, meta.Fields.Count);
 
@@ -1139,7 +1155,7 @@ namespace Apache.Ignite.Core.Tests.Binary
             var meta = binEnum.GetBinaryType();
 
             Assert.IsTrue(meta.IsEnum);
-            Assert.AreEqual(typeof (TestEnumRegistered).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof (TestEnumRegistered)), meta.TypeName);
             Assert.AreEqual(0, meta.Fields.Count);
         }
 
@@ -1157,7 +1173,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             IBinaryType meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(CompositeArray).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(CompositeArray)), meta.TypeName);
             Assert.AreEqual(1, meta.Fields.Count);
             Assert.AreEqual(BinaryTypeNames.TypeNameArrayObject, meta.GetFieldTypeName("inArr"));
 
@@ -1254,7 +1270,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(CompositeArray).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(CompositeArray)), meta.TypeName);
             Assert.AreEqual(2, meta.Fields.Count);
             Assert.AreEqual(BinaryTypeNames.TypeNameArrayObject, meta.GetFieldTypeName("inArr"));
             Assert.AreEqual(BinaryTypeNames.TypeNameArrayObject, meta.GetFieldTypeName("outArr"));
@@ -1311,7 +1327,7 @@ namespace Apache.Ignite.Core.Tests.Binary
             // 1. Check meta.
             IBinaryType meta = binObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(CompositeContainer).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(CompositeContainer)), meta.TypeName);
 
             Assert.AreEqual(2, meta.Fields.Count);
             Assert.AreEqual(BinaryTypeNames.TypeNameCollection, meta.GetFieldTypeName("col"));
@@ -1378,7 +1394,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             IBinaryType meta = outerbinObj.GetBinaryType();
 
-            Assert.AreEqual(typeof(NestedOuter).Name, meta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(NestedOuter)), meta.TypeName);
             Assert.AreEqual(1, meta.Fields.Count);
             Assert.AreEqual(BinaryTypeNames.TypeNameObject, meta.GetFieldTypeName("inner1"));
 
@@ -1386,7 +1402,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             IBinaryType innerMeta = innerbinObj1.GetBinaryType();
 
-            Assert.AreEqual(typeof(NestedInner).Name, innerMeta.TypeName);
+            Assert.AreEqual(GetTypeName(typeof(NestedInner)), innerMeta.TypeName);
             Assert.AreEqual(1, innerMeta.Fields.Count);
             Assert.AreEqual(BinaryTypeNames.TypeNameInt, innerMeta.GetFieldTypeName("Val"));
 
@@ -1605,10 +1621,12 @@ namespace Apache.Ignite.Core.Tests.Binary
 
             binary.ToBinary<IBinaryObject>(new DecimalHolder());
 
+            var typeName = GetTypeName(typeof(DecimalHolder));
+
             // All meta
             var allMetas = binary.GetBinaryTypes();
 
-            var decimalMeta = allMetas.Single(x => x.TypeName == "DecimalHolder");
+            var decimalMeta = allMetas.Single(x => x.TypeName == typeName);
 
             Assert.AreEqual(new[] {"val", "valArr"}, decimalMeta.Fields);
 
@@ -1618,12 +1636,12 @@ namespace Apache.Ignite.Core.Tests.Binary
             Assert.AreEqual(new[] {"val", "valArr"}, decimalMeta.Fields);
             
             // By type id
-            decimalMeta = binary.GetBinaryType(binary.GetTypeId("DecimalHolder"));
+            decimalMeta = binary.GetBinaryType(binary.GetTypeId(typeName));
 
             Assert.AreEqual(new[] {"val", "valArr"}, decimalMeta.Fields);
 
             // By type name
-            decimalMeta = binary.GetBinaryType("DecimalHolder");
+            decimalMeta = binary.GetBinaryType(typeName);
 
             Assert.AreEqual(new[] {"val", "valArr"}, decimalMeta.Fields);
         }
@@ -1638,7 +1656,7 @@ namespace Apache.Ignite.Core.Tests.Binary
             var binEnums = new[]
             {
                 binary.BuildEnum(typeof (TestEnumRegistered), val),
-                binary.BuildEnum(typeof (TestEnumRegistered).Name, val)
+                binary.BuildEnum(GetTypeName(typeof (TestEnumRegistered)), val)
             };
 
             foreach (var binEnum in binEnums)
@@ -2086,18 +2104,30 @@ namespace Apache.Ignite.Core.Tests.Binary
     public class NameMapper : IBinaryNameMapper
     {
         /** */
+        private readonly IBinaryNameMapper _baseMapper;
+
+        /** */
         public const string TestTypeName = "NameMapperTestType";
 
         /** */
         public const string TestFieldName = "NameMapperTestField";
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="NameMapper" /> class.
+        /// </summary>
+        /// <param name="baseMapper">The base mapper.</param>
+        public NameMapper(IBinaryNameMapper baseMapper)
+        {
+            _baseMapper = baseMapper;
+        }
+
         /** <inheritdoc /> */
         public string GetTypeName(string name)
         {
-            if (name == TestTypeName)
-                return name + "_";
+            if (name == typeof(NameMapperTestType).AssemblyQualifiedName)
+                return TestTypeName + "_";
 
-            return name;
+            return _baseMapper.GetTypeName(name);
         }
 
         /** <inheritdoc /> */

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs
new file mode 100644
index 0000000..918f82d
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Binary
+{
+    using Apache.Ignite.Core.Binary;
+
+    /// <summary>
+    /// Builder test with simple names.
+    /// </summary>
+    public class BinaryBuilderSelfTestSimpleName : BinaryBuilderSelfTest
+    {
+        /** <inheritdoc /> */
+        protected override IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.SimpleNameInstance;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
index 76ef999..bda3438 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
@@ -141,6 +141,9 @@ namespace Apache.Ignite.Core.Tests.Binary
                 BinaryConfiguration = new BinaryConfiguration(
                     typeof (PlatformComputeBinarizable),
                     typeof (PlatformComputeNetBinarizable))
+                {
+                    NameMapper = BinaryBasicNameMapper.SimpleNameInstance
+                }
             };
         }
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs
index 24f5e7c..687b1f5 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryDynamicRegistrationTest.cs
@@ -293,7 +293,15 @@ namespace Apache.Ignite.Core.Tests.Binary
         [Test]
         public void TestJavaInterop()
         {
-            using (var ignite = Ignition.Start(TestUtils.GetTestConfiguration()))
+            var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                BinaryConfiguration = new BinaryConfiguration
+                {
+                    NameMapper = BinaryBasicNameMapper.SimpleNameInstance
+                }
+            };
+
+            using (var ignite = Ignition.Start(cfg))
             {
                 var cacheCfg = new CacheConfiguration(null, new QueryEntity(typeof(PlatformComputeBinarizable))
                 {

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryNameMapperTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryNameMapperTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryNameMapperTest.cs
new file mode 100644
index 0000000..b3ace97
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryNameMapperTest.cs
@@ -0,0 +1,108 @@
+\ufeff/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Binary
+{
+    using System.Collections.Generic;
+    using Apache.Ignite.Core.Binary;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Tests binary name mapper.
+    /// </summary>
+    public class BinaryNameMapperTest
+    {
+        /// <summary>
+        /// Tests full name mode.
+        /// </summary>
+        [Test]
+        public void TestFullName()
+        {
+            var mapper = new BinaryBasicNameMapper();
+            Assert.IsFalse(mapper.IsSimpleName);
+
+            // Simple type.
+            Assert.AreEqual("System.Int32", mapper.GetTypeName(typeof(int).AssemblyQualifiedName));
+            Assert.AreEqual("System.Int32", mapper.GetTypeName(typeof(int).FullName));
+
+            // Array.
+            Assert.AreEqual("System.String[]", mapper.GetTypeName(typeof(string[]).AssemblyQualifiedName));
+            Assert.AreEqual("System.String[]", mapper.GetTypeName(typeof(string[]).FullName));
+
+            // Generics.
+            Assert.AreEqual("System.Collections.Generic.List`1[[System.String]]", 
+                mapper.GetTypeName(typeof(List<string>).AssemblyQualifiedName));
+            
+            Assert.AreEqual("System.Collections.Generic.Dictionary`2[[System.Int32],[System.String]]", 
+                mapper.GetTypeName(typeof(Dictionary<int, string>).AssemblyQualifiedName));
+            
+            Assert.AreEqual("Apache.Ignite.Core.Tests.Binary.BinaryNameMapperTest+Bar`1[[Apache.Ignite.Core." +
+                            "Tests.Binary.BinaryNameMapperTest+Foo]]", 
+                            mapper.GetTypeName(typeof(Bar<Foo>).AssemblyQualifiedName));
+
+            Assert.AreEqual("Apache.Ignite.Core.Tests.Binary.BinaryNameMapperTest+Bar`1[[Apache.Ignite.Core.Tests" +
+                            ".Binary.BinaryNameMapperTest+Foo]][]", 
+                            mapper.GetTypeName(typeof(Bar<Foo>[]).AssemblyQualifiedName));
+            
+            Assert.AreEqual("Apache.Ignite.Core.Tests.Binary.BinaryNameMapperTest+Bar`1[[Apache.Ignite.Core.Tests." +
+                            "Binary.BinaryNameMapperTest+Foo[]]][]", 
+                            mapper.GetTypeName(typeof(Bar<Foo[]>[]).AssemblyQualifiedName));
+        }
+
+        /// <summary>
+        /// Tests simple name mode.
+        /// </summary>
+        [Test]
+        public void TestSimpleName()
+        {
+            var mapper = new BinaryBasicNameMapper {IsSimpleName = true};
+                        
+            // Simple type.
+            Assert.AreEqual("Int32", mapper.GetTypeName(typeof(int).AssemblyQualifiedName));
+            Assert.AreEqual("Int32", mapper.GetTypeName(typeof(int).FullName));
+
+            // Array.
+            Assert.AreEqual("String[]", mapper.GetTypeName(typeof(string[]).AssemblyQualifiedName));
+            Assert.AreEqual("String[]", mapper.GetTypeName(typeof(string[]).FullName));
+
+            // Generics.
+            Assert.AreEqual("List`1[[String]]", mapper.GetTypeName(typeof(List<string>).AssemblyQualifiedName));
+            Assert.AreEqual("Dictionary`2[[Int32],[String]]", 
+                mapper.GetTypeName(typeof(Dictionary<int, string>).AssemblyQualifiedName));
+            Assert.AreEqual("Bar`1[[Foo]]", mapper.GetTypeName(typeof(Bar<Foo>).AssemblyQualifiedName));
+            Assert.AreEqual("Bar`1[[Foo]][]", mapper.GetTypeName(typeof(Bar<Foo>[]).AssemblyQualifiedName));
+            Assert.AreEqual("Bar`1[[Foo[]]][]", mapper.GetTypeName(typeof(Bar<Foo[]>[]).AssemblyQualifiedName));
+        }
+
+        /// <summary>
+        /// Nested class.
+        /// </summary>
+        private class Foo
+        {
+            // No-op.
+        }
+
+        /// <summary>
+        /// Nested generic class.
+        /// </summary>
+        // ReSharper disable once UnusedTypeParameter
+        private class Bar<T>
+        {
+            // No-op.
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs
index bde8166..bdc0d65 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs
@@ -63,17 +63,28 @@ namespace Apache.Ignite.Core.Tests.Binary
         [TestFixtureSetUp]
         public void BeforeTest()
         {
-            _marsh = new Marshaller(new BinaryConfiguration{CompactFooter = GetCompactFooter()});
+            _marsh = new Marshaller(new BinaryConfiguration
+            {
+                CompactFooter = GetCompactFooter(),
+                NameMapper = GetNameMapper()
+            });
         }
 
         /// <summary>
         /// Gets the binary configuration.
         /// </summary>
-        /// <returns></returns>
         protected virtual bool GetCompactFooter()
         {
             return true;
         }
+
+        /// <summary>
+        /// Gets the name mapper.
+        /// </summary>
+        protected virtual IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.FullNameInstance;
+        }
         
         /**
          * <summary>Check write of primitive boolean.</summary>
@@ -1550,7 +1561,10 @@ namespace Apache.Ignite.Core.Tests.Binary
         [Test]
         public void TestBinaryConfigurationValidation()
         {
-            var cfg = new BinaryConfiguration(typeof (PropertyType)) {Types = new[] {"PropertyType"}};
+            var cfg = new BinaryConfiguration(typeof (PropertyType))
+            {
+                Types = new[] {typeof(PropertyType).AssemblyQualifiedName}
+            };
 
             // ReSharper disable once ObjectCreationAsStatement
             Assert.Throws<BinaryObjectException>(() => new Marshaller(cfg));

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTestSimpleName.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTestSimpleName.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTestSimpleName.cs
new file mode 100644
index 0000000..96ccb0b
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTestSimpleName.cs
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Binary
+{
+    using Apache.Ignite.Core.Binary;
+
+    /// <summary>
+    /// Test with simple name mapper.
+    /// </summary>
+    public class BinarySelfTestSimpleName : BinarySelfTest
+    {
+        /** <inheritdoc /> */
+        protected override IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.SimpleNameInstance;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs
index b59247e..8495a30 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/Serializable/SqlDmlTest.cs
@@ -54,6 +54,9 @@ namespace Apache.Ignite.Core.Tests.Binary.Serializable
             var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 BinaryConfiguration = new BinaryConfiguration(typeof(SimpleSerializable))
+                {
+                    NameMapper = BinaryBasicNameMapper.SimpleNameInstance
+                }
             };
 
             _ignite = Ignition.Start(cfg);

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeNameParserTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeNameParserTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeNameParserTest.cs
new file mode 100644
index 0000000..f3394a3
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeNameParserTest.cs
@@ -0,0 +1,232 @@
+\ufeff/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ReSharper disable UnusedTypeParameter
+namespace Apache.Ignite.Core.Tests.Binary
+{
+    using System;
+    using System.Collections;
+    using System.Collections.Generic;
+    using System.Linq;
+    using Apache.Ignite.Core.Common;
+    using Apache.Ignite.Core.Impl.Binary;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Tests the type name parser.
+    /// </summary>
+    public class TypeNameParserTest
+    {
+        /// <summary>
+        /// Tests simple types.
+        /// </summary>
+        [Test]
+        public void TestSimpleTypes()
+        {
+            // One letter.
+            var res = TypeNameParser.Parse("x");
+            Assert.AreEqual("x", res.GetFullName());
+            Assert.AreEqual("x", res.GetName());
+            Assert.AreEqual(0, res.NameStart);
+            Assert.AreEqual(0, res.NameEnd);
+            Assert.AreEqual(-1, res.AssemblyStart);
+            Assert.AreEqual(-1, res.AssemblyEnd);
+            Assert.IsNull(res.Generics);
+
+            // Without assembly.
+            res = TypeNameParser.Parse("System.Int");
+
+            Assert.AreEqual(7, res.NameStart);
+            Assert.AreEqual(9, res.NameEnd);
+            Assert.IsNull(res.Generics);
+            Assert.AreEqual(-1, res.AssemblyStart);
+
+            // With assembly.
+            res = TypeNameParser.Parse("System.Int, myasm, Ver=1");
+
+            Assert.AreEqual(7, res.NameStart);
+            Assert.AreEqual(9, res.NameEnd);
+            Assert.IsNull(res.Generics);
+            Assert.AreEqual(12, res.AssemblyStart);
+
+            // Real types.
+            CheckType(GetType());
+            CheckType(typeof(string));
+            CheckType(typeof(IDictionary));
+
+            // Nested types.
+            CheckType(typeof(Nested));
+            CheckType(typeof(Nested.Nested2));
+        }
+
+        /// <summary>
+        /// Tests generic types.
+        /// </summary>
+        [Test]
+        public void TestGenericTypes()
+        {
+            // Custom strings.
+            var res = TypeNameParser.Parse("List`1[[Int]]");
+            Assert.AreEqual("List`1", res.GetName());
+            Assert.AreEqual("List`1", res.GetFullName());
+            Assert.AreEqual("Int", res.Generics.Single().GetName());
+            Assert.AreEqual("Int", res.Generics.Single().GetFullName());
+
+            // One arg.
+            res = TypeNameParser.Parse(typeof(List<int>).AssemblyQualifiedName);
+            Assert.AreEqual("List`1", res.GetName());
+            Assert.AreEqual("System.Collections.Generic.List`1", res.GetFullName());
+            Assert.IsTrue(res.GetAssemblyName().StartsWith("mscorlib,"));
+
+            Assert.AreEqual(1, res.Generics.Count);
+            var gen = res.Generics.Single();
+            Assert.AreEqual("Int32", gen.GetName());
+            Assert.AreEqual("System.Int32", gen.GetFullName());
+            Assert.IsTrue(gen.GetAssemblyName().StartsWith("mscorlib,"));
+
+            // Two args.
+            res = TypeNameParser.Parse(typeof(Dictionary<int, string>).AssemblyQualifiedName);
+            Assert.AreEqual("Dictionary`2", res.GetName());
+            Assert.AreEqual("System.Collections.Generic.Dictionary`2", res.GetFullName());
+            Assert.IsTrue(res.GetAssemblyName().StartsWith("mscorlib,"));
+
+            Assert.AreEqual(2, res.Generics.Count);
+
+            gen = res.Generics.First();
+            Assert.AreEqual("Int32", gen.GetName());
+            Assert.AreEqual("System.Int32", gen.GetFullName());
+            Assert.IsTrue(gen.GetAssemblyName().StartsWith("mscorlib,"));
+
+            gen = res.Generics.Last();
+            Assert.AreEqual("String", gen.GetName());
+            Assert.AreEqual("System.String", gen.GetFullName());
+            Assert.IsTrue(gen.GetAssemblyName().StartsWith("mscorlib,"));
+
+            // Nested args.
+            res = TypeNameParser.Parse(typeof(Dictionary<int, List<string>>).FullName);
+
+            Assert.AreEqual("Dictionary`2", res.GetName());
+            Assert.AreEqual("System.Collections.Generic.Dictionary`2", res.GetFullName());
+            Assert.IsNull(res.GetAssemblyName());
+
+            Assert.AreEqual(2, res.Generics.Count);
+
+            gen = res.Generics.Last();
+            Assert.AreEqual("List`1", gen.GetName());
+            Assert.AreEqual("System.Collections.Generic.List`1", gen.GetFullName());
+            Assert.IsTrue(gen.GetAssemblyName().StartsWith("mscorlib,"));
+            Assert.AreEqual(1, gen.Generics.Count);
+
+            gen = gen.Generics.Single();
+            Assert.AreEqual("String", gen.GetName());
+            Assert.AreEqual("System.String", gen.GetFullName());
+            Assert.IsTrue(gen.GetAssemblyName().StartsWith("mscorlib,"));
+
+            // Nested class.
+            res = TypeNameParser.Parse(typeof(NestedGeneric<int>).FullName);
+
+            Assert.AreEqual("NestedGeneric`1", res.GetName());
+            Assert.AreEqual("Apache.Ignite.Core.Tests.Binary.TypeNameParserTest+NestedGeneric`1", res.GetFullName());
+
+            gen = res.Generics.Single();
+            Assert.AreEqual("Int32", gen.GetName());
+            Assert.AreEqual("System.Int32", gen.GetFullName());
+
+            res = TypeNameParser.Parse(typeof(NestedGeneric<int>.NestedGeneric2<string>).AssemblyQualifiedName);
+            
+            Assert.AreEqual("NestedGeneric2`1", res.GetName());
+            Assert.AreEqual("Apache.Ignite.Core.Tests.Binary.TypeNameParserTest+NestedGeneric`1+NestedGeneric2`1", 
+                res.GetFullName());
+
+            Assert.AreEqual(2, res.Generics.Count);
+            Assert.AreEqual("Int32", res.Generics.First().GetName());
+            Assert.AreEqual("String", res.Generics.Last().GetName());
+        }
+
+        /// <summary>
+        /// Tests arrays.
+        /// </summary>
+        [Test]
+        public void TestArrays()
+        {
+            CheckType(typeof(int[]));
+            CheckType(typeof(int[,]));
+            CheckType(typeof(int[][]));
+            
+            CheckType(typeof(List<int>[]));
+            CheckType(typeof(List<int>[,]));
+            CheckType(typeof(List<int>[][]));
+        }
+
+        /// <summary>
+        /// Tests invalid type names.
+        /// </summary>
+        [Test]
+        public void TestInvalidTypes()
+        {
+            Assert.Throws<ArgumentException>(() => TypeNameParser.Parse(null));
+            Assert.Throws<ArgumentException>(() => TypeNameParser.Parse(""));
+
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x["));
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x[[]"));
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x`["));
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x`]"));
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x`[ ]"));
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x,"));
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x`x"));
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x`2[x"));
+            Assert.Throws<IgniteException>(() => TypeNameParser.Parse("x`2xx"));
+        }
+
+        /// <summary>
+        /// Checks the type.
+        /// </summary>
+        private static void CheckType(Type type)
+        {
+            var name = type.AssemblyQualifiedName;
+
+            Assert.IsNotNull(name);
+
+            var res = TypeNameParser.Parse(name);
+
+            Assert.AreEqual(type.Name, res.GetName() + res.GetArray());
+
+            if (res.Generics == null)
+            {
+                Assert.AreEqual(type.FullName, res.GetFullName() + res.GetArray());
+            }
+
+            Assert.AreEqual(type.FullName.Length + 2, res.AssemblyStart);
+        }
+
+        private class Nested
+        {
+            public class Nested2
+            {
+                // No-op.
+            }
+        }
+
+        private class NestedGeneric<T>
+        {
+            public class NestedGeneric2<T2>
+            {
+                // No-op.
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
index 6afeff4..d79844e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
@@ -39,12 +39,23 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
             var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 BinaryConfiguration = new BinaryConfiguration(typeof(Foo), typeof(Key), typeof(Key2))
+                {
+                    NameMapper = GetNameMapper()
+                }
             };
 
             Ignition.Start(cfg);
         }
 
         /// <summary>
+        /// Gets the name mapper.
+        /// </summary>
+        protected virtual IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.FullNameInstance;
+        }
+
+        /// <summary>
         /// Tears down test fixture.
         /// </summary>
         [TestFixtureTearDown]

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTestSimpleName.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTestSimpleName.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTestSimpleName.cs
new file mode 100644
index 0000000..467d78f
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTestSimpleName.cs
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache.Query
+{
+    using Apache.Ignite.Core.Binary;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Test with simple name mapper.
+    /// </summary>
+    [TestFixture]
+    public class CacheDmlQueriesTestSimpleName : CacheDmlQueriesTest
+    {
+        /** <inheritdoc /> */
+        protected override IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.SimpleNameInstance;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs
index 876b0be..b2213d8 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs
@@ -119,17 +119,28 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
         /// <summary>
         /// Gets the configuration.
         /// </summary>
-        private static IgniteConfiguration GetConfig(string gridName = null)
+        private IgniteConfiguration GetConfig(string gridName = null)
         {
             return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 BinaryConfiguration = new BinaryConfiguration(typeof(Person),
-                    typeof(Organization), typeof(Address), typeof(Role), typeof(RoleKey), typeof(Numerics)),
+                    typeof(Organization), typeof(Address), typeof(Role), typeof(RoleKey), typeof(Numerics))
+                {
+                    NameMapper = GetNameMapper()
+                },
                 IgniteInstanceName = gridName
             };
         }
 
         /// <summary>
+        /// Gets the name mapper.
+        /// </summary>
+        protected virtual IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.FullNameInstance;
+        }
+
+        /// <summary>
         /// Fixture tear down.
         /// </summary>
         [TestFixtureTearDown]

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTestSimpleName.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTestSimpleName.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTestSimpleName.cs
new file mode 100644
index 0000000..9743e60
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTestSimpleName.cs
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache.Query
+{
+    using Apache.Ignite.Core.Binary;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// LINQ test with simple name mapper.
+    /// </summary>
+    [TestFixture]
+    public class CacheLinqTestSimpleName : CacheLinqTest
+    {
+        /** <inheritdoc /> */
+        protected override IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.SimpleNameInstance;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs
index 8157a56..e25ddc0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesCodeConfigurationTest.cs
@@ -40,10 +40,8 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
         [Test]
         public void TestQueryEntityConfiguration()
         {
-            var cfg = new IgniteConfiguration
+            var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath(),
                 BinaryConfiguration = new BinaryConfiguration(typeof (QueryPerson)),
                 CacheConfiguration = new[]
                 {
@@ -132,12 +130,10 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
         [Test]
         public void TestAttributeConfigurationQuery()
         {
-            var cfg = new IgniteConfiguration
+            var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath(),
                 BinaryConfiguration = new BinaryConfiguration(
-                    typeof (AttributeQueryPerson), typeof (AttributeQueryAddress)),
+                    typeof (AttributeQueryPerson), typeof (AttributeQueryAddress))
             };
 
             using (var ignite = Ignition.Start(cfg))

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs
index d6705d4..5cbec0d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs
@@ -35,7 +35,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
     /// <summary>
     /// Queries tests.
     /// </summary>
-    public sealed class CacheQueriesTest
+    public class CacheQueriesTest
     {
         /** Grid count. */
         private const int GridCnt = 2;
@@ -66,7 +66,8 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
                         new BinaryTypeConfiguration(typeof (QueryPerson)),
                         new BinaryTypeConfiguration(typeof (BinarizableScanQueryFilter<QueryPerson>)),
                         new BinaryTypeConfiguration(typeof (BinarizableScanQueryFilter<BinaryObject>))
-                    }
+                    },
+                    NameMapper = GetNameMapper()
                 },
                 JvmClasspath = TestUtils.CreateTestClasspath(),
                 JvmOptions = TestUtils.TestJavaOptions(),
@@ -80,6 +81,14 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
                 Ignition.Start(cfg);
             }
         }
+        
+        /// <summary>
+        /// Gets the name mapper.
+        /// </summary>
+        protected virtual IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.FullNameInstance;
+        }
 
         /// <summary>
         /// 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTestSimpleName.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTestSimpleName.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTestSimpleName.cs
new file mode 100644
index 0000000..c8924bb
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTestSimpleName.cs
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache.Query
+{
+    using Apache.Ignite.Core.Binary;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Test with simple name mapper.
+    /// </summary>
+    [TestFixture]
+    public class CacheQueriesTestSimpleName : CacheQueriesTest
+    {
+        /** <inheritdoc /> */
+        protected override IBinaryNameMapper GetNameMapper()
+        {
+            return BinaryBasicNameMapper.SimpleNameInstance;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
index 57f3d00..a6b68bb 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
@@ -91,27 +91,21 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
         [TestFixtureSetUp]
         public void SetUp()
         {
-            GC.Collect();
-            TestUtils.JvmDebug = true;
-
-            IgniteConfiguration cfg = new IgniteConfiguration();
-
-            BinaryConfiguration portCfg = new BinaryConfiguration();
-
-            ICollection<BinaryTypeConfiguration> portTypeCfgs = new List<BinaryTypeConfiguration>();
-
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(BinarizableEntry)));
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(BinarizableFilter)));
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(KeepBinaryFilter)));
-
-            portCfg.TypeConfigurations = portTypeCfgs;
-
-            cfg.BinaryConfiguration = portCfg;
-            cfg.JvmClasspath = TestUtils.CreateTestClasspath();
-            cfg.JvmOptions = TestUtils.TestJavaOptions();
-            cfg.SpringConfigUrl = "config\\cache-query-continuous.xml";
+            var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                BinaryConfiguration = new BinaryConfiguration
+                {
+                    TypeConfigurations = new List<BinaryTypeConfiguration>
+                    {
+                        new BinaryTypeConfiguration(typeof(BinarizableEntry)),
+                        new BinaryTypeConfiguration(typeof(BinarizableFilter)),
+                        new BinaryTypeConfiguration(typeof(KeepBinaryFilter))
+                    }
+                },
+                SpringConfigUrl = "config\\cache-query-continuous.xml",
+                IgniteInstanceName = "grid-1"
+            };
 
-            cfg.IgniteInstanceName = "grid-1";
             grid1 = Ignition.Start(cfg);
             cache1 = grid1.GetCache<int, BinarizableEntry>(cacheName);
 
@@ -1179,7 +1173,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
 
                     IBinaryType meta = val.GetBinaryType();
 
-                    Assert.AreEqual(typeof(BinarizableEntry).Name, meta.TypeName);
+                    Assert.AreEqual(typeof(BinarizableEntry).FullName, meta.TypeName);
                 }
 
                 countDown.Signal();

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
index b62a0ec..309c77e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
@@ -23,9 +23,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
     using System.Linq;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Cache;
-    using Apache.Ignite.Core.Cache.Configuration;
     using Apache.Ignite.Core.Cache.Store;
-    using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Impl;
     using NUnit.Framework;
 
@@ -156,7 +154,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
 
             Assert.NotNull(meta);
 
-            Assert.AreEqual("Value", meta.TypeName);
+            Assert.AreEqual("Apache.Ignite.Core.Tests.Cache.Store.Value", meta.TypeName);
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
index b5b6c05..316e5d0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
@@ -1315,7 +1315,8 @@ namespace Apache.Ignite.Core.Tests.Compute
                         new BinaryTypeConfiguration(JavaBinaryCls),
                         new BinaryTypeConfiguration(typeof(PlatformComputeEnum)),
                         new BinaryTypeConfiguration(typeof(InteropComputeEnumFieldTest))
-                    }
+                    },
+                    NameMapper = BinaryBasicNameMapper.SimpleNameInstance
                 },
                 SpringConfigUrl = path
             };

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Compute/compute-grid2.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Compute/compute-grid2.xml b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Compute/compute-grid2.xml
index d7f86f4..3774b51 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Compute/compute-grid2.xml
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Compute/compute-grid2.xml
@@ -62,16 +62,6 @@
                         </bean>
                     </list>
                 </property>
-                <property name="idMapper">
-                    <bean class="org.apache.ignite.binary.BinaryBasicIdMapper">
-                        <constructor-arg value="true"/>
-                    </bean>
-                </property>
-                <property name="nameMapper">
-                    <bean class="org.apache.ignite.binary.BinaryBasicNameMapper">
-                        <constructor-arg value="true"/>
-                    </bean>
-                </property>
             </bean>
         </property>
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-binarizables.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-binarizables.xml b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-binarizables.xml
index 2804131..97ec97e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-binarizables.xml
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-binarizables.xml
@@ -35,14 +35,14 @@
                     <bean class="org.apache.ignite.platform.dotnet.PlatformDotNetBinaryConfiguration">
                         <property name="types">
                             <list>
-                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Int64]</value>
-                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Type]</value>
-                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable[Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Int64]]</value>
-                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Collections.Generic.List[System.Tuple[System.Int64,System.String]]]</value>
-                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Int64,System.String]</value>
-                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Int64,Apache.Ignite.Core.Tests.TestGenericBinarizable[System.String]]</value>
-                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Int64,System.String,System.Type]</value>
-                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Int64,System.String,Apache.Ignite.Core.Tests.TestGenericBinarizable[System.Int64,System.String,System.Type]]</value>
+                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable`1[[System.Int64]]</value>
+                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable`1[[System.Type]]</value>
+                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable`1[[Apache.Ignite.Core.Tests.TestGenericBinarizable`1[[System.Int64]]]]</value>
+                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable`1[[System.Collections.Generic.List`1[[System.Tuple`2[[System.Int64],[System.String]]]]]]</value>
+                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable`2[[System.Int64],[System.String]]</value>
+                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable`2[[System.Int64],[Apache.Ignite.Core.Tests.TestGenericBinarizable`1[[System.String]]]]</value>
+                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable`3[[System.Int64],[System.String],[System.Type]]</value>
+                                <value>Apache.Ignite.Core.Tests.TestGenericBinarizable`3[[System.Int64],[System.String],[Apache.Ignite.Core.Tests.TestGenericBinarizable`2[[System.Int64,System.String],[System.Type]]]]</value>
                             </list>
                         </property>
                     </bean>

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query-continuous.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query-continuous.xml b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query-continuous.xml
index 5fc973b..1bea206 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query-continuous.xml
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query-continuous.xml
@@ -42,7 +42,7 @@
                     <property name="queryEntities">
                         <list>
                             <bean class="org.apache.ignite.cache.QueryEntity">
-                                <property name="valueType" value="BinarizableEntry"/>
+                                <property name="valueType" value="Apache.Ignite.Core.Tests.Cache.Query.Continuous.ContinuousQueryAbstractTest+BinarizableEntry"/>
                                 <property name="fields">
                                     <map>
                                         <entry key="val" value="java.lang.Integer"/>
@@ -82,7 +82,7 @@
                     <property name="queryEntities">
                         <list>
                             <bean class="org.apache.ignite.cache.QueryEntity">
-                                <property name="valueType" value="BinarizableEntry"/>
+                                <property name="valueType" value="Apache.Ignite.Core.Tests.Cache.Query.Continuous.ContinuousQueryAbstractTest+BinarizableEntry"/>
                                 <property name="fields">
                                     <map>
                                         <entry key="val" value="java.lang.Integer"/>
@@ -121,7 +121,7 @@
                     <property name="queryEntities">
                         <list>
                             <bean class="org.apache.ignite.cache.QueryEntity">
-                                <property name="valueType" value="BinarizableEntry"/>
+                                <property name="valueType" value="Apache.Ignite.Core.Tests.Cache.Query.Continuous.ContinuousQueryAbstractTest+BinarizableEntry"/>
                                 <property name="fields">
                                     <map>
                                         <entry key="val" value="java.lang.Integer"/>
@@ -160,7 +160,7 @@
                     <property name="queryEntities">
                         <list>
                             <bean class="org.apache.ignite.cache.QueryEntity">
-                                <property name="valueType" value="BinarizableEntry"/>
+                                <property name="valueType" value="Apache.Ignite.Core.Tests.Cache.Query.Continuous.ContinuousQueryAbstractTest+BinarizableEntry"/>
                                 <property name="fields">
                                     <map>
                                         <entry key="val" value="java.lang.Integer"/>

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query.xml b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query.xml
index dd5d4d9..4f92c72 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query.xml
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/cache-query.xml
@@ -60,7 +60,7 @@
                     <property name="queryEntities">
                         <list>
                             <bean class="org.apache.ignite.cache.QueryEntity">
-                                <property name="valueType" value="QueryPerson"/>
+                                <property name="valueType" value="Apache.Ignite.Core.Tests.Cache.Query.QueryPerson"/>
                                 <property name="fields">
                                     <util:map map-class="java.util.LinkedHashMap">
                                         <entry key="age" value="int" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
index c4d4279..33c44a6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
@@ -677,6 +677,9 @@ namespace Apache.Ignite.Core.Tests.Services
                     typeof (TestIgniteServiceBinarizableErr),
                     typeof (PlatformComputeBinarizable),
                     typeof (BinarizableObject))
+                {
+                    NameMapper = BinaryBasicNameMapper.SimpleNameInstance
+                }
             };
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
index 16e2552..a298f6f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
@@ -91,6 +91,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Binary\BinaryBasicNameMapper.cs" />
     <Compile Include="Common\ExceptionFactory.cs" />
     <Compile Include="Events\IEventStorageSpi.cs" />
     <Compile Include="Events\MemoryEventStorageSpi.cs" />
@@ -191,6 +192,7 @@
     <Compile Include="Impl\Binary\DeserializationCallbackProcessor.cs" />
     <Compile Include="Impl\Binary\ReflectionUtils.cs" />
     <Compile Include="Cache\Affinity\AffinityFunctionBase.cs" />
+    <Compile Include="Impl\Binary\TypeNameParser.cs" />
     <Compile Include="Impl\Cache\Store\CacheStore.cs" />
     <Compile Include="Impl\Cache\Store\ICacheStoreInternal.cs" />
     <Compile Include="Impl\Transactions\CacheTransactionManager.cs" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryBasicNameMapper.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryBasicNameMapper.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryBasicNameMapper.cs
new file mode 100644
index 0000000..0a6406b
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryBasicNameMapper.cs
@@ -0,0 +1,129 @@
+\ufeff/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Binary
+{
+    using System;
+    using System.Text;
+    using Apache.Ignite.Core.Impl.Binary;
+    using Apache.Ignite.Core.Impl.Common;
+
+    /// <summary>
+    /// Base binary name mapper implementation.
+    /// </summary>
+    public class BinaryBasicNameMapper : IBinaryNameMapper
+    {
+        /// <summary>
+        /// The simple name instance.
+        /// </summary>
+        internal static readonly BinaryBasicNameMapper SimpleNameInstance = new BinaryBasicNameMapper
+        {
+            IsSimpleName = true
+        };
+
+        /// <summary>
+        /// The full name instance.
+        /// </summary>
+        internal static readonly BinaryBasicNameMapper FullNameInstance = new BinaryBasicNameMapper();
+
+        /// <summary>
+        /// Gets or sets a value indicating whether this instance maps to simple type names.
+        /// </summary>
+        public bool IsSimpleName { get; set; }
+
+        /// <summary>
+        /// Gets the type name.
+        /// </summary>
+        public string GetTypeName(string name)
+        {
+            IgniteArgumentCheck.NotNullOrEmpty(name, "typeName");
+
+            var parsedName = TypeNameParser.Parse(name);
+
+            if (parsedName.Generics == null)
+            {
+                // Generics are rare, use simpler logic for the common case.
+                var res = IsSimpleName ? parsedName.GetName() : parsedName.GetFullName();
+                
+                var arr = parsedName.GetArray();
+
+                if (arr != null)
+                {
+                    res += arr;
+                }
+
+                return res;
+            }
+
+            var nameFunc = IsSimpleName
+                ? (Func<TypeNameParser, string>) (x => x.GetName())
+                : (x => x.GetFullName());
+
+            return BuildTypeName(parsedName, new StringBuilder(), nameFunc).ToString();
+        }
+
+        /// <summary>
+        /// Gets the field name.
+        /// </summary>
+        public string GetFieldName(string name)
+        {
+            return name;
+        }
+
+        /// <summary>
+        /// Builds the type name.
+        /// </summary>
+        private static StringBuilder BuildTypeName(TypeNameParser typeName, StringBuilder sb, 
+            Func<TypeNameParser, string> typeNameFunc)
+        {
+            sb.Append(typeNameFunc(typeName));
+
+            var generics = typeName.Generics;
+
+            if (generics != null)
+            {
+                sb.Append('[');
+
+                var first = true;
+
+                foreach (var genArg in generics)
+                {
+                    if (first)
+                    {
+                        first = false;
+                    }
+                    else
+                    {
+                        sb.Append(',');
+                    }
+
+                    sb.Append('[');
+
+                    BuildTypeName(genArg, sb, typeNameFunc);
+
+                    sb.Append(']');
+                }
+
+                sb.Append(']');
+            }
+
+            sb.Append(typeName.GetArray());
+
+            return sb;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs
index b67f206..8aadf0e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs
@@ -105,7 +105,7 @@ namespace Apache.Ignite.Core.Cache.Configuration
 
                 KeyTypeName = value == null
                     ? null
-                    : (JavaTypes.GetJavaTypeName(value) ?? BinaryUtils.GetTypeName(value));
+                    : (JavaTypes.GetJavaTypeName(value) ?? BinaryUtils.GetSqlTypeName(value));
 
                 _keyType = value;
             }
@@ -141,7 +141,7 @@ namespace Apache.Ignite.Core.Cache.Configuration
 
                 ValueTypeName = value == null
                     ? null
-                    : (JavaTypes.GetJavaTypeName(value) ?? BinaryUtils.GetTypeName(value));
+                    : (JavaTypes.GetJavaTypeName(value) ?? BinaryUtils.GetSqlTypeName(value));
 
                 _valueType = value;
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs
index c33aa57..a1ebbd7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs
@@ -89,7 +89,7 @@ namespace Apache.Ignite.Core.Cache.Configuration
             {
                 FieldTypeName = value == null
                     ? null
-                    : (JavaTypes.GetJavaTypeName(value) ?? BinaryUtils.GetTypeName(value));
+                    : (JavaTypes.GetJavaTypeName(value) ?? BinaryUtils.GetSqlTypeName(value));
 
                 _type = value;
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
index 24a4364..85c7548 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
@@ -272,6 +272,10 @@ namespace Apache.Ignite.Core
                 {
                     writer.WriteBoolean(false);
                 }
+
+                // Name mapper.
+                var mapper = BinaryConfiguration.NameMapper as BinaryBasicNameMapper;
+                writer.WriteBoolean(mapper != null && mapper.IsSimpleName);
             }
             else
             {
@@ -430,7 +434,14 @@ namespace Apache.Ignite.Core
                 BinaryConfiguration = BinaryConfiguration ?? new BinaryConfiguration();
 
                 if (r.ReadBoolean())
+                {
                     BinaryConfiguration.CompactFooter = r.ReadBoolean();
+                }
+
+                if (r.ReadBoolean())
+                {
+                    BinaryConfiguration.NameMapper = BinaryBasicNameMapper.SimpleNameInstance;
+                }
             }
 
             // User attributes

http://git-wip-us.apache.org/repos/asf/ignite/blob/3e3b91a8/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs
index fa7cf6c..4f3156c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs
@@ -158,7 +158,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             _marsh.PutBinaryType(desc);
 
-            return new BinaryEnum(GetTypeId(typeName), value, Marshaller);
+            return new BinaryEnum(desc.TypeId, value, Marshaller);
         }
 
         /** <inheritDoc /> */
@@ -166,8 +166,14 @@ namespace Apache.Ignite.Core.Impl.Binary
         {
             IgniteArgumentCheck.NotNull(type, "type");
             IgniteArgumentCheck.Ensure(type.IsEnum, "type", "Type should be an Enum.");
+            
+            var desc = Marshaller.GetDescriptor(type);
+
+            IgniteArgumentCheck.Ensure(desc.IsEnum, "typeName", "Type should be an Enum.");
+
+            _marsh.PutBinaryType(desc);
 
-            return BuildEnum(type.Name, value);
+            return new BinaryEnum(desc.TypeId, value, Marshaller);
         }
 
         /// <summary>