diff --git a/programs/ssl/ssl_base64_dump.c b/programs/ssl/ssl_base64_dump.c
index dc146f2..fdd4287 100644
--- a/programs/ssl/ssl_base64_dump.c
+++ b/programs/ssl/ssl_base64_dump.c
@@ -50,6 +50,8 @@
 #define CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT      ( 1 << 2 )
 #define CONTEXT_CONFIG_ALPN_BIT                  ( 1 << 3 )
 
+#define TRANSFORM_RANDBYTE_LEN  64
+
 /*
  * Global values
  */
@@ -166,10 +168,10 @@
 /*
  * This function prints base64 code to the stdout
  */
-void print_b64( const unsigned char *b, size_t len )
+void print_b64( const uint8_t *b, size_t len )
 {
     size_t i = 0;
-    const unsigned char *end = b + len;
+    const uint8_t *end = b + len;
     printf("\t");
     while( b < end )
     {
@@ -187,14 +189,14 @@
 /*
  * This function prints hex code from the buffer to the stdout.
  */
-void print_hex( const unsigned char *b, size_t len )
+void print_hex( const uint8_t *b, size_t len )
 {
     size_t i = 0;
-    const unsigned char *end = b + len;
+    const uint8_t *end = b + len;
     printf("\t");
     while( b < end )
     {
-        printf( "%02X ", (unsigned char) *b++ );
+        printf( "%02X ", (uint8_t) *b++ );
             if( ++i > 25 )
         {
             printf("\n\t");
@@ -227,7 +229,7 @@
  * \retval      number of bytes written in to the b64 buffer or 0 in case no more
  *              data was found
  */
-size_t read_next_b64_code( unsigned char *b64, size_t max_len )
+size_t read_next_b64_code( uint8_t *b64, size_t max_len )
 {
     size_t len = 0;
     uint32_t missed = 0;
@@ -298,6 +300,38 @@
 
 /*
  * This function deserializes and prints to the stdout all obtained information
+ * about the session from provided data. This function was built based on
+ * mbedtls_ssl_session_load(). mbedtls_ssl_session_load() could not be used
+ * due to dependencies on the mbedTLS configuration.
+ *
+ * The data structure in the buffer:
+ *  uint64 start_time;
+ *  uint8 ciphersuite[2];        // defined by the standard
+ *  uint8 compression;           // 0 or 1
+ *  uint8 session_id_len;        // at most 32
+ *  opaque session_id[32];
+ *  opaque master[48];           // fixed length in the standard
+ *  uint32 verify_result;
+ *  opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
+ *  opaque ticket<0..2^24-1>;    // length 0 means no ticket
+ *  uint32 ticket_lifetime;
+ *  uint8 mfl_code;              // up to 255 according to standard
+ *  uint8 trunc_hmac;            // 0 or 1
+ *  uint8 encrypt_then_mac;      // 0 or 1
+ *
+ * /p ssl               pointer to serialized session
+ * /p len               number of bytes in the buffer
+ * /p session_cfg_flag  session configuration flags
+ */
+void print_deserialized_ssl_session( const uint8_t *ssl, uint32_t len,
+                                     int session_cfg_flag )
+{
+    const uint8_t *end = ssl + len;
+    printf( "TODO\n" );
+}
+
+/*
+ * This function deserializes and prints to the stdout all obtained information
  * about the context from provided data. This function was built based on
  * mbedtls_ssl_context_load(). mbedtls_ssl_context_load() could not be used
  * due to dependencies on the mbedTLS configuration and the configuration of
@@ -322,20 +356,24 @@
  * /p ssl   pointer to serialized session
  * /p len   number of bytes in the buffer
  */
-void print_deserialized_ssl( const unsigned char *ssl, size_t len )
+void print_deserialized_ssl_context( const uint8_t *ssl, size_t len )
 {
     /* TODO: which versions are compatible */
     /* TODO: add checking len */
-    const unsigned char *end = ssl + len;
+    const uint8_t *end = ssl + len;
     int session_cfg_flag;
     int context_cfg_flag;
     uint32_t session_len;
+    /* TODO is DTLS compiled? */
+    char dtls_used = 1;
 
     printf( "\nMbed TLS version:\n" );
 
-    printf( "\tmajor:\t%u\n", (unsigned int) *ssl++ );
-    printf( "\tminor:\t%u\n", (unsigned int) *ssl++ );
-    printf( "\tpath:\t%u\n", (unsigned int) *ssl++ );
+    printf( "\tmajor:\t%u\n", (uint32_t) *ssl++ );
+    printf( "\tminor:\t%u\n", (uint32_t) *ssl++ );
+    printf( "\tpath:\t%u\n",  (uint32_t) *ssl++ );
+
+    printf( "\nEnabled session and context configuration:\n" );
 
     session_cfg_flag = ( (int) ssl[0] << 8 ) | ( (int) ssl[1] );
     ssl += 2;
@@ -345,7 +383,6 @@
                        ( (int) ssl[2] ) ;
     ssl += 3;
 
-    printf( "\nEnabled session and context configuration:\n" );
     printf_dbg( "Session config flags 0x%04X\n", session_cfg_flag );
     printf_dbg( "Context config flags 0x%06X\n", context_cfg_flag );
 
@@ -369,6 +406,100 @@
     ssl += 4;
     printf_dbg( "session length %u\n", session_len );
 
+    print_deserialized_ssl_session( ssl, session_len, session_cfg_flag );
+    ssl += session_len;
+
+    /* TODO ssl_populate_transform */
+    printf( "\nRandom bytes: \n");
+    print_hex( ssl, TRANSFORM_RANDBYTE_LEN );
+    printf( "TODO: ssl_populate_transform\n");
+    ssl += TRANSFORM_RANDBYTE_LEN;
+
+    if( CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT & context_cfg_flag )
+    {
+        uint8_t cid_len;
+        printf( "\nDTLS connection ID:\n" );
+
+        cid_len = *ssl++;
+        printf_dbg( "in_cid_len %u\n", (uint32_t) cid_len );
+
+        printf( "\tin_cid:" );
+        print_hex( ssl, cid_len );
+        ssl += cid_len;
+
+        cid_len = *ssl++;
+        printf_dbg( "out_cid_len %u\n", (uint32_t) cid_len );
+
+        printf( "\tout_cid:" );
+        print_hex( ssl, cid_len );
+        ssl += cid_len;
+    }
+
+    if( CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT & context_cfg_flag )
+    {
+        uint32_t badmac_seen = ( (uint32_t) ssl[0] << 24 ) |
+                               ( (uint32_t) ssl[1] << 16 ) |
+                               ( (uint32_t) ssl[2] <<  8 ) |
+                               ( (uint32_t) ssl[3] );
+        ssl += 4;
+        printf( "\tibadmac_seen: %d\n", badmac_seen );
+
+        printf( "\tin_window_top: " );
+        print_hex( ssl, 8 );
+        ssl += 8;
+
+        printf( "\twindow_top: " );
+        print_hex( ssl, 8 );
+        ssl += 8;
+    }
+
+    if( dtls_used )
+    {
+        printf( "\tDTLS datagram packing: %s\n",
+                ( ( *ssl++ ) == 0 ) ?
+                "enabled" : "disabled" );
+    }
+
+    printf( "\tcur_out_ctr: ");
+    print_hex( ssl, 8 );
+    ssl += 8;
+
+    if( dtls_used )
+    {
+        uint16_t mtu = ( ssl[0] << 8 ) | ssl[1];
+        ssl += 2;
+        printf( "\tMTU: %u\n", mtu );
+    }
+
+
+    if( CONTEXT_CONFIG_ALPN_BIT & context_cfg_flag )
+    {
+        uint8_t alpn_len = *ssl++;
+        if( alpn_len > 0 )
+        {
+            if( strlen( (const char*) ssl ) == alpn_len )
+            {
+                printf( "\talpn_chosen: %s\n", ssl );
+            }
+            else
+            {
+                printf_err( "\talpn_len is incorrect\n" );
+            }
+            ssl += alpn_len;
+        }
+        else
+        {
+            printf( "\talpn_chosen: not selected\n" );
+        }
+    }
+
+    /* TODO: check mbedtls_ssl_update_out_pointers( ssl, ssl->transform ); */
+    printf( "TODO: check mbedtls_ssl_update_out_pointers( ssl, ssl->transform );\n" );
+
+    if( 0 < ( end - ssl ) )
+    {
+        printf_dbg( "Left to analyze %u\n", (uint32_t)( end - ssl ) );
+    }
     printf( "\n" );
 }
 
@@ -377,8 +508,8 @@
     enum { B64BUF_LEN = 4 * 1024 };
     enum { SSLBUF_LEN = B64BUF_LEN * 3 / 4 + 1 };
 
-    unsigned char b64[ B64BUF_LEN ];
-    unsigned char ssl[ SSLBUF_LEN ];
+    uint8_t b64[ B64BUF_LEN ];
+    uint8_t ssl[ SSLBUF_LEN ];
     uint32_t b64_counter = 0;
 
     parse_arguments( argc, argv );
@@ -413,7 +544,7 @@
                 print_hex( ssl, ssl_len );
             }
 
-            print_deserialized_ssl( ssl, ssl_len );
+            print_deserialized_ssl_context( ssl, ssl_len );
 
         }
         else
