--- a/src/cipher.c
+++ b/src/cipher.c
@@ -8,6 +8,10 @@ cipher module for lua-openssl binding
 #include "openssl.h"
 #include "private.h"
 
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+#define EVP_CIPHER_CTX_reset EVP_CIPHER_CTX_init
+#endif
+
 /***
 list all support cipher algs
 
@@ -109,7 +113,7 @@ static LUA_FUNCTION(openssl_evp_encrypt)
       memcpy(evp_iv, iv, iv_len);
     }
 
-    EVP_CIPHER_CTX_init(c);
+    EVP_CIPHER_CTX_reset(c);
     ret = EVP_EncryptInit_ex(c, cipher, e, (const byte*)evp_key, iv_len > 0 ? (const byte*)evp_iv : NULL);
     if (ret == 1)
     {
@@ -131,8 +135,12 @@ static LUA_FUNCTION(openssl_evp_encrypt)
         OPENSSL_free(buffer);
       }
     }
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+    EVP_CIPHER_CTX_reset(c);
+#else
     EVP_CIPHER_CTX_cleanup(c);
     EVP_CIPHER_CTX_free(c);
+#endif
     return (ret == 1) ? ret : openssl_pushresult(L, ret);
   }
   else
@@ -196,7 +204,7 @@ static LUA_FUNCTION(openssl_evp_decrypt)
       memcpy(evp_iv, iv, iv_len);
     }
 
-    EVP_CIPHER_CTX_init(c);
+    EVP_CIPHER_CTX_reset(c);
     ret = EVP_DecryptInit_ex(c, cipher, e, key ? (const byte*)evp_key : NULL, iv_len > 0 ? (const byte*)evp_iv : NULL);
     if (ret == 1)
     {
@@ -220,8 +228,12 @@ static LUA_FUNCTION(openssl_evp_decrypt)
         OPENSSL_free(buffer);
       }
     }
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+    EVP_CIPHER_CTX_reset(c);
+#else
     EVP_CIPHER_CTX_cleanup(c);
     EVP_CIPHER_CTX_free(c);
+#endif
     return (ret == 1) ? ret : openssl_pushresult(L, ret);
   }
   else
@@ -292,7 +304,7 @@ static LUA_FUNCTION(openssl_evp_cipher)
       memcpy(evp_iv, iv, iv_len);
     }
 
-    EVP_CIPHER_CTX_init(c);
+    EVP_CIPHER_CTX_reset(c);
     ret = EVP_CipherInit_ex(c, cipher, e, (const byte*)evp_key, iv_len > 0 ? (const byte*)evp_iv : NULL, enc);
     if (ret == 1)
     {
@@ -317,8 +329,12 @@ static LUA_FUNCTION(openssl_evp_cipher)
         OPENSSL_free(buffer);
       }
     }
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+    EVP_CIPHER_CTX_reset(c);
+#else
     EVP_CIPHER_CTX_cleanup(c);
     EVP_CIPHER_CTX_free(c);
+#endif
     return (ret == 1) ? ret : openssl_pushresult(L, ret);
   }
   else
@@ -376,7 +392,7 @@ static LUA_FUNCTION(openssl_cipher_new)
       memcpy(evp_iv, iv, iv_len);
     }
     c = EVP_CIPHER_CTX_new();
-    EVP_CIPHER_CTX_init(c);
+    EVP_CIPHER_CTX_reset(c);
     if (!EVP_CipherInit_ex(c, cipher, e, key ? (const byte*)evp_key : NULL, iv_len > 0 ? (const byte*)evp_iv : NULL, enc))
     {
       luaL_error(L, "EVP_CipherInit_ex failed, please check openssl error");
@@ -431,7 +447,7 @@ static LUA_FUNCTION(openssl_cipher_encry
       memcpy(evp_iv, iv, iv_len);
     }
     c = EVP_CIPHER_CTX_new();
-    EVP_CIPHER_CTX_init(c);
+    EVP_CIPHER_CTX_reset(c);
     ret = EVP_EncryptInit_ex(c, cipher, e,
                              key ? (const byte*)evp_key : NULL,
                              iv_len > 0 ? (const byte*)evp_iv : NULL);
@@ -491,7 +507,7 @@ static LUA_FUNCTION(openssl_cipher_decry
       memcpy(evp_iv, iv, iv_len);
     }
     c = EVP_CIPHER_CTX_new();
-    EVP_CIPHER_CTX_init(c);
+    EVP_CIPHER_CTX_reset(c);
     ret = EVP_DecryptInit_ex(c, cipher, e,
                              key ? (const byte*)evp_key : NULL,
                              iv_len > 0 ? (const byte*)evp_iv : NULL);
@@ -937,8 +953,12 @@ static LUA_FUNCTION(openssl_cipher_ctx_f
     return 0;
   lua_pushnil(L);
   lua_rawsetp(L, LUA_REGISTRYINDEX, ctx);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+  EVP_CIPHER_CTX_reset(ctx);
+#else
   EVP_CIPHER_CTX_cleanup(ctx);
   EVP_CIPHER_CTX_free(ctx);
+#endif
   FREE_OBJECT(1);
   return 0;
 }
--- a/src/openssl.c
+++ b/src/openssl.c
@@ -523,9 +523,7 @@ LUALIB_API int luaopen_openssl(lua_State
 #endif
 
 #ifndef OPENSSL_NO_ENGINE
-    ENGINE_load_dynamic();
-    ENGINE_load_openssl();
-    ENGINE_load_builtin_engines();
+    ENGINE_register_all_complete();
 #endif
 #ifdef LOAD_ENGINE_CUSTOM
     LOAD_ENGINE_CUSTOM
--- a/src/th-lock.c
+++ b/src/th-lock.c
@@ -310,7 +310,7 @@ unsigned long irix_thread_id(void)
 
 /* Linux and a few others */
 #ifdef PTHREADS
-#ifndef OPENSSL_SYS_WIN32
+#if !defined(OPENSSL_SYS_WIN32) && (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
 static pthread_mutex_t *lock_cs;
 static long *lock_count;