(void **);
 
     canl_err_code (*client_init)
-        (glb_ctx *, void *);
+        (glb_ctx *, void **);
 
     canl_err_code (*server_init)
-        (glb_ctx *, void *);
+        (glb_ctx *, void **);
 
     canl_err_code (*free_ctx)
        (glb_ctx *, void *);
 
+    canl_err_code (*free_global_ctx) /* XXX: ???? */
+       (glb_ctx *, void *);
+
     canl_err_code (*connect)
         (glb_ctx *, void *, io_handler *, struct timeval *, const char *);
 
 void free_hostent(struct hostent *h); //TODO is there some standard funcion to free hostent?
 int asyn_getservbyname(int a_family, asyn_result *ares_result,char const *name, 
         struct timeval *timeout);
-int ssl_client_init(glb_ctx *cc, io_handler *io);
-int ssl_server_init(glb_ctx *cc);
+int ssl_client_init(glb_ctx *cc, void **ctx);
+int ssl_server_init(glb_ctx *cc, void **ctx);
 int ssl_free(glb_ctx *cc, void *ctx);
 int ssl_connect(glb_ctx *cc, io_handler *io, struct timeval *timeout, const char * host);
 int ssl_accept(glb_ctx *cc, io_handler *io,
 
     return 0;
 }
 
-int ssl_server_init(glb_ctx *cc)
+int ssl_server_init(glb_ctx *cc, void **ctx)
 {
     int err = 0;
     unsigned long ssl_err = 0;
     char *ca_cert_fn, *user_cert_fn, *user_key_fn, *user_proxy_fn;
     char *ca_cert_dirn = NULL;
     ca_cert_fn = user_cert_fn = user_key_fn = user_proxy_fn = NULL;
+    SSL_CTX *ssl_ctx = NULL;
 
     if (!cc) {
        return EINVAL;
     //OpenSSL_add_all_ciphers();
     ERR_clear_error();
 
-    cc->ssl_ctx = SSL_CTX_new(SSL_SERVER_METH);
-    if (!cc->ssl_ctx){
+    ssl_ctx = SSL_CTX_new(SSL_SERVER_METH);
+    if (!ssl_ctx){
         err = ERR_get_error();
         e_orig = ssl_error;
         goto end;
     free(user_proxy_fn);
     user_proxy_fn = NULL;
 
-    SSL_CTX_load_verify_locations(cc->ssl_ctx, ca_cert_fn, ca_cert_dirn);
+    SSL_CTX_load_verify_locations(ssl_ctx, ca_cert_fn, ca_cert_dirn);
     free(ca_cert_fn);
     ca_cert_fn = NULL;
     free(ca_cert_dirn);
     ca_cert_dirn = NULL;
 
-    //err = SSL_CTX_set_cipher_list(cc->ssl_ctx, "ALL:!LOW:!EXP:!MD5:!MD2");
-    err = SSL_CTX_set_cipher_list(cc->ssl_ctx, "ALL");
+    //err = SSL_CTX_set_cipher_list(ssl_ctx, "ALL:!LOW:!EXP:!MD5:!MD2");
+    err = SSL_CTX_set_cipher_list(ssl_ctx, "ALL");
     if (!err) {
         ssl_err = ERR_get_error();
         set_error(cc, ssl_err, e_orig, "no cipher to use");
     }
     err = 0;
 
-    //SSL_CTX_set_purpose(cc->ssl_ctx, X509_PURPOSE_ANY);
-    //SSL_CTX_set_mode(cc->ssl_ctx, SSL_MODE_AUTO_RETRY);
+    //SSL_CTX_set_purpose(ssl_ctx, X509_PURPOSE_ANY);
+    //SSL_CTX_set_mode(ssl_ctx, SSL_MODE_AUTO_RETRY);
     // TODO proxy_verify_callback, verify_none only for testing !!!!!!!
-    SSL_CTX_set_verify(cc->ssl_ctx, SSL_VERIFY_NONE, proxy_verify_callback);
+    SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_NONE, proxy_verify_callback);
     //SSL_CTX_set_verify_depth(ctx, 100);
-    SSL_CTX_set_cert_verify_callback(cc->ssl_ctx, proxy_app_verify_callback, 0);
+    SSL_CTX_set_cert_verify_callback(ssl_ctx, proxy_app_verify_callback, 0);
     if (cc->cert_key) {
         if (cc->cert_key->cert) {
-            err = SSL_CTX_use_certificate(cc->ssl_ctx, cc->cert_key->cert);
+            err = SSL_CTX_use_certificate(ssl_ctx, cc->cert_key->cert);
             if (err != 1) {
                 ssl_err = ERR_get_error();
                 e_orig = ssl_error;
                 err = 0;
         }
         if (cc->cert_key->key) {
-            err = SSL_CTX_use_PrivateKey(cc->ssl_ctx, cc->cert_key->key);
+            err = SSL_CTX_use_PrivateKey(ssl_ctx, cc->cert_key->key);
             if (err != 1) {
                 ssl_err = ERR_get_error();
                 e_orig = ssl_error;
         return 1;
     }
     /*Make sure the key and certificate file match*/
-    if ( (err = SSL_CTX_check_private_key(cc->ssl_ctx)) != 1) {
+    if ( (err = SSL_CTX_check_private_key(ssl_ctx)) != 1) {
         ssl_err = ERR_get_error();
         e_orig = ssl_error;
         set_error(cc, ssl_err, e_orig, "Private key does not match"
                 " the certificate public key"); 
         return 1;
     }
-    else
-        err = 0;
+
+    err = 0;
+    *ctx = ssl_ctx;
 
 end:
     if (ssl_err) {
     return 0;
 }
 
-int ssl_client_init(glb_ctx *cc, io_handler *io)
+int ssl_client_init(glb_ctx *cc, void **ctx)
 {
     unsigned long ssl_err = 0;
     int err = 0;
     char *ca_cert_fn, *user_cert_fn, *user_key_fn, *user_proxy_fn;
     char *ca_cert_dirn = NULL;
     ca_cert_fn = user_cert_fn = user_key_fn = user_proxy_fn = NULL;
+    SSL_CTX *ssl_ctx = NULL;
 
     if (!cc) {
         return EINVAL;
     }
-    if (!io) {
-        err = EINVAL;
-        e_orig = posix_error;
-        goto end;
-    }
 
     //OpenSSL_add_all_algorithms();
     //OpenSSL_add_all_ciphers();
     ERR_clear_error();
 
-    cc->ssl_ctx = SSL_CTX_new(SSL_CLIENT_METH);
-    if (!cc->ssl_ctx){
+    ssl_ctx = SSL_CTX_new(SSL_CLIENT_METH);
+    if (!ssl_ctx){
         ssl_err = ERR_get_error();
         e_orig = ssl_error;
         goto end;
     free(user_proxy_fn);
     user_proxy_fn = NULL;
 
-    SSL_CTX_load_verify_locations(cc->ssl_ctx, ca_cert_fn, ca_cert_dirn);
+    SSL_CTX_load_verify_locations(ssl_ctx, ca_cert_fn, ca_cert_dirn);
     free(ca_cert_fn);
     ca_cert_fn = NULL;
     free(ca_cert_dirn);
     ca_cert_dirn = NULL;
     
-    //err = SSL_CTX_set_cipher_list(cc->ssl_ctx, "ALL:!LOW:!EXP:!MD5:!MD2");
-    err = SSL_CTX_set_cipher_list(cc->ssl_ctx, "ALL");
+    //err = SSL_CTX_set_cipher_list(ssl_ctx, "ALL:!LOW:!EXP:!MD5:!MD2");
+    err = SSL_CTX_set_cipher_list(ssl_ctx, "ALL");
     if (!err) {
         ssl_err = ERR_get_error();
         set_error(cc, ssl_err, e_orig, "no cipher to use");
     }
     err = 0;
 
-    //SSL_CTX_set_options(cc->ssl_ctx, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS | SSL_OP_NO_SSLv2);
+    //SSL_CTX_set_options(ssl_ctx, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS | SSL_OP_NO_SSLv2);
     //TODO testing 
-    SSL_CTX_set_verify(cc->ssl_ctx, SSL_VERIFY_NONE, proxy_verify_callback);
+    SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_NONE, proxy_verify_callback);
     //SSL_CTX_set_verify_depth(ctx, 100);
     //SSL_CTX_load_verify_locations(ctx, NULL, cacertdir);
-    //SSL_CTX_set_purpose(cc->ssl_ctx, X509_PURPOSE_ANY);
-    //SSL_CTX_set_mode(cc->ssl_ctx, SSL_MODE_AUTO_RETRY);
+    //SSL_CTX_set_purpose(ssl_ctx, X509_PURPOSE_ANY);
+    //SSL_CTX_set_mode(ssl_ctx, SSL_MODE_AUTO_RETRY);
 
 
     if (cc->cert_key) {
         if (cc->cert_key->key) {
-            err = SSL_CTX_use_PrivateKey(cc->ssl_ctx, cc->cert_key->key);
+            err = SSL_CTX_use_PrivateKey(ssl_ctx, cc->cert_key->key);
             if (err != 1) {
                 ssl_err = ERR_get_error();
                 e_orig = ssl_error;
             }
         }
         else if (cc->cert_key->cert) {
-            err = SSL_CTX_use_certificate(cc->ssl_ctx, cc->cert_key->cert);
+            err = SSL_CTX_use_certificate(ssl_ctx, cc->cert_key->cert);
             if (err != 1) {
                 ssl_err = ERR_get_error();
                 e_orig = ssl_error;
         }
     }
 
+    *ctx = ssl_ctx;
+
 end:
     if (ssl_err) {
         set_error(cc, ssl_err, e_orig, "cannot initialize SSL context");