diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
index cf25b426094a914ef48aa087cbf50f63028d29b5..b349940d3bb2fcdd5c6a083bf6fce24a160ddca7 100644
--- a/client/CMakeLists.txt
+++ b/client/CMakeLists.txt
@@ -1,17 +1,26 @@
 cmake_minimum_required(VERSION 2.8)
 project (dap_client)
-  
-set(CLIENT_SRCS dap_client.c dap_client_internal.c dap_client_remote.c)
+
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(CMAKE_COLOR_MAKEFILE   ON)
+set (CMAKE_CXX_STANDARD 11)
+
+set(CLIENT_SRCS dap_client.c dap_client_internal.c dap_client_remote.c sxmlc/sxmlc.c sxmlc/sxmlsearch.c)
  
 add_library(${PROJECT_NAME} STATIC ${CLIENT_SRCS})
 
 include_directories("${dap_core_INCLUDE_DIRS}")
 include_directories("${dap_crypto_INCLUDE_DIRS}")
-#include_directories("${dap_http_INCLUDE_DIRS}")
+include_directories("${dap_http_INCLUDE_DIRS}")
+include_directories("${dap_core_server_INCLUDE_DIRS}")
 add_definitions ("${dap_core_DEFINITIONS}")
 add_definitions ("${dap_crypto_DEFINITIONS}")
 add_definitions ("${dap_http_DEFINITIONS}")
+add_definitions ("${dap_core_server_DEFINITIONS}")
 
 set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
 
 set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
+
+
+
diff --git a/client/dap_client.c b/client/dap_client.c
index b3190b68c88dadb12e9242ca2fa5a5e60e9ccdb9..ae2ed40b2bb82069d52a72095ac95109c98a550e 100644
--- a/client/dap_client.c
+++ b/client/dap_client.c
@@ -1,12 +1,12 @@
 #include <string.h>
 
-#include "core/dap_common.h"
+#include "dap_common.h"
 
-#include "../http/dap_http_client.h"
+#include "dap_http_client.h"
 
 #include "dap_client.h"
 #include "dap_client_internal.h"
-#include "crypto/dap_enc_key.h"
+#include "dap_enc_key.h"
 
 
 #define LOG_TAG "dap_client"
diff --git a/client/dap_client.h b/client/dap_client.h
index eb2c6fbb0635bdd2cf6e37cb11212c97acc627f3..d83a88741a35100aa95bcb705e220029ea797431 100644
--- a/client/dap_client.h
+++ b/client/dap_client.h
@@ -12,11 +12,11 @@ typedef struct dap_enc_key dap_enc_key_t;
 typedef enum dap_client_stage {
     DAP_CLIENT_STAGE_BEGIN=0,
     DAP_CLIENT_STAGE_ENC=1,
-    DAP_CLIENT_STAGE_AUTH=2,
-    DAP_CLIENT_STAGE_STREAM_CTL=3,
-    DAP_CLIENT_STAGE_STREAM=4,
-    DAP_CLIENT_STAGE_NETCONF=5,
-    DAP_CLIENT_STAGE_TUNNEL=6,
+    DAP_CLIENT_STAGE_STREAM_CTL=2,
+    DAP_CLIENT_STAGE_STREAM=3,
+    DAP_CLIENT_STAGE_NETCONF=4,
+    DAP_CLIENT_STAGE_TUNNEL=5,
+    DAP_CLIENT_STAGE_AUTH=6
 } dap_client_stage_t;
 
 typedef enum dap_client_stage_status {
diff --git a/client/dap_client_internal.c b/client/dap_client_internal.c
index ea5902827aed7baf118770151efdb310858fc38f..a4edd1a3bf7d9a18f2aa3468f84a89d471de0fa2 100644
--- a/client/dap_client_internal.c
+++ b/client/dap_client_internal.c
@@ -13,7 +13,7 @@
 #include "liboqs/kex/kex.h"
 #include "dap_enc_msrln16.h"
 
-#include "../http/dap_http_client_simple.h"
+#include "dap_http_client_simple.h"
 #include "dap_client_internal.h"
 
 #define LOG_TAG "dap_client_internal"
@@ -176,11 +176,29 @@ static void s_stage_status_after(dap_client_internal_t * a_client_internal)
                              a_client_internal->uplink_password, DAP_CLIENT_PROTOCOL_VERSION);
                     log_it(L_DEBUG,"STREAM_CTL request size %u",strlen(l_request));
 
+                    a_client_internal->uplink_protocol_version = DAP_PROTOCOL_VERSION;
+
                     dap_client_internal_request_enc(a_client_internal,
                                                    DAP_UPLINK_PATH_STREAM_CTL,
                                                     "socket_forward","sf=1",l_request,l_request_size,
                                                     m_stream_ctl_response, m_stream_ctl_error);
                 }break;
+                case DAP_CLIENT_STAGE_STREAM:{
+                    log_it(L_INFO,"Go to stage STREAM: prepare the request");
+
+                    size_t l_request_size = strlen( a_client_internal->uplink_user)
+                            + strlen( a_client_internal->uplink_password)+2+10;
+                    char *l_request = DAP_NEW_Z_SIZE (char,l_request_size) ;
+
+                    snprintf(l_request, l_request_size,"%s %s %d",a_client_internal->uplink_user,
+                             a_client_internal->uplink_password, DAP_CLIENT_PROTOCOL_VERSION);
+                    log_it(L_DEBUG,"STREAM request size %u",strlen(l_request));
+
+                    dap_client_internal_request_enc(a_client_internal,
+                                                   DAP_UPLINK_PATH_STREAM,
+                                                    "socket_forward","sf=1",l_request,l_request_size,
+                                                    m_stream_ctl_response, m_stream_ctl_error);
+                }break;
                 default:{
                     log_it(L_ERROR,"Undefined proccessing actions for stage status %s",
                                 dap_client_stage_status_str(a_client_internal->stage_status));
@@ -296,10 +314,10 @@ void dap_client_internal_request_enc(dap_client_internal_t * a_client_internal,
     snprintf(l_url,1024,"http://%s:%u",a_client_internal->uplink_addr, a_client_internal->uplink_port );
     l_url_size = strlen(l_url);
 
-    char *l_sub_url_enc = l_sub_url_size ? (char*) calloc(1,2*l_sub_url_size+16 ): NULL;
-    char *l_query_enc = l_query_size ? (char*) calloc(1,l_query_size*2+16 ):NULL;
+    char *l_sub_url_enc = l_sub_url_size ? (char*) calloc(1,2*(l_sub_url_size+16) ): NULL;
+    char *l_query_enc = l_query_size ? (char*) calloc(1,(l_query_size+16)*2):NULL;
 
-    size_t l_url_full_size_max  = 2*l_sub_url_size + 2*l_query_size + 5 + l_url_size;
+    size_t l_url_full_size_max  = 2*l_sub_url_size + 2*(l_query_size+16) + 5 + l_url_size;
     char * l_url_full = (char*) calloc(1, l_url_full_size_max);
 
     size_t l_request_enc_size_max = a_request_size ?a_request_size*2+16 : 0;
@@ -430,6 +448,10 @@ void m_enc_init_response(dap_client_t * a_client, void * a_response,size_t a_res
             dap_enc_msrln16_key_t* msrln16_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(s_key_domain);
             OQS_KEX_rlwe_msrln16_alice_1(msrln16_key->kex, msrln16_key->private_key, encoded_msg, 2048,&msrln16_key->public_key,&msrln16_key->public_length);
             aes_key_from_msrln_pub(s_key_domain);
+            l_client_internal->session_key_id = (char*)malloc(33);
+            memcpy(l_client_internal->session_key_id,encoded_key,33);
+            l_client_internal->session_key_id[32] = 0;
+            l_client_internal->session_key = s_key_domain;
             free(encoded_key);
             free(encoded_msg);
             l_client_internal->stage_status = DAP_CLIENT_STAGE_STATUS_DONE;
diff --git a/core/dap_common.c b/core/dap_common.c
index 21e3bb90fb18aa8b7840a6d8144feeb2b638943f..bab79dff197d794f2bc4a8eb158080ea34efd785 100644
--- a/core/dap_common.c
+++ b/core/dap_common.c
@@ -74,7 +74,7 @@ int dap_common_init( const char * a_log_file )
 	return 0;
 }
 
-void common_deinit()
+void dap_common_deinit()
 {
     if(s_log_file) fclose(s_log_file);
 }
diff --git a/crypto/dap_enc_aes.c b/crypto/dap_enc_aes.c
index 892168243860c36e5ce34de87eb7e46429846c8b..4131396238c04ac6ff22ffef2f296315187b2acc 100755
--- a/crypto/dap_enc_aes.c
+++ b/crypto/dap_enc_aes.c
@@ -5,12 +5,10 @@
 #include "dap_enc_aes.h"
 #include "dap_enc_key.h"
 
+uint8_t tail_block[] =  {21,27,20,36,16,20,27,31,22,41,27,33,30,21,32,28};
 
-#define AES_BLOCKSIZE 16
 #define AES_KEYSIZE 16
 
-uint8_t tail_block[] =  {21,27,20,36,16,20,27,31,22,41,27,33,30,21,32,28};
-
 #define DAP_ENC_AES_KEY(a) ((dap_enc_aes_key_t *)((a)->_inheritor) )
 
 static void print_bytes(uint8_t *bytes, size_t num_bytes) {
@@ -103,15 +101,15 @@ void dap_enc_aes_key_new_from_data(struct dap_enc_key * a_key, const void * a_in
  * @return
  */
 size_t dap_enc_aes_decode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out)
-{    
-    if(a_in_size % 16 != 0)
-        return 0;
+{
+	if(a_in_size % 16 != 0)
+		return 0;
     OQS_AES128_ECB_dec(a_in,a_in_size,a_key->data,a_out);
     int tail = 0;
-    for(int i =a_in_size-1; i > a_in_size-15; i--)
-        if(*(char*)(a_out + i) == (char)tail_block[i%16])
-            tail++;
-    return a_in_size - tail;
+	for(int i =a_in_size-1; i > a_in_size-15; i--)
+		if(*(char*)(a_out + i) == (char)tail_block[i%16])
+			tail++;  
+	return a_in_size - tail;
 }
 
 /**
diff --git a/crypto/dap_enc_aes.h b/crypto/dap_enc_aes.h
index fe269cb6d843505de890b6be88a664702df9f5e6..611b4cc89595d2d7232be1dd43417231a3929cb5 100755
--- a/crypto/dap_enc_aes.h
+++ b/crypto/dap_enc_aes.h
@@ -4,9 +4,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+#define AES_BLOCK_SIZE 16
 
 struct dap_enc_key;
 
@@ -18,8 +16,4 @@ int test_key_aes();
 size_t dap_enc_aes_decode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out);
 size_t dap_enc_aes_encode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif
diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h
index 20bd576e6d5719fdd60f64667017a7c47aa51d77..2266fb49e3291f8a0c9a0528408078fd153e6879 100644
--- a/crypto/dap_enc_key.h
+++ b/crypto/dap_enc_key.h
@@ -23,11 +23,6 @@
 
 #include <stddef.h>
 #include <time.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 typedef enum dap_enc_data_type{DAP_ENC_DATA_TYPE_RAW,
 
                                DAP_ENC_DATA_TYPE_B64,
@@ -131,8 +126,4 @@ dap_enc_key_t *dap_enc_key_new_from_data(dap_enc_key_type_t a_key_type, void * a
 dap_enc_key_t *dap_enc_key_new_from_str(dap_enc_key_type_t a_key_type, const char *a_key_str);
 void dap_enc_key_delete(dap_enc_key_t * a_key);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif
diff --git a/crypto/dap_enc_msrln16.c b/crypto/dap_enc_msrln16.c
index 72100428677894907008f5e1e2347a78884d9f81..afbb586ddf1a519c568bd05475ad4c97e3a69171 100644
--- a/crypto/dap_enc_msrln16.c
+++ b/crypto/dap_enc_msrln16.c
@@ -1,5 +1,6 @@
-#include "core/dap_common.h"
+#include "dap_common.h"
 #include "dap_enc_msrln16.h"
+#include "dap_enc_aes.h"
 
 #include "liboqs/crypto/rand/rand.h"
 #include "liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h"
@@ -7,6 +8,7 @@
 
 #define LOG_TAG "dap_enc_msrln16"
 
+
 OQS_KEX *kex = NULL;
 
 void *alignce_priv = NULL;
@@ -20,14 +22,6 @@ size_t bob_msg_len;
 uint8_t *bob_key = NULL;
 size_t bob_key_len;
 
-/*struct  dap_enc_param{
-    enum OQS_KEX_alg_name alg_name;
-    char *named_parameters;
-    char *id;
-};
-
-typedef struct dap_enc_sidh16_key{
-} dap_enc_sidh16_key_t;*/
 
 #define PRINT_HEX_STRING(label, str, len)                        \
     {   size_t i;                                                \
@@ -41,8 +35,9 @@ typedef struct dap_enc_sidh16_key{
 
 /**
  * @brief dap_enc_msrln16_key_new_generate
- * @param rand
- * @return
+ * @param a_key Struct for new key
+ * @param a_size Not used
+ * @return Size of a new key
  */
 
 size_t dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size)//(OQS_RAND* rand)
@@ -55,6 +50,8 @@ size_t dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size
 
     a_key->type = DAP_ENC_KEY_TYPE_RLWE_MSRLN16;
     a_key->last_used_timestamp;
+    a_key->dec=dap_enc_aes_decode;
+    a_key->enc=dap_enc_aes_encode;
     dap_enc_msrln16_key_t *msrln16_a_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(a_key);
     msrln16_a_key->private_key = NULL;
 
@@ -73,31 +70,7 @@ size_t dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size
 
 void dap_enc_msrln16_key_new_from_data(OQS_KEX *k, const void * alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len)
 {
-    /*gen = OQS_KEX_rlwe_msrln16_alice_1(k, alice_priv, bob_msg, bob_msg_len, &alice_key, &alice_key_len);
-    if(gen != 1) {
-        printf("OQS_KEX_rlwe_msrln16_alice_1 lose..\n");
-        gen = 0;
-    }
-    PRINT_HEX_STRING("Alice session key", alice_key, alice_key_len);
-
-   if(alice_key_len != bob_key_len) {
-                printf("ERROR: Alice's session key and Bob's session key are different lengths (%zu vs %zu)\n", alice_key_len, bob_key_len);
-                gen = 0;
-            }
-   gen = memcmp(alice_key, bob_key, alice_key_len);
-      if(gen != 0){
-          printf("ERROR: Alice's session key and Bob's session key are not equal\n");
-          PRINT_HEX_STRING("Alice session key", alice_key, alice_key_len);
-          PRINT_HEX_STRING("Bob session key", bob_key, bob_key_len);
 
-          // здесь сделать запись ключа в файл????
-
-          gen = 0;
-      }
-       printf("Alice and Bob's session keys match.\n");
-       printf("\n\n");
-
-      gen = 1;*/
 
 }
 
@@ -112,17 +85,34 @@ void dap_enc_msrln16_key_new_from_data_public(dap_enc_key_t * a_key, const void
 
 }
 
+/**
+ * @brief dap_kex_rlwe_msrln16_new
+ * @param a_key
+ * @param a_in
+ * @param a_in_size
+ */
 OQS_KEX *dap_kex_rlwe_msrln16_new(OQS_RAND *rand){
     return OQS_KEX_rlwe_msrln16_new(rand);
 }
 
+/**
+ * @brief dap_rlwe_msrln16_alice_0
+ * @param a_key
+ * @param a_in
+ * @param a_in_size
+ */
 int dap_rlwe_msrln16_alice_0(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len){
     return OQS_KEX_rlwe_msrln16_alice_0(k, alice_priv, alice_msg, alice_msg_len);
 }
 
+/**
+ * @brief dap_rlwe_msrln16_alice_1
+ * @param a_key
+ * @param a_in
+ * @param a_in_size
+ */
 int dap_rlwe_msrln16_alice_1(OQS_KEX *k, const void *alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len){
     return OQS_KEX_rlwe_msrln16_alice_1(k,alice_priv,bob_msg,bob_msg_len,key,key_len);
-
 }
 
 /**
@@ -131,32 +121,12 @@ int dap_rlwe_msrln16_alice_1(OQS_KEX *k, const void *alice_priv, const uint8_t *
  */
 void dap_enc_msrln16_key_delete(struct dap_enc_key* a_key)
 {
-    //dap_enc_sidh16_key_t *sidh_a_key = DAP_ENC_SIDH16_KEY(a_key);
     dap_enc_msrln16_key_t* msrln_a_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(a_key);
-        (void) a_key;
-        if(!a_key){
-            return;
-        }
-      /*  oqs_sidh_cln16_curve_free((PCurveIsogenyStruct)sidh_a_key->user_curveIsogeny);
-        sidh_a_key->user_curveIsogeny = NULL;*/
-        DAP_DELETE(a_key);
- //   free();
-    /*free(alice_msg);
-    free(alice_key);
-    free(bob_msg);
-    free(bob_key);*/
-    /*if (alice_priv) {*/
-        //free(alice_priv);
-    /*}*/
-    //OQS_KEX k = a_key->
-//    if (!k) {
-//        return;
-//    }
-//    free(k->method_name);
-//    k->method_name = NULL;
-//    free(k);
-//    /*OQS_KEX_rlwe_msrln16_alice_priv_free(kex, alignce_priv);
-   /* OQS_KEX_rlwe_msrln16_free(kex);*/
+    (void) a_key;
+    if(!a_key){
+        return;
+    }
+    DAP_DELETE(a_key);
 }
 
 /**
@@ -191,18 +161,9 @@ size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public
  * @param key_len
  * @return
  */
-//Боб отвечает на приветствие
-size_t dap_enc_msrln16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len)
+size_t dap_enc_msrln16_decode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out)
 {
-    /*gen=OQS_KEX_rlwe_msrln16_bob(k, alice_msg, alice_msg_len, &bob_msg, &bob_msg_len, &bob_key, &bob_key_len);
-    if (gen!=1){
-        //потеряли от боба
-    }
-
-
-    PRINT_HEX_STRING("Bob message", bob_msg, bob_msg_len);
-    PRINT_HEX_STRING("Bob session key", bob_key, bob_key_len);*/
-
+    return dap_enc_aes_decode(a_key,a_in,a_in_size,a_out);
 }
 
 /**
@@ -213,22 +174,20 @@ size_t dap_enc_msrln16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t
  * @param alice_msg_len
  * @return
  */
-
-
-//Алиса приветствует
-size_t dap_enc_msrln16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len)
+size_t dap_enc_msrln16_encode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out)
 {
-    /*gen=OQS_KEX_rlwe_msrln16_alice_0(k ,alice_priv, alice_msg, alice_msg_len);
-    if (gen!=1){
-        //потеряли от алисы
-    }
-   PRINT_HEX_STRING("Alice message", alice_msg, alice_msg_len);*/
+    return dap_enc_aes_encode(a_key,a_in,a_in_size,a_out);
 }
 
-
+/**
+ * @brief aes_key_from_msrln_pub
+ * @param key Key for conversion
+ */
 void aes_key_from_msrln_pub(dap_enc_key_t* key){
-    //TODO: More difflicult aes generation
     dap_enc_msrln16_key_t* msrln_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(key);
     key->data = (unsigned char *)malloc(16);
     memcpy(key->data,msrln_key->public_key,16);
+    key->data_size = 16;
 }
+
+
diff --git a/crypto/dap_enc_msrln16.h b/crypto/dap_enc_msrln16.h
index 583ef4ee57b2eac7cd3be926e889a4997b84555c..11b39d2bc2c084bacf9189b1ba3a1b6a3877a22b 100644
--- a/crypto/dap_enc_msrln16.h
+++ b/crypto/dap_enc_msrln16.h
@@ -43,8 +43,8 @@ void dap_enc_msrln16_key_delete(struct dap_enc_key* a_key);
 /*?*/size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public);
 
 //size_t dap_enc_msrln16_decode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out);
-size_t dap_enc_msrln16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len);
-size_t dap_enc_msrln16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len);
+size_t dap_enc_msrln16_decode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out);
+size_t dap_enc_msrln16_encode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out);
 //size_t dap_enc_msrln16_encode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out);
 void aes_key_from_msrln_pub(dap_enc_key_t* key);
 
diff --git a/crypto/liboqs/crypto/aes/aes.c b/crypto/liboqs/crypto/aes/aes.c
index 78854711441fececa3ad630c88e7da6501504618..c77a799ddc178c944eb79e060a5f175c31fec774 100644
--- a/crypto/liboqs/crypto/aes/aes.c
+++ b/crypto/liboqs/crypto/aes/aes.c
@@ -3,10 +3,6 @@
 #include "aes.h"
 #include "aes_local.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 void OQS_AES128_load_schedule(const uint8_t *key, void **schedule, int for_encryption) {
 #ifdef USE_OPENSSL
 	oqs_aes128_load_schedule_ossl(key, schedule, for_encryption);
@@ -195,10 +191,4 @@ inline void oqs_aes128_ecb_dec_sch_ossl(const uint8_t *ciphertext, const size_t
 	assert(1 == EVP_DecryptFinal_ex((EVP_CIPHER_CTX *) schedule, plaintext, &outlen));
 }
 
-
-
-#endif
-
-#ifdef __cplusplus
-}
 #endif
diff --git a/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c b/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c
index 178f9830bce38ee9e187ca1191efea93ea10346d..5151901a9778abf8a81a23cc53e40ccd5648a4e1 100644
--- a/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c
+++ b/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c
@@ -241,7 +241,66 @@ cleanup:
 	return ret;
 }
 
+int OQS_KEX_sidh_cln16_alice_1(OQS_KEX *k, const void *alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len) {
 
+	int ret;
+	// decompression values
+	unsigned char *R = NULL, *A = NULL;
+
+	if (!k || !alice_priv || !bob_msg || !key || !key_len) {
+		return 0;
+	}
+
+	*key = NULL;
+
+	int compressed = isCompressed(k->named_parameters);
+
+	*key = malloc(SIDH_SHAREDKEY_LEN);
+	if (*key == NULL) {
+		goto err;
+	}
+	*key_len = SIDH_SHAREDKEY_LEN;
+
+	if (compressed) {
+		if (bob_msg_len != SIDH_COMPRESSED_PUBKEY_LEN) {
+			goto err;
+		}
+		A = malloc(SIDH_COMPRESSED_A_LEN);
+		if (A == NULL) {
+			goto err;
+		}
+		R = malloc(SIDH_COMPRESSED_R_LEN);
+		if (R == NULL) {
+			goto err;
+		}
+		// compute Alice's shared secret
+		oqs_sidh_cln16_PublicKeyBDecompression_A((unsigned char *) alice_priv, (unsigned char *) bob_msg, R, A, k->ctx);
+		if (oqs_sidh_cln16_EphemeralSecretAgreement_Compression_A((unsigned char *) alice_priv, R, A, (unsigned char *) *key, k->ctx) != SIDH_CRYPTO_SUCCESS) {
+			goto err;
+		}
+	} else {
+		if (bob_msg_len != SIDH_PUBKEY_LEN) {
+			goto err;
+		}
+		if (oqs_sidh_cln16_EphemeralSecretAgreement_A((unsigned char *) alice_priv, (unsigned char *) bob_msg, (unsigned char *) *key, k->ctx) != SIDH_CRYPTO_SUCCESS) {
+			goto err;
+		}
+	}
+
+	ret = 1;
+	goto cleanup;
+
+err:
+	ret = 0;
+	free(*key);
+	*key = NULL;
+
+cleanup:
+	free(A);
+	free(R);
+
+	return ret;
+}
 
 void OQS_KEX_sidh_cln16_alice_priv_free(UNUSED OQS_KEX *k, void *alice_priv) {
 	if (alice_priv) {
diff --git a/http/CMakeLists.txt b/http/CMakeLists.txt
index 247ce38b74a0bf8894fbbc8d74ce6d8099d2e2bc..7a3ac86a0625037a40c1b35a7ee95ad8ff48dd96 100644
--- a/http/CMakeLists.txt
+++ b/http/CMakeLists.txt
@@ -8,8 +8,10 @@ target_link_libraries(${PROJECT_NAME}  curl)
 
 include_directories("${dap_core_INCLUDE_DIRS}")
 include_directories("${dap_client_INCLUDE_DIRS}")
+include_directories("${dap_http_server_INCLUDE_DIRS}")
 add_definitions ("${dap_core_DEFINITIONS}")
 add_definitions ("${dap_client_DEFINITIONS}")
+add_definitions ("${dap_http_server_DEFINITIONS}")
 
 set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
 
diff --git a/http/dap_http_client.c b/http/dap_http_client.c
index 96da5a673874605a67daab713e5defbbf0ac8bc0..77396057fec4f7a57dcd606d4e91fe061c5f8213 100644
--- a/http/dap_http_client.c
+++ b/http/dap_http_client.c
@@ -25,10 +25,10 @@
 #include <libgen.h>
 #include "dap_common.h"
 #include "dap_client_remote.h"
+#include "dap_http.h"
 
 #ifdef DAP_SERVER
-#include "dap_server.h"
-#include "dap_http.h"
+#include "../../libdap-server/core_server/dap_server.h"
 #endif
 #include "dap_http_header.h"
 #include "dap_http_client.h"
@@ -223,7 +223,7 @@ cnt:switch(cl_ht->state_read){
                         cl_ht->state_read=DAP_HTTP_CLIENT_STATE_HEADERS;
                     }
                     else{
-                        log_it(L_WARNINGNG, "Input: unprocessed URL request %s is rejected", d_name);
+                        log_it(L_WARNING, "Input: unprocessed URL request %s is rejected", d_name);
                         cl_ht->state_read=DAP_HTTP_CLIENT_STATE_NONE;
                         dap_client_ready_to_read(cl_ht->client,true);
                         dap_client_ready_to_write(cl_ht->client,true);