You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/02/12 14:22:36 UTC

[1/2] ignite git commit: IGNITE-2222: CPP: Added date/timestamp support.

Repository: ignite
Updated Branches:
  refs/heads/ignite-1786 1eacb979a -> 64cfa62ae


http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/core-test/src/cache_query_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/cache_query_test.cpp b/modules/platforms/cpp/core-test/src/cache_query_test.cpp
index 71c1735..a7baf14 100644
--- a/modules/platforms/cpp/core-test/src/cache_query_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cache_query_test.cpp
@@ -49,7 +49,11 @@ public:
     /**
      * Constructor.
      */
-    QueryPerson() : name(NULL), age(0)
+    QueryPerson() : 
+        name(NULL),
+        age(0),
+        birthday(),
+        recordCreated()
     {
         // No-op.
     }
@@ -60,7 +64,12 @@ public:
      * @param name Name.
      * @param age Age.
      */
-    QueryPerson(const std::string& name, int age) : name(CopyChars(name.c_str())), age(age)
+    QueryPerson(const std::string& name, int age,
+        const Date& birthday, const Timestamp& recordCreated) : 
+        name(CopyChars(name.c_str())),
+        age(age),
+        birthday(birthday),
+        recordCreated(recordCreated)
     {
         // No-op.
     }
@@ -70,10 +79,13 @@ public:
      *
      * @param other Other instance.
      */
-    QueryPerson(const QueryPerson& other)
+    QueryPerson(const QueryPerson& other) :
+        name(CopyChars(other.name)),
+        age(other.age),
+        birthday(other.birthday),
+        recordCreated(other.recordCreated)
     {
-        name = CopyChars(other.name);
-        age = other.age;
+        // No-op.
     }
 
     /**
@@ -84,18 +96,16 @@ public:
      */
     QueryPerson& operator=(const QueryPerson& other)
     {
+        using std::swap;
+
         if (&other != this)
         {
             QueryPerson tmp(other);
 
-            char* name0 = name;
-            int age0 = age;
-
-            name = tmp.name;
-            age = tmp.age;
-
-            tmp.name = name0;
-            tmp.age = age0;
+            swap(name, tmp.name);
+            swap(age, tmp.age);
+            swap(birthday, tmp.birthday);
+            swap(recordCreated, tmp.recordCreated);
         }
 
         return *this;
@@ -114,7 +124,7 @@ public:
      * 
      * @return Name.
      */
-    std::string GetName()
+    std::string GetName() const
     {
         return name ? std::string(name) : std::string();
     }
@@ -124,17 +134,43 @@ public:
      * 
      * @return Age.
      */
-    int32_t GetAge()
+    int32_t GetAge() const
     {
         return age;
     }
 
+    /**
+     * Get birthday.
+     * 
+     * @return Birthday date.
+     */
+    const Date& GetBirthday() const
+    {
+        return birthday;
+    }
+
+    /**
+     * Get creation time.
+     * 
+     * @return Creation time.
+     */
+    const Timestamp& GetCreationTime() const
+    {
+        return recordCreated;
+    }
+
 private:
     /** Name. */
     char* name;
 
     /** Age. */
     int age;
+
+    /** Birthday. */
+    Date birthday;
+
+    /** Record creation timestamp. */
+    Timestamp recordCreated;
 };
 
 namespace ignite
@@ -156,14 +192,18 @@ namespace ignite
             {
                 writer.WriteString("name", obj.GetName());
                 writer.WriteInt32("age", obj.GetAge());
+                writer.WriteDate("birthday", obj.GetBirthday());
+                writer.WriteTimestamp("recordCreated", obj.GetCreationTime());
             }
 
             QueryPerson Read(BinaryReader& reader)
             {
                 std::string name = reader.ReadString("name");
                 int age = reader.ReadInt32("age");
+                Date birthday = reader.ReadDate("birthday");
+                Timestamp recordCreated = reader.ReadTimestamp("recordCreated");
             
-                return QueryPerson(name, age);
+                return QueryPerson(name, age, birthday, recordCreated);
             }
 
         IGNITE_BINARY_TYPE_END
@@ -480,6 +520,61 @@ void CheckMultipleGetAll(Cursor& cur, int key1, const std::string& name1,
     }
 }
 
+/**
+ * Make Date in human understandable way.
+ *
+ * @param year Year.
+ * @param month Month.
+ * @param day Day.
+ * @param hour Hour.
+ * @param min Min.
+ * @param sec Sec.
+ * @return Date.
+ */
+Date MakeDate(int year = 1900, int month = 1, int day = 1, int hour = 0, int min = 0, int sec = 0)
+{
+    tm date;
+
+    date.tm_year = year - 1900;
+    date.tm_mon = month - 1;
+    date.tm_mday = day;
+    date.tm_hour = hour;
+    date.tm_min = min;
+    date.tm_sec = sec;
+
+    time_t ct = mktime(&date);
+
+    return Date(ct * 1000);
+}
+
+/**
+ * Make Date in human understandable way.
+ *
+ * @param year Year.
+ * @param month Month.
+ * @param day Day.
+ * @param hour Hour.
+ * @param min Minute.
+ * @param sec Second.
+ * @param ns Nanosecond.
+ * @return Timestamp.
+ */
+Timestamp MakeTimestamp(int year = 1900, int month = 1, int day = 1, int hour = 0, int min = 0, int sec = 0, long ns = 0)
+{
+    tm date;
+
+    date.tm_year = year - 1900;
+    date.tm_mon = month - 1;
+    date.tm_mday = day;
+    date.tm_hour = hour;
+    date.tm_min = min;
+    date.tm_sec = sec;
+
+    time_t ct = mktime(&date);
+
+    return Timestamp(ct, ns);
+}
+
 BOOST_FIXTURE_TEST_SUITE(CacheQueryTestSuite, CacheQueryTestSuiteFixture)
 
 /**
@@ -499,8 +594,8 @@ BOOST_AUTO_TEST_CASE(TestSqlQuery)
     CheckEmptyGetAll(cursor);
 
     // Test simple query.
-    cache.Put(1, QueryPerson("A1", 10));
-    cache.Put(2, QueryPerson("A2", 20));
+    cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685)));
+    cache.Put(2, QueryPerson("A2", 20, MakeDate(1989, 10, 26), MakeTimestamp(2016, 02, 10, 17, 39, 35, 678403201)));
     
     cursor = cache.Query(qry);
     CheckSingle(cursor, 1, "A1", 10);
@@ -555,8 +650,8 @@ BOOST_AUTO_TEST_CASE(TestTextQuery)
     CheckEmptyGetAll(cursor);
 
     // Test simple query.
-    cache.Put(1, QueryPerson("A1", 10));
-    cache.Put(2, QueryPerson("A2", 20));
+    cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685)));
+    cache.Put(2, QueryPerson("A2", 20, MakeDate(1989, 10, 26), MakeTimestamp(2016, 02, 10, 17, 39, 35, 678403201)));
 
     cursor = cache.Query(qry);
     CheckSingle(cursor, 1, "A1", 10);
@@ -601,7 +696,7 @@ BOOST_AUTO_TEST_CASE(TestScanQuery)
     CheckEmptyGetAll(cursor);
 
     // Test simple query.
-    cache.Put(1, QueryPerson("A1", 10));
+    cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685)));
 
     cursor = cache.Query(qry);
     CheckSingle(cursor, 1, "A1", 10);
@@ -610,7 +705,7 @@ BOOST_AUTO_TEST_CASE(TestScanQuery)
     CheckSingleGetAll(cursor, 1, "A1", 10);
 
     // Test query returning multiple entries.
-    cache.Put(2, QueryPerson("A2", 20));
+    cache.Put(2, QueryPerson("A2", 20, MakeDate(1989, 10, 26), MakeTimestamp(2016, 02, 10, 17, 39, 35, 678403201)));
 
     cursor = cache.Query(qry);
     CheckMultiple(cursor, 1, "A1", 10, 2, "A2", 20);
@@ -633,10 +728,10 @@ BOOST_AUTO_TEST_CASE(TestScanQueryPartitioned)
     for (int i = 0; i < entryCnt; i++) 
     {
         std::stringstream stream; 
-        
+
         stream << "A" << i;
-            
-        cache.Put(i, QueryPerson(stream.str(), i * 10));
+
+        cache.Put(i, QueryPerson(stream.str(), i * 10, MakeDate(1970 + i), MakeTimestamp(2016, 1, 1, i / 60, i % 60)));
     }
 
     // Iterate over all partitions and collect data.
@@ -683,7 +778,7 @@ BOOST_AUTO_TEST_CASE(TestFieldsQuerySingle)
     CheckEmpty(cursor);
     
     // Test simple query.
-    cache.Put(1, QueryPerson("A1", 10));
+    cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685)));
 
     cursor = cache.Query(qry);
 
@@ -728,8 +823,8 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryTwo)
     CheckEmpty(cursor);
 
     // Test simple query.
-    cache.Put(1, QueryPerson("A1", 10));
-    cache.Put(2, QueryPerson("A2", 20));
+    cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685)));
+    cache.Put(2, QueryPerson("A2", 20, MakeDate(1989, 10, 26), MakeTimestamp(2016, 02, 10, 17, 39, 35, 678403201)));
 
     cursor = cache.Query(qry);
 
@@ -798,7 +893,7 @@ BOOST_AUTO_TEST_CASE(TestFieldsQuerySeveral)
 
         stream << "A" << i;
 
-        cache.Put(i, QueryPerson(stream.str(), i * 10));
+        cache.Put(i, QueryPerson(stream.str(), i * 10, MakeDate(1970 + i), MakeTimestamp(2016, 1, 1, i / 60, i % 60)));
     }
 
     cursor = cache.Query(qry);
@@ -839,4 +934,120 @@ BOOST_AUTO_TEST_CASE(TestFieldsQuerySeveral)
     CheckEmpty(cursor);
 }
 
+/**
+ * Test query for Date type.
+ */
+BOOST_AUTO_TEST_CASE(TestFieldsQueryDate)
+{
+    // Test simple query.
+    Cache<int, QueryPerson> cache = GetCache();
+
+    // Test query with field of type 'Date'.
+    SqlFieldsQuery qry("select birthday from QueryPerson where birthday<'1990-01-01'");
+
+    QueryFieldsCursor cursor = cache.Query(qry);
+    CheckEmpty(cursor);
+
+    int32_t entryCnt = 100; // Number of entries.
+
+    for (int i = 0; i < entryCnt; i++)
+    {
+        std::stringstream stream;
+
+        stream << "A" << i;
+
+        cache.Put(i, QueryPerson(stream.str(), i * 10, MakeDate(1980 + i), MakeTimestamp(2016, 1, 1, i / 60, i % 60)));
+    }
+
+    cursor = cache.Query(qry);
+
+    IgniteError error;
+
+    int32_t resultSetSize = 0; // Number of entries in query result set.
+
+    while (cursor.HasNext(error))
+    {
+        BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
+
+        QueryFieldsRow row = cursor.GetNext(error);
+        BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
+
+        BOOST_REQUIRE(row.HasNext(error));
+        BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
+
+        Date birthday = row.GetNext<Date>(error);
+        BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
+
+        BOOST_CHECK(birthday == MakeDate(1980 + resultSetSize));
+
+        BOOST_CHECK(birthday < MakeDate(1990, 1, 1));
+
+        BOOST_REQUIRE(!row.HasNext());
+
+        ++resultSetSize;
+    }
+
+    BOOST_CHECK_EQUAL(resultSetSize, 10);
+
+    CheckEmpty(cursor);
+}
+
+/**
+ * Test query for Timestamp type.
+ */
+BOOST_AUTO_TEST_CASE(TestFieldsQueryTimestamp)
+{
+    // Test simple query.
+    Cache<int, QueryPerson> cache = GetCache();
+
+    // Test query with field of type 'Timestamp'.
+    SqlFieldsQuery qry("select recordCreated from QueryPerson where recordCreated<'2016-01-01 01:00:00'");
+
+    QueryFieldsCursor cursor = cache.Query(qry);
+    CheckEmpty(cursor);
+
+    int32_t entryCnt = 1000; // Number of entries.
+
+    for (int i = 0; i < entryCnt; i++)
+    {
+        std::stringstream stream;
+
+        stream << "A" << i;
+
+        cache.Put(i, QueryPerson(stream.str(), i * 10, MakeDate(1980 + i), MakeTimestamp(2016, 1, 1, i / 60, i % 60)));
+    }
+
+    cursor = cache.Query(qry);
+
+    IgniteError error;
+
+    int32_t resultSetSize = 0; // Number of entries in query result set.
+
+    while (cursor.HasNext(error))
+    {
+        BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
+
+        QueryFieldsRow row = cursor.GetNext(error);
+        BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
+
+        BOOST_REQUIRE(row.HasNext(error));
+        BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
+
+        Timestamp recordCreated = row.GetNext<Timestamp>(error);
+        BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS);
+
+        BOOST_CHECK(recordCreated == MakeTimestamp(2016, 1, 1, 0, resultSetSize % 60, 0));
+
+        BOOST_CHECK(recordCreated < MakeTimestamp(2016, 1, 1, 1, 0, 0));
+
+        BOOST_REQUIRE(!row.HasNext());
+
+        ++resultSetSize;
+    }
+
+    BOOST_CHECK_EQUAL(resultSetSize, 60);
+
+    CheckEmpty(cursor);
+}
+
 BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/core-test/src/cache_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/cache_test.cpp b/modules/platforms/cpp/core-test/src/cache_test.cpp
index a11865d..1df70df 100644
--- a/modules/platforms/cpp/core-test/src/cache_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cache_test.cpp
@@ -476,6 +476,30 @@ BOOST_AUTO_TEST_CASE(TestGetOrCreateCache)
     BOOST_REQUIRE(7 == cache2.Get(5));
 }
 
+BOOST_AUTO_TEST_CASE(TestPutGetDate)
+{
+    // Get existing cache
+    cache::Cache<int, Date> cache = grid0.GetOrCreateCache<int, Date>("partitioned");
+
+    Date now = Date(time(NULL) * 1000);
+
+    cache.Put(5, now);
+
+    BOOST_REQUIRE(now == cache.Get(5));
+}
+
+BOOST_AUTO_TEST_CASE(TestPutGetTimestamp)
+{
+    // Get existing cache
+    cache::Cache<int, Timestamp> cache = grid0.GetOrCreateCache<int, Timestamp>("partitioned");
+
+    Timestamp now = Timestamp(time(NULL), 0);
+
+    cache.Put(42, now);
+
+    BOOST_REQUIRE(now == cache.Get(42));
+}
+
 BOOST_AUTO_TEST_CASE(TestGetBigString)
 {
     // Get existing cache


[2/2] ignite git commit: IGNITE-2222: CPP: Added date/timestamp support.

Posted by vo...@apache.org.
IGNITE-2222: CPP: Added date/timestamp support.


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

Branch: refs/heads/ignite-1786
Commit: 64cfa62ae139d5c7b779090c7b7294774214d284
Parents: 1eacb97
Author: isapego <is...@gridgain.com>
Authored: Fri Feb 12 16:22:31 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Fri Feb 12 16:22:31 2016 +0300

----------------------------------------------------------------------
 modules/platforms/cpp/binary/Makefile.am        |   4 +-
 .../platforms/cpp/binary/include/Makefile.am    |   4 +-
 .../include/ignite/binary/binary_raw_reader.h   |  42 ++-
 .../include/ignite/binary/binary_raw_writer.h   |  32 +++
 .../include/ignite/binary/binary_reader.h       |  44 +++
 .../include/ignite/binary/binary_writer.h       |  34 +++
 .../platforms/cpp/binary/include/ignite/date.h  | 138 ++++++++++
 .../include/ignite/impl/binary/binary_common.h  |   6 +
 .../ignite/impl/binary/binary_reader_impl.h     | 121 ++++++++-
 .../include/ignite/impl/binary/binary_utils.h   |  34 +++
 .../ignite/impl/binary/binary_writer_impl.h     |  72 +++++
 .../cpp/binary/include/ignite/timestamp.h       | 166 ++++++++++++
 .../cpp/binary/project/vs/binary.vcxproj        |   4 +
 .../binary/project/vs/binary.vcxproj.filters    |  12 +
 .../cpp/binary/src/binary/binary_raw_reader.cpp |  22 +-
 .../cpp/binary/src/binary/binary_raw_writer.cpp |  20 ++
 .../cpp/binary/src/binary/binary_reader.cpp     |  20 ++
 .../cpp/binary/src/binary/binary_writer.cpp     |  20 ++
 modules/platforms/cpp/binary/src/date.cpp       |  83 ++++++
 .../src/impl/binary/binary_reader_impl.cpp      | 144 ++++++++++
 .../cpp/binary/src/impl/binary/binary_utils.cpp |  26 ++
 .../src/impl/binary/binary_writer_impl.cpp      | 148 +++++++++-
 modules/platforms/cpp/binary/src/timestamp.cpp  | 117 ++++++++
 .../cpp/core-test/config/cache-query.xml        |   2 +
 .../include/ignite/binary_test_utils.h          |  96 +++++++
 .../src/binary_reader_writer_raw_test.cpp       | 124 +++++++++
 .../core-test/src/binary_reader_writer_test.cpp | 192 +++++++++++++
 .../cpp/core-test/src/binary_session_test.cpp   |  36 +++
 .../cpp/core-test/src/cache_query_test.cpp      | 269 +++++++++++++++++--
 .../platforms/cpp/core-test/src/cache_test.cpp  |  24 ++
 30 files changed, 2018 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/Makefile.am b/modules/platforms/cpp/binary/Makefile.am
index 6f0ce16..f285bb5 100644
--- a/modules/platforms/cpp/binary/Makefile.am
+++ b/modules/platforms/cpp/binary/Makefile.am
@@ -43,7 +43,9 @@ COMMON_SRC = src/binary/binary_containers.cpp \
              src/impl/interop/interop_memory.cpp \
              src/impl/interop/interop_output_stream.cpp \
              src/impl/interop/interop_input_stream.cpp \
-             src/guid.cpp
+             src/guid.cpp \
+             src/date.cpp \
+             src/timestamp.cpp
 
 lib_LTLIBRARIES = libignite-binary.la
 libignite_binary_la_SOURCES = $(COMMON_SRC)

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/Makefile.am b/modules/platforms/cpp/binary/include/Makefile.am
index 5f39503..8415331 100644
--- a/modules/platforms/cpp/binary/include/Makefile.am
+++ b/modules/platforms/cpp/binary/include/Makefile.am
@@ -42,7 +42,9 @@ nobase_include_HEADERS = ignite/binary/binary_raw_reader.h \
                          ignite/impl/interop/interop_stream_position_guard.h \
                          ignite/impl/interop/interop_output_stream.h \
                          ignite/impl/interop/interop_input_stream.h \
-                         ignite/guid.h
+                         ignite/guid.h \
+                         ignite/date.h \
+                         ignite/timestamp.h
 
 uninstall-hook:
 	find ${includedir}/ignite -type d -empty -delete

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_reader.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_reader.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_reader.h
index 5bb4b29..65271c5 100644
--- a/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_reader.h
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_reader.h
@@ -32,6 +32,8 @@
 #include "ignite/binary/binary_consts.h"
 #include "ignite/binary/binary_containers.h"
 #include "ignite/guid.h"
+#include "ignite/date.h"
+#include "ignite/timestamp.h"
 
 namespace ignite
 {    
@@ -201,7 +203,7 @@ namespace ignite
              *     -1 will be returned in case array in stream was null.
              */
             int32_t ReadDoubleArray(double* res, int32_t len);
-            
+
             /**
              * Read Guid. Maps to "UUID" type in Java.
              *
@@ -222,6 +224,44 @@ namespace ignite
             int32_t ReadGuidArray(Guid* res, int32_t len);
 
             /**
+             * Read Date. Maps to "Date" type in Java.
+             *
+             * @return Result.
+             */
+            Date ReadDate();
+
+            /**
+             * Read array of Dates. Maps to "Date[]" type in Java.
+             *
+             * @param res Array to store data to.
+             * @param len Expected length of array.             
+             * @return Actual amount of elements read. If "len" argument is less than actual
+             *     array size or resulting array is set to null, nothing will be written
+             *     to resulting array and returned value will contain required array length.
+             *     -1 will be returned in case array in stream was null.
+             */
+            int32_t ReadDateArray(Date* res, int32_t len);
+
+            /**
+             * Read Timestamp. Maps to "Timestamp" type in Java.
+             *
+             * @return Result.
+             */
+            Timestamp ReadTimestamp();
+
+            /**
+             * Read array of Timestamps. Maps to "Timestamp[]" type in Java.
+             *
+             * @param res Array to store data to.
+             * @param len Expected length of array.             
+             * @return Actual amount of elements read. If "len" argument is less than actual
+             *     array size or resulting array is set to null, nothing will be written
+             *     to resulting array and returned value will contain required array length.
+             *     -1 will be returned in case array in stream was null.
+             */
+            int32_t ReadTimestampArray(Timestamp* res, int32_t len);
+
+            /**
              * Read string.
              *
              * @param res Array to store data to. 

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_writer.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_writer.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_writer.h
index 9bbf4ed..b1267c9 100644
--- a/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_writer.h
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_raw_writer.h
@@ -31,6 +31,8 @@
 #include "ignite/binary/binary_consts.h"
 #include "ignite/binary/binary_containers.h"
 #include "ignite/guid.h"
+#include "ignite/date.h"
+#include "ignite/timestamp.h"
 
 namespace ignite
 {
@@ -185,6 +187,36 @@ namespace ignite
             void WriteGuidArray(const Guid* val, int32_t len);
 
             /**
+             * Write Date. Maps to "Date" type in Java.
+             *
+             * @param val Value.
+             */
+            void WriteDate(const Date& val);
+
+            /**
+             * Write array of Dates. Maps to "Date[]" type in Java.
+             *
+             * @param val Array.
+             * @param len Array length.
+             */
+            void WriteDateArray(const Date* val, int32_t len);
+
+            /**
+             * Write Timestamp. Maps to "Timestamp" type in Java.
+             *
+             * @param val Value.
+             */
+            void WriteTimestamp(const Timestamp& val);
+
+            /**
+             * Write array of Timestamps. Maps to "Timestamp[]" type in Java.
+             *
+             * @param val Array.
+             * @param len Array length.
+             */
+            void WriteTimestampArray(const Timestamp* val, int32_t len);
+
+            /**
              * Write string.
              *
              * @param val Null-terminated character array.

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/binary/binary_reader.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_reader.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_reader.h
index f3d5c40..fb15526 100644
--- a/modules/platforms/cpp/binary/include/ignite/binary/binary_reader.h
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_reader.h
@@ -30,6 +30,8 @@
 
 #include "ignite/binary/binary_raw_reader.h"
 #include "ignite/guid.h"
+#include "ignite/date.h"
+#include "ignite/timestamp.h"
 
 namespace ignite
 {    
@@ -239,6 +241,48 @@ namespace ignite
             int32_t ReadGuidArray(const char* fieldName, Guid* res, int32_t len);
 
             /**
+             * Read Date. Maps to "Date" type in Java.
+             *
+             * @param fieldName Field name.
+             * @return Result.
+             */
+            Date ReadDate(const char* fieldName);
+
+            /**
+             * Read array of Dates. Maps to "Date[]" type in Java.
+             *
+             * @param fieldName Field name.
+             * @param res Array to store data to.
+             * @param len Expected length of array.
+             * @return Actual amount of elements read. If "len" argument is less than actual
+             *     array size or resulting array is set to null, nothing will be written
+             *     to resulting array and returned value will contain required array length.
+             *     -1 will be returned in case array in stream was null.
+             */
+            int32_t ReadDateArray(const char* fieldName, Date* res, const int32_t len);
+
+            /**
+             * Read Timestamp. Maps to "Timestamp" type in Java.
+             *
+             * @param fieldName Field name.
+             * @return Result.
+             */
+            Timestamp ReadTimestamp(const char* fieldName);
+
+            /**
+             * Read array of Timestamps. Maps to "Timestamp[]" type in Java.
+             *
+             * @param fieldName Field name.
+             * @param res Array to store data to.
+             * @param len Expected length of array.
+             * @return Actual amount of elements read. If "len" argument is less than actual
+             *     array size or resulting array is set to null, nothing will be written
+             *     to resulting array and returned value will contain required array length.
+             *     -1 will be returned in case array in stream was null.
+             */
+            int32_t ReadTimestampArray(const char* fieldName, Timestamp* res, const int32_t len);
+
+            /**
              * Read string.
              *
              * @param fieldName Field name.

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/binary/binary_writer.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_writer.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_writer.h
index 475f454..ed76c5b 100644
--- a/modules/platforms/cpp/binary/include/ignite/binary/binary_writer.h
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_writer.h
@@ -201,6 +201,40 @@ namespace ignite
             void WriteGuidArray(const char* fieldName, const Guid* val, int32_t len);
 
             /**
+             * Write Date. Maps to "Date" type in Java.
+             *
+             * @param fieldName Field name.
+             * @param val Value.
+             */
+            void WriteDate(const char* fieldName, const Date& val);
+
+            /**
+             * Write array of Dates. Maps to "Date[]" type in Java.
+             *
+             * @param fieldName Field name.
+             * @param val Array.
+             * @param len Array length.
+             */
+            void WriteDateArray(const char* fieldName, const Date* val, const int32_t len);
+
+            /**
+             * Write Timestamp. Maps to "Timestamp" type in Java.
+             *
+             * @param fieldName Field name.
+             * @param val Value.
+             */
+            void WriteTimestamp(const char* fieldName, const Timestamp& val);
+
+            /**
+             * Write array of Timestamps. Maps to "Timestamp[]" type in Java.
+             *
+             * @param fieldName Field name.
+             * @param val Array.
+             * @param len Array length.
+             */
+            void WriteTimestampArray(const char* fieldName, const Timestamp* val, const int32_t len);
+
+            /**
              * Write string.
              *
              * @param fieldName Field name.

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/date.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/date.h b/modules/platforms/cpp/binary/include/ignite/date.h
new file mode 100644
index 0000000..def073f
--- /dev/null
+++ b/modules/platforms/cpp/binary/include/ignite/date.h
@@ -0,0 +1,138 @@
+/*
+ * 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.
+ */
+
+/**
+ * @file
+ * Declares ignite::Date class.
+ */
+
+#ifndef _IGNITE_DATE
+#define _IGNITE_DATE
+
+#include <stdint.h>
+
+#include <ignite/common/common.h>
+
+namespace ignite
+{
+    /**
+     * Date type.
+     */
+    class IGNITE_IMPORT_EXPORT Date
+    {
+    public:
+        /**
+         * Default constructor.
+         */
+        Date();
+
+        /**
+         * Copy constructor.
+         *
+         * @param another Another instance.
+         */
+        Date(const Date& another);
+
+        /**
+         * Constructor.
+         *
+         * @param ms Number of milliseconds since 00:00 hours, Jan 1, 1970 UTC.
+         */
+        Date(int64_t ms);
+
+        /**
+         * Copy operator.
+         *
+         * @param another Another instance.
+         * @return This.
+         */
+        Date& operator=(const Date& another);
+
+        /**
+         * Returns number of milliseconds since 00:00 hours, Jan 1, 1970 UTC.
+         *
+         * @return Number of milliseconds since 00:00 hours, Jan 1, 1970 UTC.
+         */
+        int64_t GetMilliseconds() const;
+
+        /**
+         * Returns number of seconds since 00:00 hours, Jan 1, 1970 UTC.
+         *
+         * @return Number of seconds since 00:00 hours, Jan 1, 1970 UTC.
+         */
+        int64_t GetSeconds() const;
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if equal.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator==(Date& val1, Date& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if not equal.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator!=(Date& val1, Date& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if less.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator<(Date& val1, Date& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if less or equal.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator<=(Date& val1, Date& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if gretter.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator>(Date& val1, Date& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if gretter or equal.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator>=(Date& val1, Date& val2);
+    private:
+        /** Number of milliseconds since 00:00 hours, Jan 1, 1970 UTC. */
+        int64_t milliseconds;  
+    };
+}
+
+#endif //_IGNITE_DATE
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_common.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_common.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_common.h
index 979d2ed..fe0d878 100644
--- a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_common.h
+++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_common.h
@@ -152,6 +152,12 @@ namespace ignite
             /** Type: binary object. */
             const int8_t IGNITE_TYPE_BINARY = 27;
 
+            /** Type: timestamp. */
+            const int8_t IGNITE_TYPE_TIMESTAMP = 33;
+
+            /** Type: timestamp array. */
+            const int8_t IGNITE_TYPE_ARRAY_TIMESTAMP = 34;
+
             /** Read/write single object. */
             const int32_t IGNITE_BINARY_MODE_SINGLE = 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_reader_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_reader_impl.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_reader_impl.h
index f00b071..cf36204 100644
--- a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_reader_impl.h
+++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_reader_impl.h
@@ -30,6 +30,8 @@
 #include "ignite/binary/binary_consts.h"
 #include "ignite/binary/binary_type.h"
 #include "ignite/guid.h"
+#include "ignite/date.h"
+#include "ignite/timestamp.h"
 
 namespace ignite
 {
@@ -430,6 +432,86 @@ namespace ignite
                 int32_t ReadGuidArray(const char* fieldName, Guid* res, const int32_t len);
 
                 /**
+                 * Read Date. Maps to "Date" type in Java.
+                 *
+                 * @return Result.
+                 */
+                Date ReadDate();
+
+                /**
+                 * Read array of Dates. Maps to "Date[]" type in Java.
+                 *
+                 * @param res Array to store data to.
+                 * @param len Expected length of array.             
+                 * @return Actual amount of elements read. If "len" argument is less than actual
+                 *     array size or resulting array is set to null, nothing will be written
+                 *     to resulting array and returned value will contain required array length.
+                 *     -1 will be returned in case array in stream was null.
+                 */
+                int32_t ReadDateArray(Date* res, int32_t len);
+
+                /**
+                 * Read Date. Maps to "Date" type in Java.
+                 *
+                 * @param fieldName Field name.
+                 * @return Result.
+                 */
+                Date ReadDate(const char* fieldName);
+
+                /**
+                 * Read array of Dates. Maps to "Date[]" type in Java.
+                 *
+                 * @param fieldName Field name.
+                 * @param res Array to store data to.
+                 * @param len Expected length of array.
+                 * @return Actual amount of elements read. If "len" argument is less than actual
+                 *     array size or resulting array is set to null, nothing will be written
+                 *     to resulting array and returned value will contain required array length.
+                 *     -1 will be returned in case array in stream was null.
+                 */
+                int32_t ReadDateArray(const char* fieldName, Date* res, const int32_t len);
+
+                /**
+                 * Read Timestamp. Maps to "Timestamp" type in Java.
+                 *
+                 * @return Result.
+                 */
+                Timestamp ReadTimestamp();
+
+                /**
+                 * Read array of Timestamps. Maps to "Timestamp[]" type in Java.
+                 *
+                 * @param res Array to store data to.
+                 * @param len Expected length of array.             
+                 * @return Actual amount of elements read. If "len" argument is less than actual
+                 *     array size or resulting array is set to null, nothing will be written
+                 *     to resulting array and returned value will contain required array length.
+                 *     -1 will be returned in case array in stream was null.
+                 */
+                int32_t ReadTimestampArray(Timestamp* res, int32_t len);
+
+                /**
+                 * Read Timestamp. Maps to "Timestamp" type in Java.
+                 *
+                 * @param fieldName Field name.
+                 * @return Result.
+                 */
+                Timestamp ReadTimestamp(const char* fieldName);
+
+                /**
+                 * Read array of Timestamps. Maps to "Timestamp[]" type in Java.
+                 *
+                 * @param fieldName Field name.
+                 * @param res Array to store data to.
+                 * @param len Expected length of array.
+                 * @return Actual amount of elements read. If "len" argument is less than actual
+                 *     array size or resulting array is set to null, nothing will be written
+                 *     to resulting array and returned value will contain required array length.
+                 *     -1 will be returned in case array in stream was null.
+                 */
+                int32_t ReadTimestampArray(const char* fieldName, Timestamp* res, const int32_t len);
+
+                /**
                  * Read string.
                  *
                  * @param len Expected length of string.
@@ -839,7 +921,7 @@ namespace ignite
                         default:
                         {
                             IGNITE_ERROR_2(ignite::IgniteError::IGNITE_ERR_BINARY, 
-                                           "Unexpected header during deserialization: ", hdr);
+                                           "Unexpected header during deserialization: ", static_cast<int>(hdr));
                         }
                     }
                 }
@@ -926,6 +1008,32 @@ namespace ignite
                 );
 
                 /**
+                 * Internal routine to read Date array.
+                 *
+                 * @param stream Stream.
+                 * @param res Resulting array.
+                 * @param len Length.
+                 */
+                static void ReadDateArrayInternal(
+                    interop::InteropInputStream* stream, 
+                    Date* res,
+                    const int32_t len
+                );
+
+                /**
+                 * Internal routine to read Timestamp array.
+                 *
+                 * @param stream Stream.
+                 * @param res Resulting array.
+                 * @param len Length.
+                 */
+                static void ReadTimestampArrayInternal(
+                    interop::InteropInputStream* stream, 
+                    Timestamp* res,
+                    const int32_t len
+                );
+
+                /**
                  * Read single value in raw mode.
                  * 
                  * @param stream Stream.
@@ -1113,11 +1221,11 @@ namespace ignite
                         if (hdr == expHdr)
                             return func(stream);
                         else if (hdr == IGNITE_HDR_NULL)
-                            return Guid();
+                            return T();
                         else {
                             ThrowOnInvalidHeader(stream->Position() - 1, expHdr, hdr);
 
-                            return Guid();
+                            return T();
                         }
                     }
                 }
@@ -1271,11 +1379,16 @@ namespace ignite
             template<>
             double IGNITE_IMPORT_EXPORT BinaryReaderImpl::ReadTopObject<double>();
 
-            
             template<>
             Guid IGNITE_IMPORT_EXPORT BinaryReaderImpl::ReadTopObject<Guid>();
 
             template<>
+            Date IGNITE_IMPORT_EXPORT BinaryReaderImpl::ReadTopObject<Date>();
+
+            template<>
+            Timestamp IGNITE_IMPORT_EXPORT BinaryReaderImpl::ReadTopObject<Timestamp>();
+
+            template<>
             inline std::string IGNITE_IMPORT_EXPORT BinaryReaderImpl::ReadTopObject<std::string>()
             {
                 int8_t typeId = stream->ReadInt8();

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h
index c1a1ceb..fde3353 100644
--- a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h
+++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h
@@ -21,6 +21,8 @@
 #include <stdint.h>
 
 #include "ignite/guid.h"
+#include "ignite/date.h"
+#include "ignite/timestamp.h"
 
 namespace ignite
 {
@@ -329,6 +331,38 @@ namespace ignite
                 static void WriteGuid(interop::InteropOutputStream* stream, const Guid val);
 
                 /**
+                 * Utility method to read Date from stream.
+                 *
+                 * @param stream Stream.
+                 * @param res Value.
+                 */
+                static Date ReadDate(interop::InteropInputStream* stream);
+
+                /**
+                 * Utility method to write Date to stream.
+                 *
+                 * @param stream Stream.
+                 * @param val Value.
+                 */
+                static void WriteDate(interop::InteropOutputStream* stream, const Date val);
+
+                /**
+                 * Utility method to read Timestamp from stream.
+                 *
+                 * @param stream Stream.
+                 * @param res Value.
+                 */
+                static Timestamp ReadTimestamp(interop::InteropInputStream* stream);
+
+                /**
+                 * Utility method to write Timestamp to stream.
+                 *
+                 * @param stream Stream.
+                 * @param val Value.
+                 */
+                static void WriteTimestamp(interop::InteropOutputStream* stream, const Timestamp val);
+
+                /**
                  * Utility method to write string to stream.
                  *
                  * @param stream Stream.

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h
index 1b47d9e..a490374 100644
--- a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h
+++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h
@@ -34,6 +34,8 @@
 #include "ignite/binary/binary_consts.h"
 #include "ignite/binary/binary_type.h"
 #include "ignite/guid.h"
+#include "ignite/date.h"
+#include "ignite/timestamp.h"
 #include "binary_type_manager.h"
 
 namespace ignite
@@ -357,6 +359,70 @@ namespace ignite
                 void WriteGuidArray(const char* fieldName, const Guid* val, const int32_t len);
 
                 /**
+                 * Write Date. Maps to "Date" type in Java.
+                 *
+                 * @param val Value.
+                 */
+                void WriteDate(const Date& val);
+
+                /**
+                 * Write array of Dates. Maps to "Date[]" type in Java.
+                 *
+                 * @param val Array.
+                 * @param len Array length.
+                 */
+                void WriteDateArray(const Date* val, const int32_t len);
+
+                /**
+                 * Write Date. Maps to "Date" type in Java.
+                 *
+                 * @param fieldName Field name.
+                 * @param val Value.
+                 */
+                void WriteDate(const char* fieldName, const Date& val);
+
+                /**
+                 * Write array of Dates. Maps to "Date[]" type in Java.
+                 *
+                 * @param fieldName Field name.
+                 * @param val Array.
+                 * @param len Array length.
+                 */
+                void WriteDateArray(const char* fieldName, const Date* val, const int32_t len);
+
+                /**
+                 * Write Timestamp. Maps to "Timestamp" type in Java.
+                 *
+                 * @param val Value.
+                 */
+                void WriteTimestamp(const Timestamp& val);
+
+                /**
+                 * Write array of Timestamps. Maps to "Timestamp[]" type in Java.
+                 *
+                 * @param val Array.
+                 * @param len Array length.
+                 */
+                void WriteTimestampArray(const Timestamp* val, const int32_t len);
+
+                /**
+                 * Write Timestamp. Maps to "Timestamp" type in Java.
+                 *
+                 * @param fieldName Field name.
+                 * @param val Value.
+                 */
+                void WriteTimestamp(const char* fieldName, const Timestamp& val);
+
+                /**
+                 * Write array of Timestamps. Maps to "Timestamp[]" type in Java.
+                 *
+                 * @param fieldName Field name.
+                 * @param val Array.
+                 * @param len Array length.
+                 */
+                void WriteTimestampArray(const char* fieldName, const Timestamp* val, const int32_t len);
+
+                /**
                  * Write string.
                  *
                  * @param val String.
@@ -896,6 +962,12 @@ namespace ignite
             void IGNITE_IMPORT_EXPORT BinaryWriterImpl::WriteTopObject(const Guid& obj);
 
             template<>
+            void IGNITE_IMPORT_EXPORT BinaryWriterImpl::WriteTopObject(const Date& obj);
+
+            template<>
+            void IGNITE_IMPORT_EXPORT BinaryWriterImpl::WriteTopObject(const Timestamp& obj);
+
+            template<>
             inline void IGNITE_IMPORT_EXPORT BinaryWriterImpl::WriteTopObject(const std::string& obj)
             {
                 const char* obj0 = obj.c_str();

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/include/ignite/timestamp.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/timestamp.h b/modules/platforms/cpp/binary/include/ignite/timestamp.h
new file mode 100644
index 0000000..3f14aec
--- /dev/null
+++ b/modules/platforms/cpp/binary/include/ignite/timestamp.h
@@ -0,0 +1,166 @@
+/*
+ * 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.
+ */
+
+/**
+ * @file
+ * Declares ignite::Timestamp class.
+ */
+
+#ifndef _IGNITE_TIMESTAMP
+#define _IGNITE_TIMESTAMP
+
+#include <stdint.h>
+
+#include <ignite/common/common.h>
+
+#include <ignite/date.h>
+
+namespace ignite
+{
+    /**
+     * Timestamp type.
+     */
+    class IGNITE_IMPORT_EXPORT Timestamp
+    {
+    public:
+        /**
+         * Default constructor.
+         */
+        Timestamp();
+
+        /**
+         * Copy constructor.
+         *
+         * @param another Another instance.
+         */
+        Timestamp(const Timestamp& another);
+
+        /**
+         * Constructor.
+         *
+         * @param ms Number of milliseconds since 00:00 hours, Jan 1, 1970 UTC.
+         */
+        Timestamp(int64_t ms);
+
+        /**
+         * Constructor.
+         *
+         * @param seconds Number of seconds since 00:00 hours, Jan 1, 1970 UTC.
+         * @param fractionNs Fractional second component in nanoseconds.
+         *     Must be in range [0..999999999].
+         */
+        Timestamp(int64_t seconds, int32_t fractionNs);
+
+        /**
+         * Copy operator.
+         *
+         * @param another Another instance.
+         * @return This.
+         */
+        Timestamp& operator=(const Timestamp& another);
+
+        /**
+         * Returns number of milliseconds since 00:00 hours, Jan 1, 1970 UTC.
+         *
+         * @return Number of milliseconds since 00:00 hours, Jan 1, 1970 UTC.
+         */
+        int64_t GetMilliseconds() const;
+
+        /**
+         * Returns number of seconds since 00:00 hours, Jan 1, 1970 UTC.
+         *
+         * @return Number of seconds since 00:00 hours, Jan 1, 1970 UTC.
+         */
+        int64_t GetSeconds() const;
+
+        /**
+         * Returns number of nanoseconds - fractional seconds component.
+         *
+         * @return Fractional second component expressed in nanoseconds.
+         */
+        int32_t GetSecondFraction() const;
+
+        /**
+         * Returns corresponding date.
+         *
+         * @return Corresponding date.
+         */
+        Date GetDate() const;
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if equal.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator==(Timestamp& val1, Timestamp& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if not equal.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator!=(Timestamp& val1, Timestamp& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if less.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator<(Timestamp& val1, Timestamp& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if less or equal.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator<=(Timestamp& val1, Timestamp& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if gretter.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator>(Timestamp& val1, Timestamp& val2);
+
+        /**
+         * Comparison operator override.
+         *
+         * @param val1 First value.
+         * @param val2 Second value.
+         * @return True if gretter or equal.
+         */
+        friend bool IGNITE_IMPORT_EXPORT operator>=(Timestamp& val1, Timestamp& val2);
+    private:
+        /** Number of seconds since 00:00 hours, Jan 1, 1970 UTC. */
+        int64_t seconds;
+
+        /** Fractional second component in nanoseconds. */
+        int32_t fractionNs;
+    };
+}
+
+#endif //_IGNITE_TIMESTAMP
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/project/vs/binary.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/project/vs/binary.vcxproj b/modules/platforms/cpp/binary/project/vs/binary.vcxproj
index ae463e8..a59a92f 100644
--- a/modules/platforms/cpp/binary/project/vs/binary.vcxproj
+++ b/modules/platforms/cpp/binary/project/vs/binary.vcxproj
@@ -192,6 +192,7 @@
     <ClInclude Include="..\..\include\ignite\binary\binary_reader.h" />
     <ClInclude Include="..\..\include\ignite\binary\binary_type.h" />
     <ClInclude Include="..\..\include\ignite\binary\binary_writer.h" />
+    <ClInclude Include="..\..\include\ignite\date.h" />
     <ClInclude Include="..\..\include\ignite\guid.h" />
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_common.h" />
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_id_resolver.h" />
@@ -210,6 +211,7 @@
     <ClInclude Include="..\..\include\ignite\impl\interop\interop_memory.h" />
     <ClInclude Include="..\..\include\ignite\impl\interop\interop_output_stream.h" />
     <ClInclude Include="..\..\include\ignite\impl\interop\interop_stream_position_guard.h" />
+    <ClInclude Include="..\..\include\ignite\timestamp.h" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\src\binary\binary_containers.cpp" />
@@ -218,6 +220,7 @@
     <ClCompile Include="..\..\src\binary\binary_reader.cpp" />
     <ClCompile Include="..\..\src\binary\binary_type.cpp" />
     <ClCompile Include="..\..\src\binary\binary_writer.cpp" />
+    <ClCompile Include="..\..\src\date.cpp" />
     <ClCompile Include="..\..\src\guid.cpp" />
     <ClCompile Include="..\..\src\impl\binary\binary_reader_impl.cpp" />
     <ClCompile Include="..\..\src\impl\binary\binary_schema.cpp" />
@@ -232,6 +235,7 @@
     <ClCompile Include="..\..\src\impl\interop\interop_input_stream.cpp" />
     <ClCompile Include="..\..\src\impl\interop\interop_memory.cpp" />
     <ClCompile Include="..\..\src\impl\interop\interop_output_stream.cpp" />
+    <ClCompile Include="..\..\src\timestamp.cpp" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters b/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters
index 5d2e91f..a505057 100644
--- a/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters
+++ b/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters
@@ -97,6 +97,12 @@
     <ClInclude Include="..\..\include\ignite\impl\ignite_environment.h">
       <Filter>Code\impl</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\include\ignite\date.h">
+      <Filter>Code</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\include\ignite\timestamp.h">
+      <Filter>Code</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\src\binary\binary_containers.cpp">
@@ -159,5 +165,11 @@
     <ClCompile Include="..\..\src\impl\ignite_environment.cpp">
       <Filter>Code\impl</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\date.cpp">
+      <Filter>Code</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\src\timestamp.cpp">
+      <Filter>Code</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/binary/binary_raw_reader.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/binary/binary_raw_reader.cpp b/modules/platforms/cpp/binary/src/binary/binary_raw_reader.cpp
index 093c13f..e472588 100644
--- a/modules/platforms/cpp/binary/src/binary/binary_raw_reader.cpp
+++ b/modules/platforms/cpp/binary/src/binary/binary_raw_reader.cpp
@@ -117,7 +117,27 @@ namespace ignite
         int32_t BinaryRawReader::ReadGuidArray(Guid* res, const int32_t len)
         {
             return impl->ReadGuidArray(res, len);
-        }        
+        }
+
+        Date BinaryRawReader::ReadDate()
+        {
+            return impl->ReadDate();
+        }
+
+        int32_t BinaryRawReader::ReadDateArray(Date* res, int32_t len)
+        {
+            return impl->ReadDateArray(res, len);
+        }
+
+        Timestamp BinaryRawReader::ReadTimestamp()
+        {
+            return impl->ReadTimestamp();
+        }
+
+        int32_t BinaryRawReader::ReadTimestampArray(Timestamp * res, int32_t len)
+        {
+            return impl->ReadTimestampArray(res, len);
+        }
 
         int32_t BinaryRawReader::ReadString(char* res, const int32_t len)
         {

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/binary/binary_raw_writer.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/binary/binary_raw_writer.cpp b/modules/platforms/cpp/binary/src/binary/binary_raw_writer.cpp
index 31f29a9..a83c74b 100644
--- a/modules/platforms/cpp/binary/src/binary/binary_raw_writer.cpp
+++ b/modules/platforms/cpp/binary/src/binary/binary_raw_writer.cpp
@@ -119,6 +119,26 @@ namespace ignite
             impl->WriteGuidArray(val, len);
         }
 
+        void BinaryRawWriter::WriteDate(const Date& val)
+        {
+            impl->WriteDate(val);
+        }
+
+        void BinaryRawWriter::WriteDateArray(const Date* val, int32_t len)
+        {
+            impl->WriteDateArray(val, len);
+        }
+
+        void BinaryRawWriter::WriteTimestamp(const Timestamp& val)
+        {
+            impl->WriteTimestamp(val);
+        }
+
+        void BinaryRawWriter::WriteTimestampArray(const Timestamp* val, int32_t len)
+        {
+            impl->WriteTimestampArray(val, len);
+        }
+
         void BinaryRawWriter::WriteString(const char* val)
         {
             if (val)

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/binary/binary_reader.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/binary/binary_reader.cpp b/modules/platforms/cpp/binary/src/binary/binary_reader.cpp
index 005ec13..814db83 100644
--- a/modules/platforms/cpp/binary/src/binary/binary_reader.cpp
+++ b/modules/platforms/cpp/binary/src/binary/binary_reader.cpp
@@ -118,6 +118,26 @@ namespace ignite
         {
             return impl->ReadGuidArray(fieldName, res, len);
         }
+
+        Date BinaryReader::ReadDate(const char * fieldName)
+        {
+            return impl->ReadDate(fieldName);
+        }
+
+        int32_t BinaryReader::ReadDateArray(const char * fieldName, Date * res, const int32_t len)
+        {
+            return impl->ReadDateArray(fieldName, res, len);
+        }
+
+        Timestamp BinaryReader::ReadTimestamp(const char * fieldName)
+        {
+            return impl->ReadTimestamp(fieldName);
+        }
+
+        int32_t BinaryReader::ReadTimestampArray(const char * fieldName, Timestamp * res, const int32_t len)
+        {
+            return impl->ReadTimestampArray(fieldName, res, len);
+        }
         
         int32_t BinaryReader::ReadString(const char* fieldName, char* res, int32_t len)
         {

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/binary/binary_writer.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/binary/binary_writer.cpp b/modules/platforms/cpp/binary/src/binary/binary_writer.cpp
index 3247e66..efbc0ce 100644
--- a/modules/platforms/cpp/binary/src/binary/binary_writer.cpp
+++ b/modules/platforms/cpp/binary/src/binary/binary_writer.cpp
@@ -119,6 +119,26 @@ namespace ignite
             impl->WriteGuidArray(fieldName, val, len);
         }
 
+        void BinaryWriter::WriteDate(const char * fieldName, const Date & val)
+        {
+            impl->WriteDate(fieldName, val);
+        }
+
+        void BinaryWriter::WriteDateArray(const char * fieldName, const Date * val, const int32_t len)
+        {
+            impl->WriteDateArray(fieldName, val, len);
+        }
+
+        void BinaryWriter::WriteTimestamp(const char * fieldName, const Timestamp & val)
+        {
+            impl->WriteTimestamp(fieldName, val);
+        }
+
+        void BinaryWriter::WriteTimestampArray(const char * fieldName, const Timestamp * val, const int32_t len)
+        {
+            impl->WriteTimestampArray(fieldName, val, len);
+        }
+
         void BinaryWriter::WriteString(const char* fieldName, const char* val)
         {
             if (val)

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/date.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/date.cpp b/modules/platforms/cpp/binary/src/date.cpp
new file mode 100644
index 0000000..56cca6d
--- /dev/null
+++ b/modules/platforms/cpp/binary/src/date.cpp
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+
+#include "ignite/date.h"
+
+namespace ignite
+{
+    Date::Date() : milliseconds(0)
+    {
+        // No-op.
+    }
+
+    Date::Date(const Date& another) : milliseconds(another.milliseconds)
+    {
+        // No-op.
+    }
+
+    Date::Date(int64_t ms) : milliseconds(ms)
+    {
+        // No-op.
+    }
+
+    Date& Date::operator=(const Date& another)
+    {
+        milliseconds = another.milliseconds;
+
+        return *this;
+    }
+
+    int64_t Date::GetMilliseconds() const
+    {
+        return milliseconds;
+    }
+
+    int64_t Date::GetSeconds() const
+    {
+        return milliseconds / 1000;
+    }
+
+    bool operator==(Date& val1, Date& val2)
+    {
+        return val1.milliseconds == val2.milliseconds;
+    }
+
+    bool operator!=(Date& val1, Date& val2)
+    {
+        return val1.milliseconds != val2.milliseconds;
+    }
+
+    bool operator<(Date& val1, Date& val2)
+    {
+        return val1.milliseconds < val2.milliseconds;
+    }
+
+    bool operator<=(Date& val1, Date& val2)
+    {
+        return val1.milliseconds <= val2.milliseconds;
+    }
+
+    bool operator>(Date& val1, Date& val2)
+    {
+        return val1.milliseconds > val2.milliseconds;
+    }
+
+    bool operator>=(Date& val1, Date& val2)
+    {
+        return val1.milliseconds >= val2.milliseconds;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/impl/binary/binary_reader_impl.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/impl/binary/binary_reader_impl.cpp b/modules/platforms/cpp/binary/src/impl/binary/binary_reader_impl.cpp
index b33be8e..a91f36e 100644
--- a/modules/platforms/cpp/binary/src/impl/binary/binary_reader_impl.cpp
+++ b/modules/platforms/cpp/binary/src/impl/binary/binary_reader_impl.cpp
@@ -269,6 +269,118 @@ namespace ignite
                     *(res + i) = ReadNullable<Guid>(stream, BinaryUtils::ReadGuid, IGNITE_TYPE_UUID);
             }
 
+            Date BinaryReaderImpl::ReadDate()
+            {
+                CheckRawMode(true);
+                CheckSingleMode(true);
+
+                return ReadNullable(stream, BinaryUtils::ReadDate, IGNITE_TYPE_DATE);
+            }
+
+            int32_t BinaryReaderImpl::ReadDateArray(Date* res, int32_t len)
+            {
+                CheckRawMode(true);
+                CheckSingleMode(true);
+
+                return ReadArrayInternal<Date>(res, len, stream, ReadDateArrayInternal, IGNITE_TYPE_ARRAY_DATE);
+            }
+
+            Date BinaryReaderImpl::ReadDate(const char* fieldName)
+            {
+                CheckRawMode(false);
+                CheckSingleMode(true);
+
+                int32_t fieldId = idRslvr->GetFieldId(typeId, fieldName);
+                int32_t fieldPos = FindField(fieldId);
+
+                if (fieldPos <= 0)
+                    return Date();
+
+                stream->Position(fieldPos);
+
+                return ReadNullable(stream, BinaryUtils::ReadDate, IGNITE_TYPE_DATE);
+            }
+
+            int32_t BinaryReaderImpl::ReadDateArray(const char* fieldName, Date* res, const int32_t len)
+            {
+                CheckRawMode(false);
+                CheckSingleMode(true);
+
+                int32_t fieldId = idRslvr->GetFieldId(typeId, fieldName);
+                int32_t fieldPos = FindField(fieldId);
+
+                if (fieldPos <= 0)
+                    return -1;
+
+                stream->Position(fieldPos);
+
+                int32_t realLen = ReadArrayInternal<Date>(res, len, stream, ReadDateArrayInternal, IGNITE_TYPE_ARRAY_DATE);
+
+                return realLen;
+            }
+
+            void BinaryReaderImpl::ReadDateArrayInternal(InteropInputStream* stream, Date* res, const int32_t len)
+            {
+                for (int i = 0; i < len; i++)
+                    *(res + i) = ReadNullable<Date>(stream, BinaryUtils::ReadDate, IGNITE_TYPE_DATE);
+            }
+
+            Timestamp BinaryReaderImpl::ReadTimestamp()
+            {
+                CheckRawMode(true);
+                CheckSingleMode(true);
+
+                return ReadNullable(stream, BinaryUtils::ReadTimestamp, IGNITE_TYPE_TIMESTAMP);
+            }
+
+            int32_t BinaryReaderImpl::ReadTimestampArray(Timestamp* res, int32_t len)
+            {
+                CheckRawMode(true);
+                CheckSingleMode(true);
+
+                return ReadArrayInternal<Timestamp>(res, len, stream, ReadTimestampArrayInternal, IGNITE_TYPE_ARRAY_TIMESTAMP);
+            }
+
+            Timestamp BinaryReaderImpl::ReadTimestamp(const char* fieldName)
+            {
+                CheckRawMode(false);
+                CheckSingleMode(true);
+
+                int32_t fieldId = idRslvr->GetFieldId(typeId, fieldName);
+                int32_t fieldPos = FindField(fieldId);
+
+                if (fieldPos <= 0)
+                    return Timestamp();
+
+                stream->Position(fieldPos);
+
+                return ReadNullable(stream, BinaryUtils::ReadTimestamp, IGNITE_TYPE_TIMESTAMP);
+            }
+
+            int32_t BinaryReaderImpl::ReadTimestampArray(const char* fieldName, Timestamp* res, const int32_t len)
+            {
+                CheckRawMode(false);
+                CheckSingleMode(true);
+
+                int32_t fieldId = idRslvr->GetFieldId(typeId, fieldName);
+                int32_t fieldPos = FindField(fieldId);
+
+                if (fieldPos <= 0)
+                    return -1;
+
+                stream->Position(fieldPos);
+
+                int32_t realLen = ReadArrayInternal<Timestamp>(res, len, stream, ReadTimestampArrayInternal, IGNITE_TYPE_ARRAY_TIMESTAMP);
+
+                return realLen;
+            }
+
+            void BinaryReaderImpl::ReadTimestampArrayInternal(interop::InteropInputStream* stream, Timestamp* res, const int32_t len)
+            {
+                for (int i = 0; i < len; i++)
+                    *(res + i) = ReadNullable<Timestamp>(stream, BinaryUtils::ReadTimestamp, IGNITE_TYPE_TIMESTAMP);
+            }
+
             int32_t BinaryReaderImpl::ReadString(char* res, const int32_t len)
             {
                 CheckRawMode(true);
@@ -625,6 +737,38 @@ namespace ignite
                 }
             }
 
+            template <>
+            Date BinaryReaderImpl::ReadTopObject<Date>()
+            {
+                int8_t typeId = stream->ReadInt8();
+
+                if (typeId == IGNITE_TYPE_DATE)
+                    return BinaryUtils::ReadDate(stream);
+                else if (typeId == IGNITE_HDR_NULL)
+                    return Date();
+                else {
+                    int32_t pos = stream->Position() - 1;
+
+                    IGNITE_ERROR_FORMATTED_3(IgniteError::IGNITE_ERR_BINARY, "Invalid header", "position", pos, "expected", (int)IGNITE_TYPE_DATE, "actual", (int)typeId)
+                }
+            }
+
+            template <>
+            Timestamp BinaryReaderImpl::ReadTopObject<Timestamp>()
+            {
+                int8_t typeId = stream->ReadInt8();
+
+                if (typeId == IGNITE_TYPE_TIMESTAMP)
+                    return BinaryUtils::ReadTimestamp(stream);
+                else if (typeId == IGNITE_HDR_NULL)
+                    return Timestamp();
+                else {
+                    int32_t pos = stream->Position() - 1;
+
+                    IGNITE_ERROR_FORMATTED_3(IgniteError::IGNITE_ERR_BINARY, "Invalid header", "position", pos, "expected", (int)IGNITE_TYPE_TIMESTAMP, "actual", (int)typeId)
+                }
+            }
+
             InteropInputStream* BinaryReaderImpl::GetStream()
             {
                 return stream;

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp b/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp
index 8e26ea9..bfb9726 100644
--- a/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp
+++ b/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp
@@ -201,6 +201,32 @@ namespace ignite
                 stream->WriteInt64(val.GetLeastSignificantBits());
             }
 
+            Date BinaryUtils::ReadDate(interop::InteropInputStream * stream)
+            {
+                int64_t milliseconds = stream->ReadInt64();
+
+                return Date(milliseconds);
+            }
+
+            void BinaryUtils::WriteDate(interop::InteropOutputStream* stream, const Date val)
+            {
+                stream->WriteInt64(val.GetMilliseconds());
+            }
+
+            Timestamp BinaryUtils::ReadTimestamp(interop::InteropInputStream* stream)
+            {
+                int64_t milliseconds = stream->ReadInt64();
+                int32_t nanoseconds = stream->ReadInt32();
+
+                return Timestamp(milliseconds / 1000, nanoseconds);
+            }
+
+            void BinaryUtils::WriteTimestamp(interop::InteropOutputStream* stream, const Timestamp val)
+            {
+                stream->WriteInt64(val.GetSeconds() * 1000);
+                stream->WriteInt32(val.GetSecondFraction());
+            }
+
             void BinaryUtils::WriteString(interop::InteropOutputStream* stream, const char* val, const int32_t len)
             {
                 stream->WriteInt32(len);

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp b/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp
index 97aff17..f57cd16 100644
--- a/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp
+++ b/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp
@@ -206,7 +206,7 @@ namespace ignite
             }
 
             void BinaryWriterImpl::WriteGuid(const Guid val)
-            {                
+            {
                 CheckRawMode(true);
                 CheckSingleMode(true);
 
@@ -274,6 +274,140 @@ namespace ignite
                 }
             }
 
+            void BinaryWriterImpl::WriteDate(const Date& val)
+            {
+                CheckRawMode(true);
+                CheckSingleMode(true);
+
+                stream->WriteInt8(IGNITE_TYPE_DATE);
+
+                BinaryUtils::WriteDate(stream, val);
+            }
+
+            void BinaryWriterImpl::WriteDateArray(const Date* val, const int32_t len)
+            {
+                CheckRawMode(true);
+                CheckSingleMode(true);
+
+                if (val)
+                {
+                    stream->WriteInt8(IGNITE_TYPE_ARRAY_DATE);
+                    stream->WriteInt32(len);
+
+                    for (int i = 0; i < len; i++)
+                    {
+                        const Date& elem = *(val + i);
+
+                        stream->WriteInt8(IGNITE_TYPE_DATE);
+                        BinaryUtils::WriteDate(stream, elem);
+                    }
+                }
+                else
+                    stream->WriteInt8(IGNITE_HDR_NULL);
+            }
+
+            void BinaryWriterImpl::WriteDate(const char* fieldName, const Date& val)
+            {
+                CheckRawMode(false);
+                CheckSingleMode(true);
+
+                WriteFieldId(fieldName, IGNITE_TYPE_DATE);
+
+                stream->WriteInt8(IGNITE_TYPE_DATE);
+
+                BinaryUtils::WriteDate(stream, val);
+            }
+
+            void BinaryWriterImpl::WriteDateArray(const char* fieldName, const Date* val, const int32_t len)
+            {
+                CheckRawMode(false);
+                CheckSingleMode(true);
+
+                WriteFieldId(fieldName, IGNITE_TYPE_ARRAY_DATE);
+
+                if (val)
+                {
+                    stream->WriteInt8(IGNITE_TYPE_ARRAY_DATE);
+                    stream->WriteInt32(len);
+
+                    for (int i = 0; i < len; i++)
+                    {
+                        const Date& elem = *(val + i);
+
+                        WriteTopObject(elem);
+                    }
+                }
+                else
+                    stream->WriteInt8(IGNITE_HDR_NULL);
+            }
+
+            void BinaryWriterImpl::WriteTimestamp(const Timestamp& val)
+            {
+                CheckRawMode(true);
+                CheckSingleMode(true);
+
+                stream->WriteInt8(IGNITE_TYPE_TIMESTAMP);
+
+                BinaryUtils::WriteTimestamp(stream, val);
+            }
+
+            void BinaryWriterImpl::WriteTimestampArray(const Timestamp* val, const int32_t len)
+            {
+                CheckRawMode(true);
+                CheckSingleMode(true);
+
+                if (val)
+                {
+                    stream->WriteInt8(IGNITE_TYPE_ARRAY_TIMESTAMP);
+                    stream->WriteInt32(len);
+
+                    for (int i = 0; i < len; i++)
+                    {
+                        const Timestamp& elem = *(val + i);
+
+                        stream->WriteInt8(IGNITE_TYPE_TIMESTAMP);
+                        BinaryUtils::WriteTimestamp(stream, elem);
+                    }
+                }
+                else
+                    stream->WriteInt8(IGNITE_HDR_NULL);
+            }
+
+            void BinaryWriterImpl::WriteTimestamp(const char* fieldName, const Timestamp& val)
+            {
+                CheckRawMode(false);
+                CheckSingleMode(true);
+
+                WriteFieldId(fieldName, IGNITE_TYPE_TIMESTAMP);
+
+                stream->WriteInt8(IGNITE_TYPE_TIMESTAMP);
+
+                BinaryUtils::WriteTimestamp(stream, val);
+            }
+
+            void BinaryWriterImpl::WriteTimestampArray(const char* fieldName, const Timestamp* val, const int32_t len)
+            {
+                CheckRawMode(false);
+                CheckSingleMode(true);
+
+                WriteFieldId(fieldName, IGNITE_TYPE_ARRAY_TIMESTAMP);
+
+                if (val)
+                {
+                    stream->WriteInt8(IGNITE_TYPE_ARRAY_TIMESTAMP);
+                    stream->WriteInt32(len);
+
+                    for (int i = 0; i < len; i++)
+                    {
+                        const Timestamp& elem = *(val + i);
+
+                        WriteTopObject(elem);
+                    }
+                }
+                else
+                    stream->WriteInt8(IGNITE_HDR_NULL);
+            }
+
             void BinaryWriterImpl::WriteString(const char* val, const int32_t len)
             {
                 CheckRawMode(true);
@@ -559,6 +693,18 @@ namespace ignite
                 WriteTopObject0<Guid>(obj, BinaryUtils::WriteGuid, IGNITE_TYPE_UUID);
             }
 
+            template <>
+            void BinaryWriterImpl::WriteTopObject<Date>(const Date& obj)
+            {
+                WriteTopObject0<Date>(obj, BinaryUtils::WriteDate, IGNITE_TYPE_DATE);
+            }
+
+            template <>
+            void BinaryWriterImpl::WriteTopObject<Timestamp>(const Timestamp& obj)
+            {
+                WriteTopObject0<Timestamp>(obj, BinaryUtils::WriteTimestamp, IGNITE_TYPE_TIMESTAMP);
+            }
+
             void BinaryWriterImpl::PostWrite()
             {
                 int32_t lenWithoutSchema = stream->Position() - start;

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/binary/src/timestamp.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/timestamp.cpp b/modules/platforms/cpp/binary/src/timestamp.cpp
new file mode 100644
index 0000000..a56587e
--- /dev/null
+++ b/modules/platforms/cpp/binary/src/timestamp.cpp
@@ -0,0 +1,117 @@
+/*
+ * 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.
+ */
+
+#include "ignite/timestamp.h"
+
+namespace ignite
+{
+    Timestamp::Timestamp() :
+        seconds(0),
+        fractionNs(0)
+    {
+        // No-op.
+    }
+
+    Timestamp::Timestamp(const Timestamp& another) : 
+        seconds(another.seconds),
+        fractionNs(another.fractionNs)
+    {
+        // No-op.
+    }
+
+    Timestamp::Timestamp(int64_t ms) :
+        seconds(ms / 1000),
+        fractionNs((ms % 1000) * 1000000)
+    {
+        // No-op.
+    }
+
+    Timestamp::Timestamp(int64_t seconds, int32_t fractionNs) :
+        seconds(seconds),
+        fractionNs(fractionNs)
+    {
+        // No-op.
+    }
+
+    Timestamp& Timestamp::operator=(const Timestamp& another)
+    {
+        seconds = another.seconds;
+        fractionNs = another.fractionNs;
+
+        return *this;
+    }
+
+    int64_t Timestamp::GetMilliseconds() const
+    {
+        return seconds * 1000 + fractionNs / 1000000;
+    }
+
+    int64_t Timestamp::GetSeconds() const
+    {
+        return seconds;
+    }
+
+    int32_t Timestamp::GetSecondFraction() const
+    {
+        return fractionNs;
+    }
+
+    Date Timestamp::GetDate() const
+    {
+        return Date(GetMilliseconds());
+    }
+
+    bool operator==(Timestamp& val1, Timestamp& val2)
+    {
+        return val1.seconds == val2.seconds &&
+            val1.fractionNs == val2.fractionNs;
+    }
+
+    bool operator!=(Timestamp& val1, Timestamp& val2)
+    {
+        return val1.seconds != val2.seconds ||
+            val1.fractionNs != val2.fractionNs;
+    }
+
+    bool operator<(Timestamp& val1, Timestamp& val2)
+    {
+        return val1.seconds < val2.seconds ||
+            (val1.seconds == val2.seconds &&
+                val1.fractionNs < val2.fractionNs);
+    }
+
+    bool operator<=(Timestamp& val1, Timestamp& val2)
+    {
+        return val1.seconds < val2.seconds ||
+            (val1.seconds == val2.seconds &&
+                val1.fractionNs <= val2.fractionNs);
+    }
+
+    bool operator>(Timestamp& val1, Timestamp& val2)
+    {
+        return val1.seconds > val2.seconds ||
+            (val1.seconds == val2.seconds &&
+                val1.fractionNs > val2.fractionNs);
+    }
+
+    bool operator>=(Timestamp& val1, Timestamp& val2)
+    {
+        return val1.seconds > val2.seconds ||
+            (val1.seconds == val2.seconds &&
+                val1.fractionNs >= val2.fractionNs);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/core-test/config/cache-query.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/config/cache-query.xml b/modules/platforms/cpp/core-test/config/cache-query.xml
index 160fe49..232b6da 100644
--- a/modules/platforms/cpp/core-test/config/cache-query.xml
+++ b/modules/platforms/cpp/core-test/config/cache-query.xml
@@ -59,6 +59,8 @@
                                     <map>
                                         <entry key="name" value="java.lang.String"/>
                                         <entry key="age" value="java.lang.Integer"/>
+                                        <entry key="birthday" value="java.util.Date"/>
+                                        <entry key="recordCreated" value="java.sql.Timestamp"/>
                                     </map>
                                 </property>
                                 <property name="textFields">

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/core-test/include/ignite/binary_test_utils.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/include/ignite/binary_test_utils.h b/modules/platforms/cpp/core-test/include/ignite/binary_test_utils.h
index 19965a0..bcec9fe 100644
--- a/modules/platforms/cpp/core-test/include/ignite/binary_test_utils.h
+++ b/modules/platforms/cpp/core-test/include/ignite/binary_test_utils.h
@@ -150,6 +150,30 @@ namespace ignite_test
                 return reader.ReadGuid();
             }
 
+            template<>
+            inline void Write(BinaryRawWriter& writer, Date val)
+            {
+                writer.WriteDate(val);
+            }
+
+            template<>
+            inline Date Read(BinaryRawReader& reader)
+            {
+                return reader.ReadDate();
+            }
+
+            template<>
+            inline void Write(BinaryRawWriter& writer, Timestamp val)
+            {
+                writer.WriteTimestamp(val);
+            }
+
+            template<>
+            inline Timestamp Read(BinaryRawReader& reader)
+            {
+                return reader.ReadTimestamp();
+            }
+
             template<typename T>
             inline void WriteArray(BinaryRawWriter& writer, T* val, int32_t len)
             {
@@ -270,6 +294,30 @@ namespace ignite_test
                 return reader.ReadGuidArray(val, len);
             }
 
+            template<>
+            inline void WriteArray(BinaryRawWriter& writer, Date* val, int32_t len)
+            {
+                writer.WriteDateArray(val, len);
+            }
+
+            template<>
+            inline int32_t ReadArray(BinaryRawReader& reader, Date* val, int32_t len)
+            {
+                return reader.ReadDateArray(val, len);
+            }
+
+            template<>
+            inline void WriteArray(BinaryRawWriter& writer, Timestamp* val, int32_t len)
+            {
+                writer.WriteTimestampArray(val, len);
+            }
+
+            template<>
+            inline int32_t ReadArray(BinaryRawReader& reader, Timestamp* val, int32_t len)
+            {
+                return reader.ReadTimestampArray(val, len);
+            }
+
             template<typename T>
             inline void Write(BinaryWriter& writer, const char* fieldName, T val)
             {
@@ -390,6 +438,30 @@ namespace ignite_test
                 return reader.ReadGuid(fieldName);
             }
 
+            template<>
+            inline void Write(BinaryWriter& writer, const char* fieldName, Date val)
+            {
+                writer.WriteDate(fieldName, val);
+            }
+
+            template<>
+            inline Date Read(BinaryReader& reader, const char* fieldName)
+            {
+                return reader.ReadDate(fieldName);
+            }
+
+            template<>
+            inline void Write(BinaryWriter& writer, const char* fieldName, Timestamp val)
+            {
+                writer.WriteTimestamp(fieldName, val);
+            }
+
+            template<>
+            inline Timestamp Read(BinaryReader& reader, const char* fieldName)
+            {
+                return reader.ReadTimestamp(fieldName);
+            }
+
             template<typename T>
             inline void WriteArray(BinaryWriter& writer, const char* fieldName, T* val, int32_t len)
             {
@@ -509,6 +581,30 @@ namespace ignite_test
             {
                 return reader.ReadGuidArray(fieldName, val, len);
             }
+
+            template<>
+            inline void WriteArray(BinaryWriter& writer, const char* fieldName, Date* val, int32_t len)
+            {
+                writer.WriteDateArray(fieldName, val, len);
+            }
+
+            template<>
+            inline int32_t ReadArray(BinaryReader& reader, const char* fieldName, Date* val, int32_t len)
+            {
+                return reader.ReadDateArray(fieldName, val, len);
+            }
+
+            template<>
+            inline void WriteArray(BinaryWriter& writer, const char* fieldName, Timestamp* val, int32_t len)
+            {
+                writer.WriteTimestampArray(fieldName, val, len);
+            }
+
+            template<>
+            inline int32_t ReadArray(BinaryReader& reader, const char* fieldName, Timestamp* val, int32_t len)
+            {
+                return reader.ReadTimestampArray(fieldName, val, len);
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp b/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
index 4e7e2df..b6d9eab 100644
--- a/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
@@ -210,6 +210,32 @@ void CheckRawWritesRestricted(BinaryRawWriter& writer)
 
     try
     {
+        Date val(1);
+
+        writer.WriteDate(val);
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    try
+    {
+        Timestamp val(1);
+
+        writer.WriteTimestamp(val);
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    try
+    {
         writer.WriteString("test");
 
         BOOST_FAIL("Not restricted.");
@@ -292,6 +318,28 @@ void CheckRawReadsRestricted(BinaryRawReader& reader)
 
     try
     {
+        reader.ReadDate();
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    try
+    {
+        reader.ReadTimestamp();
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    try
+    {
         reader.ReadString();
 
         BOOST_FAIL("Not restricted.");
@@ -764,6 +812,20 @@ BOOST_AUTO_TEST_CASE(TestPrimitiveGuid)
     CheckRawPrimitive<Guid>(val);
 }
 
+BOOST_AUTO_TEST_CASE(TestPrimitiveDate)
+{
+    Date val(time(NULL) * 1000);
+
+    CheckRawPrimitive<Date>(val);
+}
+
+BOOST_AUTO_TEST_CASE(TestPrimitiveTimestamp)
+{
+    Timestamp val(time(NULL), 0);
+
+    CheckRawPrimitive<Timestamp>(val);
+}
+
 BOOST_AUTO_TEST_CASE(TestPrimitiveArrayInt8)
 {
     CheckRawPrimitiveArray<int8_t>(1, 2, 3);
@@ -813,6 +875,24 @@ BOOST_AUTO_TEST_CASE(TestPrimitiveArrayGuid)
     CheckRawPrimitiveArray<Guid>(dflt, val1, val2);
 }
 
+BOOST_AUTO_TEST_CASE(TestPrimitiveArrayDate)
+{
+    Date dflt(1);
+    Date val1(2);
+    Date val2(3);
+
+    CheckRawPrimitiveArray<Date>(dflt, val1, val2);
+}
+
+BOOST_AUTO_TEST_CASE(TestPrimitiveArrayTimestamp)
+{
+    Timestamp dflt(1);
+    Timestamp val1(2);
+    Timestamp val2(3);
+
+    CheckRawPrimitiveArray<Timestamp>(dflt, val1, val2);
+}
+
 BOOST_AUTO_TEST_CASE(TestGuidNull)
 {
     InteropUnpooledMemory mem(1024);
@@ -835,6 +915,50 @@ BOOST_AUTO_TEST_CASE(TestGuidNull)
     BOOST_REQUIRE(actualVal == expVal);
 }
 
+BOOST_AUTO_TEST_CASE(TestDateNull)
+{
+    InteropUnpooledMemory mem(1024);
+
+    InteropOutputStream out(&mem);
+    BinaryWriterImpl writer(&out, NULL);
+    BinaryRawWriter rawWriter(&writer);
+
+    rawWriter.WriteNull();
+
+    out.Synchronize();
+
+    InteropInputStream in(&mem);
+    BinaryReaderImpl reader(&in);
+    BinaryRawReader rawReader(&reader);
+
+    Date expVal;
+    Date actualVal = rawReader.ReadDate();
+
+    BOOST_REQUIRE(actualVal == expVal);
+}
+
+BOOST_AUTO_TEST_CASE(TestTimestampNull)
+{
+    InteropUnpooledMemory mem(1024);
+
+    InteropOutputStream out(&mem);
+    BinaryWriterImpl writer(&out, NULL);
+    BinaryRawWriter rawWriter(&writer);
+
+    rawWriter.WriteNull();
+
+    out.Synchronize();
+
+    InteropInputStream in(&mem);
+    BinaryReaderImpl reader(&in);
+    BinaryRawReader rawReader(&reader);
+
+    Timestamp expVal;
+    Timestamp actualVal = rawReader.ReadTimestamp();
+
+    BOOST_REQUIRE(actualVal == expVal);
+}
+
 BOOST_AUTO_TEST_CASE(TestString) {
     InteropUnpooledMemory mem(1024);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp b/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
index 71177b8..fa36dac 100644
--- a/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
@@ -335,6 +335,32 @@ void CheckWritesRestricted(BinaryWriter& writer)
 
     try
     {
+        Date val(1);
+
+        writer.WriteDate("field", val);
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    try
+    {
+        Timestamp val(1);
+
+        writer.WriteTimestamp("field", val);
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    try
+    {
         writer.WriteString("field", "test");
 
         BOOST_FAIL("Not restricted.");
@@ -417,6 +443,28 @@ void CheckReadsRestricted(BinaryReader& reader)
 
     try
     {
+        reader.ReadDate("field");
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    try
+    {
+        reader.ReadTimestamp("field");
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    try
+    {
         reader.ReadString("field");
 
         BOOST_FAIL("Not restricted.");
@@ -947,6 +995,20 @@ BOOST_AUTO_TEST_CASE(TestPrimitiveGuid)
     CheckPrimitive<Guid>(val);
 }
 
+BOOST_AUTO_TEST_CASE(TestPrimitiveDate)
+{
+    Date val(time(NULL) * 1000);
+
+    CheckPrimitive<Date>(val);
+}
+
+BOOST_AUTO_TEST_CASE(TestPrimitiveTimestamp)
+{
+    Timestamp val(time(NULL), 0);
+
+    CheckPrimitive<Timestamp>(val);
+}
+
 BOOST_AUTO_TEST_CASE(TestPrimitiveArrayInt8)
 {
     CheckPrimitiveArray<int8_t>(1, 2, 3);
@@ -996,6 +1058,24 @@ BOOST_AUTO_TEST_CASE(TestPrimitiveArrayGuid)
     CheckPrimitiveArray<Guid>(dflt, val1, val2);
 }
 
+BOOST_AUTO_TEST_CASE(TestPrimitiveArrayDate)
+{
+    Date dflt(1);
+    Date val1(2);
+    Date val2(3);
+
+    CheckPrimitiveArray<Date>(dflt, val1, val2);
+}
+
+BOOST_AUTO_TEST_CASE(TestPrimitiveArrayTimestamp)
+{
+    Timestamp dflt(1);
+    Timestamp val1(2);
+    Timestamp val2(3);
+
+    CheckPrimitiveArray<Timestamp>(dflt, val1, val2);
+}
+
 BOOST_AUTO_TEST_CASE(TestGuidNull)
 {
     TemplatedBinaryIdResolver<BinaryDummy> idRslvr;
@@ -1052,6 +1132,118 @@ BOOST_AUTO_TEST_CASE(TestGuidNull)
     BOOST_REQUIRE(actualVal == expVal);
 }
 
+BOOST_AUTO_TEST_CASE(TestDateNull)
+{
+    TemplatedBinaryIdResolver<BinaryDummy> idRslvr;
+
+    InteropUnpooledMemory mem(1024);
+
+    InteropOutputStream out(&mem);
+    BinaryWriterImpl writerImpl(&out, &idRslvr, NULL, NULL, 0);
+    BinaryWriter writer(&writerImpl);
+
+    out.Position(IGNITE_DFLT_HDR_LEN);
+
+    try
+    {
+        writer.WriteNull(NULL);
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    writer.WriteNull("test");
+
+    writerImpl.PostWrite();
+
+    out.Synchronize();
+
+    InteropInputStream in(&mem);
+
+    int32_t footerBegin = in.ReadInt32(IGNITE_OFFSET_SCHEMA_OR_RAW_OFF);
+    int32_t footerEnd = footerBegin + 5;
+
+    BinaryReaderImpl readerImpl(&in, &idRslvr, 0, true, idRslvr.GetTypeId(), 0, 100, 100, footerBegin, footerEnd, OFFSET_TYPE_ONE_BYTE);
+    BinaryReader reader(&readerImpl);
+    
+    in.Position(IGNITE_DFLT_HDR_LEN);
+
+    try
+    {
+        reader.ReadDate(NULL);
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    Date expVal;
+    Date actualVal = reader.ReadDate("test");
+
+    BOOST_REQUIRE(actualVal == expVal);
+}
+
+BOOST_AUTO_TEST_CASE(TestTimestampNull)
+{
+    TemplatedBinaryIdResolver<BinaryDummy> idRslvr;
+
+    InteropUnpooledMemory mem(1024);
+
+    InteropOutputStream out(&mem);
+    BinaryWriterImpl writerImpl(&out, &idRslvr, NULL, NULL, 0);
+    BinaryWriter writer(&writerImpl);
+
+    out.Position(IGNITE_DFLT_HDR_LEN);
+
+    try
+    {
+        writer.WriteNull(NULL);
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    writer.WriteNull("test");
+
+    writerImpl.PostWrite();
+
+    out.Synchronize();
+
+    InteropInputStream in(&mem);
+
+    int32_t footerBegin = in.ReadInt32(IGNITE_OFFSET_SCHEMA_OR_RAW_OFF);
+    int32_t footerEnd = footerBegin + 5;
+
+    BinaryReaderImpl readerImpl(&in, &idRslvr, 0, true, idRslvr.GetTypeId(), 0, 100, 100, footerBegin, footerEnd, OFFSET_TYPE_ONE_BYTE);
+    BinaryReader reader(&readerImpl);
+
+    in.Position(IGNITE_DFLT_HDR_LEN);
+
+    try
+    {
+        reader.ReadTimestamp(NULL);
+
+        BOOST_FAIL("Not restricted.");
+    }
+    catch (IgniteError& err)
+    {
+        BOOST_REQUIRE(err.GetCode() == IgniteError::IGNITE_ERR_BINARY);
+    }
+
+    Timestamp expVal;
+    Timestamp actualVal = reader.ReadTimestamp("test");
+
+    BOOST_REQUIRE(actualVal == expVal);
+}
+
 BOOST_AUTO_TEST_CASE(TestString) {
     TemplatedBinaryIdResolver<BinaryDummy> idRslvr;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/64cfa62a/modules/platforms/cpp/core-test/src/binary_session_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/binary_session_test.cpp b/modules/platforms/cpp/core-test/src/binary_session_test.cpp
index c5c4191..19bfaac 100644
--- a/modules/platforms/cpp/core-test/src/binary_session_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_session_test.cpp
@@ -137,6 +137,42 @@ BOOST_AUTO_TEST_CASE(TestGuid)
     BOOST_REQUIRE(readVal.GetLeastSignificantBits() == writeVal.GetLeastSignificantBits());    
 }
 
+BOOST_AUTO_TEST_CASE(TestDate)
+{
+    Date writeVal = Date(42);
+
+    InteropUnpooledMemory mem(1024);
+
+    InteropOutputStream out(&mem);
+    BinaryWriterImpl writeSes(&out, NULL);
+    writeSes.WriteTopObject<Date>(writeVal);
+    out.Synchronize();
+
+    InteropInputStream in(&mem);
+    BinaryReaderImpl reader(&in);
+    Date readVal = reader.ReadTopObject<Date>();
+
+    BOOST_REQUIRE(readVal == writeVal);
+}
+
+BOOST_AUTO_TEST_CASE(TestTimestamp)
+{
+    Timestamp writeVal = Timestamp(77);
+
+    InteropUnpooledMemory mem(1024);
+
+    InteropOutputStream out(&mem);
+    BinaryWriterImpl writeSes(&out, NULL);
+    writeSes.WriteTopObject<Timestamp>(writeVal);
+    out.Synchronize();
+
+    InteropInputStream in(&mem);
+    BinaryReaderImpl reader(&in);
+    Timestamp readVal = reader.ReadTopObject<Timestamp>();
+
+    BOOST_REQUIRE(readVal == writeVal);
+}
+
 BOOST_AUTO_TEST_CASE(TestString)
 {
     std::string writeVal = "MyString";