diff --git a/client/dap_client_internal.c b/client/dap_client_internal.c
index a4edd1a3bf7d9a18f2aa3468f84a89d471de0fa2..4516968efa33fe052f6b6697ada99d53a49d90bf 100644
--- a/client/dap_client_internal.c
+++ b/client/dap_client_internal.c
@@ -105,7 +105,7 @@ static void s_stage_status_after(dap_client_internal_t * a_client_internal)
                     char *sendMsg = malloc(out_msg_size * 2  + 1024);
 
                     char* encrypt_msg = malloc(out_msg_size * 2);
-                    dap_enc_base64_encode(out_msg,out_msg_size, encrypt_msg);
+                    dap_enc_base64_encode(out_msg,out_msg_size, encrypt_msg,DAP_ENC_STANDARD_B64);
 
                     strcat(sendMsg,encrypt_msg);
 
@@ -443,8 +443,8 @@ void m_enc_init_response(dap_client_t * a_client, void * a_response,size_t a_res
             char* encoded_key = malloc(key_size);
             memset(encoded_key,0,key_size);
             uint8_t *encoded_msg = malloc(msg_size);
-            dap_enc_base64_decode(a_response,key_size,encoded_key);
-            dap_enc_base64_decode(msg_index+1,msg_size,encoded_msg);
+            dap_enc_base64_decode(a_response,key_size,encoded_key,DAP_ENC_STANDARD_B64);
+            dap_enc_base64_decode(msg_index+1,msg_size,encoded_msg,DAP_ENC_STANDARD_B64);
             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);
diff --git a/crypto/dap_enc.c b/crypto/dap_enc.c
index 8777246862f658813542f1339aa9da3b3dbb31bb..bf3a4615492ee51e7307b53f4c23db41c299a615 100644
--- a/crypto/dap_enc.c
+++ b/crypto/dap_enc.c
@@ -64,28 +64,19 @@ size_t dap_enc_code(struct dap_enc_key * key,const void * buf,const size_t buf_s
 {
     if(key->enc){
         void *proc_buf = NULL;
-        switch(data_type_out){
-            case DAP_ENC_DATA_TYPE_B64_URLSAFE:
-            case DAP_ENC_DATA_TYPE_B64:{
-                proc_buf=calloc(1,buf_size*2);
-            }break;
-            case DAP_ENC_DATA_TYPE_RAW:{
-                proc_buf=buf_out;
-            }break;
-        }
+        if(data_type_out == DAP_ENC_DATA_TYPE_RAW)
+            proc_buf=buf_out;
+        else
+            proc_buf=calloc(1,buf_size*2);
         size_t ret=key->enc(key,buf,buf_size,proc_buf);
-        if( (data_type_out==DAP_ENC_DATA_TYPE_B64) ||( data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE ) ){
-            ret=dap_enc_base64_encode(proc_buf,ret,buf_out);
+        if(data_type_out==DAP_ENC_DATA_TYPE_B64){
+            ret=dap_enc_base64_encode(proc_buf,ret,buf_out,DAP_ENC_STANDARD_B64);
+            if (proc_buf)
+            	free(proc_buf);
+        }else if(data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE){
+            ret=dap_enc_base64_encode(proc_buf,ret,buf_out,DAP_ENC_STANDARD_B64_URLSAFE);
             if (proc_buf)
             	free(proc_buf);
-            if( data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE ){
-                size_t i;
-                for(i=0;i<ret;i++)
-                    if( ((char*)buf_out)[i] == '/' )
-                        ((char*)buf_out)[i] = '_';
-            }
-
-            return ret;
         }
         return ret;
     }else{
@@ -109,14 +100,13 @@ size_t dap_enc_decode(struct dap_enc_key * key,const void * buf, const size_t bu
     size_t proc_buf_size = 0;
     switch(data_type_in){
         case DAP_ENC_DATA_TYPE_B64_URLSAFE:{
-            size_t i;
-            for(i=0;i<buf_size;i++)
-                if( ((char*)buf)[i] == '_' )
-                    ((char*)buf)[i] = '/';
-        }
+            proc_buf=calloc(1,buf_size);
+            proc_buf_size= dap_enc_base64_decode((const char*) buf,buf_size,proc_buf,DAP_ENC_STANDARD_B64_URLSAFE);
+            proc_buf_const=proc_buf;
+        }break;
         case DAP_ENC_DATA_TYPE_B64:{
             proc_buf=calloc(1,buf_size);
-            proc_buf_size= dap_enc_base64_decode((const char*) buf,buf_size,proc_buf);
+            proc_buf_size= dap_enc_base64_decode((const char*) buf,buf_size,proc_buf,DAP_ENC_STANDARD_B64);
             proc_buf_const=proc_buf;
         }break;
         case DAP_ENC_DATA_TYPE_RAW:{
@@ -127,7 +117,7 @@ size_t dap_enc_decode(struct dap_enc_key * key,const void * buf, const size_t bu
 
     if(key->dec){
         size_t ret=key->dec(key,proc_buf_const,proc_buf_size,buf_out);
-        if(data_type_in==DAP_ENC_DATA_TYPE_B64)
+        if(data_type_in==DAP_ENC_DATA_TYPE_B64 || DAP_ENC_DATA_TYPE_B64_URLSAFE)
         	if (proc_buf)
         		free(proc_buf);
         return ret;
diff --git a/crypto/dap_enc_base64.c b/crypto/dap_enc_base64.c
index aff8e0027f3ff3480a406f4579e7a7238bf7e7b6..d5ba199d1fb37dec3299a323e892ce6d1a25b669 100755
--- a/crypto/dap_enc_base64.c
+++ b/crypto/dap_enc_base64.c
@@ -85,7 +85,7 @@ b64_decode_ex (const char *, size_t, size_t *);
  * @param out
  * @return
  */
-size_t dap_enc_base64_decode(const char * in, size_t in_size,void * out)
+size_t dap_enc_base64_decode(const char * in_raw, size_t in_size,void * out, dap_enc_b64_standard_t standard)
 {
     //B64_Decode( in, in_size, (byte*) out );
     //return B64_GetSize( in_size,0 );
@@ -98,6 +98,18 @@ size_t dap_enc_base64_decode(const char * in, size_t in_size,void * out)
     unsigned char buf[3];
     unsigned char tmp[4];
 
+    char* in = (char*)malloc(in_size);
+    memcpy(in,in_raw,in_size);
+
+    if(standard == DAP_ENC_STANDARD_B64_URLSAFE)
+        for(int i=0; i < in_size; i++)
+        {
+            if(in[i] == '_')
+                in[i] = '/';
+            else if(in[i] == '-')
+                in[i] = '+';
+        }
+
     // alloc
     //dec = (unsigned char *) b64_malloc(1);
     if (NULL == out) { return 0; }
@@ -181,7 +193,7 @@ size_t dap_enc_base64_decode(const char * in, size_t in_size,void * out)
  * @param a_out
  * @return
  */
-size_t dap_enc_base64_encode(const void * a_in, size_t a_in_size, char * a_out)
+size_t dap_enc_base64_encode(const void * a_in, size_t a_in_size, char * a_out, dap_enc_b64_standard_t standard)
 {
   int i = 0;
   int j = 0;
@@ -240,6 +252,16 @@ size_t dap_enc_base64_encode(const void * a_in, size_t a_in_size, char * a_out)
 
   // Make sure we have enough space to add '\0' character at end.
   a_out[size] = '\0';
+
+    if(standard == DAP_ENC_STANDARD_B64_URLSAFE)
+    for(int i=0; i < size; i++)
+    {
+        if(a_out[i] == '/')
+            a_out[i] = '_';
+        else if(a_out[i] == '+')
+            a_out[i] = '-';
+    }
+
   return size;
 }
 
diff --git a/crypto/dap_enc_base64.h b/crypto/dap_enc_base64.h
index c0e7eb0c53c40116e6262ab6e598125f58cdc885..be44ffad70b776bdf89297d994290133571ce0d5 100755
--- a/crypto/dap_enc_base64.h
+++ b/crypto/dap_enc_base64.h
@@ -6,8 +6,14 @@
 extern "C" {
 #endif
 
-size_t dap_enc_base64_decode(const char * in, size_t in_size,void * out);
-size_t dap_enc_base64_encode(const void * in, size_t in_size,char * out);
+typedef enum dap_enc_b64_standard{DAP_ENC_STANDARD_B64,
+
+                                  DAP_ENC_STANDARD_B64_URLSAFE,
+
+                                  } dap_enc_b64_standard_t;
+
+size_t dap_enc_base64_decode(const char * in, size_t in_size, void * out, dap_enc_b64_standard_t standard);
+size_t dap_enc_base64_encode(const void * in, size_t in_size, char * out, dap_enc_b64_standard_t standard);
 
 #ifdef __cplusplus
 }