diff --git a/configure.ac b/configure.ac
index 8a8bb102a7..c6f24f9252 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1352,7 +1352,21 @@ PKG_CHECK_MODULES([MPG123], [libmpg123 >= 1.16.0],[
   AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_MPG123],[false])])
 
 PKG_CHECK_MODULES([SHOUT], [shout >= 2.2.2],[
-  AM_CONDITIONAL([HAVE_SHOUT],[true])],[
+  AM_CONDITIONAL([HAVE_SHOUT],[true])
+  SHOUT_VERSION="`$PKG_CONFIG --modversion shout`"
+  SHOUT_MAJOR_VERSION="`echo $SHOUT_VERSION | cut -d. -f1`"
+  SHOUT_MINOR_VERSION="`echo $SHOUT_VERSION | cut -d. -f2`"
+  SHOUT_PATCH_VERSION="`echo $SHOUT_VERSION | cut -d. -f3`"
+  test -n "$SHOUT_PATCH_VERSION" || SHOUT_PATCH_VERSION=0
+  AC_MSG_NOTICE([SHOUT version: $SHOUT_VERSION])
+  AC_MSG_NOTICE([SHOUT major version: $SHOUT_MAJOR_VERSION])
+  AC_MSG_NOTICE([SHOUT minor version: $SHOUT_MINOR_VERSION])
+  AC_MSG_NOTICE([SHOUT patch version: $SHOUT_PATCH_VERSION])
+  AC_SUBST([SHOUT_VERSION])
+  AC_SUBST([SHOUT_MAJOR_VERSION])
+  AC_SUBST([SHOUT_MINOR_VERSION])
+  AC_SUBST([SHOUT_PATCH_VERSION])
+  ],[
   AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SHOUT],[false])])
 
 mp3lame=false
diff --git a/src/include/switch_curl.h b/src/include/switch_curl.h
index 5872527865..bad116daf2 100644
--- a/src/include/switch_curl.h
+++ b/src/include/switch_curl.h
@@ -40,6 +40,9 @@ typedef int switch_CURLINFO;
 typedef int switch_CURLcode;
 typedef int switch_CURLoption;
 
+#define HAVE_SWITCH_CURL_MIME
+typedef void switch_curl_mime;
+
 SWITCH_DECLARE(switch_CURL *) switch_curl_easy_init(void);
 SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_perform(switch_CURL *handle);
 SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_getinfo(switch_CURL *curl, switch_CURLINFO info, ... );
@@ -50,7 +53,9 @@ SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_setopt(CURL *handle, switch_CUR
 SWITCH_DECLARE(const char *) switch_curl_easy_strerror(switch_CURLcode errornum );
 SWITCH_DECLARE(void) switch_curl_init(void);
 SWITCH_DECLARE(void) switch_curl_destroy(void);
-SWITCH_DECLARE(switch_status_t) switch_curl_process_form_post_params(switch_event_t *event, switch_CURL *curl_handle, struct curl_httppost **formpostp);
+SWITCH_DECLARE(switch_status_t) switch_curl_process_mime(switch_event_t *event, switch_CURL *curl_handle, switch_curl_mime **mimep);
+SWITCH_DECLARE(void) switch_curl_mime_free(switch_curl_mime **mimep);
+SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_setopt_mime(switch_CURL *curl_handle, switch_curl_mime *mime);
 #define switch_curl_easy_setopt curl_easy_setopt
 
 SWITCH_END_EXTERN_C
diff --git a/src/include/test/switch_fct.h b/src/include/test/switch_fct.h
index 8cb07cc20f..b28feabb74 100644
--- a/src/include/test/switch_fct.h
+++ b/src/include/test/switch_fct.h
@@ -255,7 +255,7 @@ fctstr_safe_cpy(char *dst, char const *src, size_t num)
 #if defined(WIN32) && _MSC_VER >= 1400
     strncpy_s(dst, num, src, _TRUNCATE);
 #else
-    strncpy(dst, src, num);
+    strncpy(dst, src, num - 1);
 #endif
     dst[num-1] = '\0';
 }
@@ -760,6 +760,7 @@ fct_nlist__init2(fct_nlist_t *list, size_t start_sz)
         list->itm_list = (void**)malloc(sizeof(void*)*start_sz);
         if ( list->itm_list == NULL )
         {
+            list->used_itm_num = 0;
             return 0;
         }
     }
diff --git a/src/mod/applications/mod_cidlookup/mod_cidlookup.c b/src/mod/applications/mod_cidlookup/mod_cidlookup.c
index 55d7aa0d90..5531222197 100644
--- a/src/mod/applications/mod_cidlookup/mod_cidlookup.c
+++ b/src/mod/applications/mod_cidlookup/mod_cidlookup.c
@@ -347,7 +347,7 @@ static size_t file_callback(void *ptr, size_t size, size_t nmemb, void *data)
 	return realsize;
 }
 
-static long do_lookup_url(switch_memory_pool_t *pool, switch_event_t *event, char **response, const char *query, struct curl_httppost *post,
+static long do_lookup_url(switch_memory_pool_t *pool, switch_event_t *event, char **response, const char *query, switch_curl_mime *post,
 						  switch_curl_slist_t *headers, int timeout)
 {
 	switch_time_t start_time = switch_micro_time_now();
@@ -373,7 +373,7 @@ static long do_lookup_url(switch_memory_pool_t *pool, switch_event_t *event, cha
 		switch_curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
 	}
 	if (post) {
-		switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, post);
+		switch_curl_easy_setopt_mime(curl_handle, post);
 	} else {
 		switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1);
 	}
diff --git a/src/mod/applications/mod_curl/mod_curl.c b/src/mod/applications/mod_curl/mod_curl.c
index 02079d6767..c780e6947e 100644
--- a/src/mod/applications/mod_curl/mod_curl.c
+++ b/src/mod/applications/mod_curl/mod_curl.c
@@ -104,8 +104,13 @@ struct http_sendfile_data_obj {
 	char *extrapost_elements;
 	switch_CURL *curl_handle;
 	char *cacert;
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	curl_mime *mime;
+	curl_mimepart *part;
+#else
 	struct curl_httppost *formpost;
 	struct curl_httppost *lastptr;
+#endif
 	uint8_t flags; /* This is for where to send output of the curl_sendfile commands */
 	switch_stream_handle_t *stream;
 	char *sendfile_response;
@@ -456,8 +461,19 @@ static void http_sendfile_initialize_curl(http_sendfile_data_t *http_data)
 	curl_easy_setopt(http_data->curl_handle, CURLOPT_WRITEFUNCTION, http_sendfile_response_callback);
 	curl_easy_setopt(http_data->curl_handle, CURLOPT_WRITEDATA, (void *) http_data);
 
+	/* Initial http_data->mime */
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	http_data->mime = curl_mime_init(http_data->curl_handle);
+#endif
+
 	/* Add the file to upload as a POST form field */
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	http_data->part = curl_mime_addpart(http_data->mime);
+	curl_mime_name(http_data->part, http_data->filename_element_name);
+	curl_mime_filedata(http_data->part, http_data->filename_element);
+#else
 	curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, http_data->filename_element_name, CURLFORM_FILE, http_data->filename_element, CURLFORM_END);
+#endif
 
 	if(!zstr(http_data->extrapost_elements))
 	{
@@ -476,16 +492,32 @@ static void http_sendfile_initialize_curl(http_sendfile_data_t *http_data)
 			if(argc2 == 2) {
 				switch_url_decode(argv2[0]);
 				switch_url_decode(argv2[1]);
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+				http_data->part = curl_mime_addpart(http_data->mime);
+				curl_mime_name(http_data->part, argv2[0]);
+				curl_mime_data(http_data->part, argv2[1], CURL_ZERO_TERMINATED);
+#else
 				curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, argv2[0], CURLFORM_COPYCONTENTS, argv2[1], CURLFORM_END);
+#endif
 			}
 		}
 	}
 
 	/* Fill in the submit field too, even if this isn't really needed */
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	http_data->part = curl_mime_addpart(http_data->mime);
+	curl_mime_name(http_data->part, "submit");
+	curl_mime_data(http_data->part, "or_die", CURL_ZERO_TERMINATED);
+#else
 	curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, "submit", CURLFORM_COPYCONTENTS, "or_die", CURLFORM_END);
+#endif
 
 	/* what URL that receives this POST */
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	curl_easy_setopt(http_data->curl_handle, CURLOPT_MIMEPOST, http_data->mime);
+#else
 	curl_easy_setopt(http_data->curl_handle, CURLOPT_HTTPPOST, http_data->formpost);
+#endif
 
 	// This part actually fires off the curl, captures the HTTP response code, and then frees up the handle.
 	curl_easy_perform(http_data->curl_handle);
@@ -494,7 +526,11 @@ static void http_sendfile_initialize_curl(http_sendfile_data_t *http_data)
 	curl_easy_cleanup(http_data->curl_handle);
 
 	// Clean up the form data from POST
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	curl_mime_free(http_data->mime);
+#else
 	curl_formfree(http_data->formpost);
+#endif
 }
 
 static switch_status_t http_sendfile_test_file_open(http_sendfile_data_t *http_data, switch_event_t *event)
diff --git a/src/mod/applications/mod_httapi/mod_httapi.c b/src/mod/applications/mod_httapi/mod_httapi.c
index 4b32d87c6d..1254a6f93c 100644
--- a/src/mod/applications/mod_httapi/mod_httapi.c
+++ b/src/mod/applications/mod_httapi/mod_httapi.c
@@ -1419,7 +1419,7 @@ static switch_status_t httapi_sync(client_t *client)
 	switch_status_t status = SWITCH_STATUS_FALSE;
 	int get_style_method = 0;
 	char *method = NULL;
-	struct curl_httppost *formpost=NULL;
+	switch_curl_mime *formpost = NULL;
 	switch_event_t *save_params = NULL;
 	const char *put_file;
 	FILE *fd = NULL;
@@ -1476,7 +1476,7 @@ static switch_status_t httapi_sync(client_t *client)
 	}
 
 	if (!put_file) {
-		switch_curl_process_form_post_params(client->params, curl_handle, &formpost);
+		switch_curl_process_mime(client->params, curl_handle, &formpost);
 	}
 
 	if (formpost) {
@@ -1588,7 +1588,7 @@ static switch_status_t httapi_sync(client_t *client)
 		curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, put_file_read);
 
 	} else if (formpost) {
-		curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost);
+		switch_curl_easy_setopt_mime(curl_handle, formpost);
 	} else {
 		switch_curl_easy_setopt(curl_handle, CURLOPT_POST, !get_style_method);
 	}
@@ -1670,9 +1670,7 @@ static switch_status_t httapi_sync(client_t *client)
 	switch_curl_easy_cleanup(curl_handle);
 	switch_curl_slist_free_all(headers);
 
-	if (formpost) {
-		curl_formfree(formpost);
-	}
+	switch_curl_mime_free(&formpost);
 
 	if (client->err) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error encountered! [%s]\ndata: [%s]\n", client->profile->url, data);
diff --git a/src/mod/applications/mod_http_cache/azure.c b/src/mod/applications/mod_http_cache/azure.c
index f1e4cf8925..a16d2e9f94 100644
--- a/src/mod/applications/mod_http_cache/azure.c
+++ b/src/mod/applications/mod_http_cache/azure.c
@@ -279,7 +279,11 @@ switch_status_t azure_blob_finalise_put(http_profile_t *profile, const char *url
 		goto done;
 	}
 
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x070c01)
+	switch_curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
+#else
 	switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
+#endif
 	switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
 	switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
 	switch_curl_easy_setopt(curl_handle, CURLOPT_URL, full_url);
diff --git a/src/mod/applications/mod_http_cache/mod_http_cache.c b/src/mod/applications/mod_http_cache/mod_http_cache.c
index 9d19099e56..365ba27425 100644
--- a/src/mod/applications/mod_http_cache/mod_http_cache.c
+++ b/src/mod/applications/mod_http_cache/mod_http_cache.c
@@ -393,7 +393,9 @@ static switch_status_t http_put(url_cache_t *cache, http_profile_t *profile, swi
 			goto done;
 		}
 		switch_curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
+#if !defined(LIBCURL_VERSION_NUM) || (LIBCURL_VERSION_NUM < 0x070c01)
 		switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
+#endif
 		switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
 		switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
 		switch_curl_easy_setopt(curl_handle, CURLOPT_URL, full_url);
diff --git a/src/mod/codecs/mod_ilbc/mod_ilbc.c b/src/mod/codecs/mod_ilbc/mod_ilbc.c
index 14d67d372e..2588cdf46b 100644
--- a/src/mod/codecs/mod_ilbc/mod_ilbc.c
+++ b/src/mod/codecs/mod_ilbc/mod_ilbc.c
@@ -48,7 +48,7 @@ static switch_status_t switch_ilbc_fmtp_parse(const char *fmtp, switch_codec_fmt
 
 		memset(codec_fmtp, '\0', sizeof(struct switch_codec_fmtp));
 
-		if (fmtp && (mode = strstr(fmtp, "mode=")) && (mode + 5)) {
+		if (fmtp && (mode = strstr(fmtp, "mode=")) && *(mode + 5)) {
 			codec_ms = atoi(mode + 5);
 		}
 		if (!codec_ms) {
diff --git a/src/mod/databases/mod_mariadb/mod_mariadb.c b/src/mod/databases/mod_mariadb/mod_mariadb.c
index 7926ec0c3f..5f32e8e90d 100644
--- a/src/mod/databases/mod_mariadb/mod_mariadb.c
+++ b/src/mod/databases/mod_mariadb/mod_mariadb.c
@@ -411,7 +411,7 @@ switch_status_t mariadb_finish_results_real(const char* file, const char* func,
 				if ((status = mysql_next_result(&handle->con))) {
 					if (status > 0) {
 						err_str = mariadb_handle_get_error(handle);
-						switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "An error occurred trying to get next for query (%s): %s\n", handle->sql, err_str);
+						switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "An error occurred trying to get next for query (%s): %s\n", handle->sql, switch_str_nil(err_str));
 						switch_safe_free(err_str);
 
 						break;
diff --git a/src/mod/endpoints/mod_rtmp/handshake.h b/src/mod/endpoints/mod_rtmp/handshake.h
index 19c77810b0..bfbea48289 100644
--- a/src/mod/endpoints/mod_rtmp/handshake.h
+++ b/src/mod/endpoints/mod_rtmp/handshake.h
@@ -42,6 +42,7 @@
 #if OPENSSL_VERSION_NUMBER < 0x0090800 || !defined(SHA256_DIGEST_LENGTH)
 #error Your OpenSSL is too old, need 0.9.8 or newer with SHA256
 #endif
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
 #if OPENSSL_VERSION_NUMBER < 0x10100000L
 #define HMAC_setup(ctx, key, len)	HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, key, len, EVP_sha256(), 0)
 #define HMAC_crunch(ctx, buf, len)	HMAC_Update(&ctx, buf, len)
@@ -51,6 +52,7 @@
 #define HMAC_crunch(ctx, buf, len)HMAC_Update(ctx, buf, len)
 #define HMAC_finish(ctx, dig, dlen) HMAC_Final(ctx, dig, &dlen); HMAC_CTX_free(ctx)
 #endif
+#endif
 
 #define FP10
 #define RTMP_SIG_SIZE 1536
@@ -155,9 +157,13 @@ static unsigned int GetDigestOffset1(uint8_t *handshake, unsigned int len)
 static getoff *digoff[] = {GetDigestOffset1, GetDigestOffset2};
 // static getoff *dhoff[] = {GetDHOffset1, GetDHOffset2};
 
-static void HMACsha256(const uint8_t *message, size_t messageLen, const uint8_t *key, size_t keylen, uint8_t *digest)
+static void HMACsha256(const uint8_t *message, size_t messageLen, const uint8_t *key, int keylen, uint8_t *digest)
 {
 	unsigned int digestLen;
+
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+	HMAC(EVP_sha256(), key, keylen, (uint8_t *)message, messageLen, digest, &digestLen);
+#else
 #if OPENSSL_VERSION_NUMBER < 0x10100000L
 	HMAC_CTX ctx;
 #else
@@ -167,11 +173,12 @@ static void HMACsha256(const uint8_t *message, size_t messageLen, const uint8_t
 	HMAC_setup(ctx, key, (int)keylen);
 	HMAC_crunch(ctx, message, messageLen);
 	HMAC_finish(ctx, digest, digestLen);
+#endif
 
 	assert(digestLen == 32);
 }
 
-static void CalculateDigest(unsigned int digestPos, uint8_t *handshakeMessage, const uint8_t *key, size_t keyLen, uint8_t *digest)
+static void CalculateDigest(unsigned int digestPos, uint8_t *handshakeMessage, const uint8_t *key, int keyLen, uint8_t *digest)
 {
 	const int messageLen = RTMP_SIG_SIZE - SHA256_DIGEST_LENGTH;
 	uint8_t message[RTMP_SIG_SIZE - SHA256_DIGEST_LENGTH];
@@ -184,7 +191,7 @@ static void CalculateDigest(unsigned int digestPos, uint8_t *handshakeMessage, c
 	HMACsha256(message, messageLen, key, keyLen, digest);
 }
 
-static int VerifyDigest(unsigned int digestPos, uint8_t *handshakeMessage, const uint8_t *key, size_t keyLen)
+static int VerifyDigest(unsigned int digestPos, uint8_t *handshakeMessage, const uint8_t *key, int keyLen)
 {
 	uint8_t calcDigest[SHA256_DIGEST_LENGTH];
 
diff --git a/src/mod/endpoints/mod_skinny/skinny_protocol.h b/src/mod/endpoints/mod_skinny/skinny_protocol.h
index 0ae1772521..574f2a907e 100644
--- a/src/mod/endpoints/mod_skinny/skinny_protocol.h
+++ b/src/mod/endpoints/mod_skinny/skinny_protocol.h
@@ -92,14 +92,14 @@ char* skinny_codec2string(skinny_codecs skinnycodec);
 /*****************************************************************************/
 
 #define skinny_create_message(message,msgtype,field) \
-    message = calloc(1, 12 + sizeof(message->data.field)); \
+    message = calloc(1, sizeof(skinny_message_t)); \
     message->type = msgtype; \
     message->length = 4 + sizeof(message->data.field)
 
 #define skinny_create_empty_message(message,msgtype) \
-    message = calloc(1, 12); \
-    message->type = msgtype; \
-    message->length = 4
+    message = calloc(1, sizeof(skinny_empty_message_t)); \
+    ((skinny_empty_message_t *)message)->type = msgtype; \
+    ((skinny_empty_message_t *)message)->length = 4
 
 
 /* KeepAliveMessage */
@@ -937,6 +937,12 @@ union skinny_data {
 #pragma pack(push, r1, 1)
 #endif
 
+struct PACKED skinny_empty_message {
+	uint32_t length;
+	uint32_t version;
+	uint32_t type;
+};
+
 /*
  * header is length+version
  * body is type+data
@@ -954,6 +960,7 @@ struct PACKED skinny_message {
 #endif
 
 typedef struct skinny_message skinny_message_t;
+typedef struct skinny_empty_message skinny_empty_message_t;
 
 
 
diff --git a/src/mod/event_handlers/mod_kazoo/kazoo_commands.c b/src/mod/event_handlers/mod_kazoo/kazoo_commands.c
index 6d956376a8..16f00ad1a0 100644
--- a/src/mod/event_handlers/mod_kazoo/kazoo_commands.c
+++ b/src/mod/event_handlers/mod_kazoo/kazoo_commands.c
@@ -366,7 +366,9 @@ SWITCH_STANDARD_API(kz_http_put)
 		goto done;
 	}
 	switch_curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
+#if !defined(LIBCURL_VERSION_NUM) || (LIBCURL_VERSION_NUM < 0x070c01)
 	switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
+#endif
 	switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
 	switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
 	switch_curl_easy_setopt(curl_handle, CURLOPT_URL, url);
diff --git a/src/mod/formats/mod_shout/Makefile.am b/src/mod/formats/mod_shout/Makefile.am
index ace4ce4af4..6318d312a0 100644
--- a/src/mod/formats/mod_shout/Makefile.am
+++ b/src/mod/formats/mod_shout/Makefile.am
@@ -7,8 +7,8 @@ if HAVE_MP3LAME
 
 mod_LTLIBRARIES = mod_shout.la
 mod_shout_la_SOURCES  = mod_shout.c
-mod_shout_la_CFLAGS   = $(AM_CFLAGS)
-mod_shout_la_CPPFLAGS = $(CURL_CFLAGS) $(AM_CPPFLAGS) $(SHOUT_CFLAGS) $(MP3LAME_CFLAGS) $(MPG123_CFLAGS)
+mod_shout_la_CFLAGS   = $(AM_CFLAGS) -DSHOUT_VERSION=$(SHOUT_VERSION) -DSHOUT_MAJOR_VERSION=$(SHOUT_MAJOR_VERSION) -DSHOUT_MINOR_VERSION=$(SHOUT_MINOR_VERSION) -DSHOUT_PATCH_VERSION=$(SHOUT_PATCH_VERSION)
+mod_shout_la_CPPFLAGS = $(CURL_CFLAGS) $(AM_CPPFLAGS) $(SHOUT_CFLAGS) $(MP3LAME_CFLAGS) $(MPG123_CFLAGS) -DSHOUT_VERSION=$(SHOUT_VERSION) -DSHOUT_MAJOR_VERSION=$(SHOUT_MAJOR_VERSION) -DSHOUT_MINOR_VERSION=$(SHOUT_MINOR_VERSION) -DSHOUT_PATCH_VERSION=$(SHOUT_PATCH_VERSION)
 mod_shout_la_LIBADD   = $(switch_builddir)/libfreeswitch.la
 mod_shout_la_LDFLAGS  = $(CURL_LIBS) -avoid-version -module -no-undefined -shared $(SHOUT_LIBS) $(MP3LAME_LIBS) $(MPG123_LIBS)
 
diff --git a/src/mod/formats/mod_shout/mod_shout.c b/src/mod/formats/mod_shout/mod_shout.c
index 14cba068d3..be05ba5c32 100644
--- a/src/mod/formats/mod_shout/mod_shout.c
+++ b/src/mod/formats/mod_shout/mod_shout.c
@@ -51,6 +51,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_shout_load);
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_shout_shutdown);
 SWITCH_MODULE_DEFINITION(mod_shout, mod_shout_load, mod_shout_shutdown, NULL);
 
+#define CHECK_SHOUT_MIN_VERSION(major, minor, patch) \
+		(SHOUT_MAJOR_VERSION > major || \
+		(SHOUT_MAJOR_VERSION == major && SHOUT_MINOR_VERSION > minor) || \
+		(SHOUT_MAJOR_VERSION == major && SHOUT_MINOR_VERSION == minor && SHOUT_PATCH_VERSION >= patch))
+
 static char *supported_formats[SWITCH_MAX_CODECS] = { 0 };
 
 static struct {
@@ -463,7 +468,11 @@ static size_t stream_callback(void *ptr, size_t size, size_t nmemb, void *data)
 	return 0;
 }
 
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x072000)
+static int progress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
+#else
 static int progress_callback(void *clientp,   double dltotal,   double dlnow,   double ultotal,   double ulnow)
+#endif
 {
 	shout_context_t *context = (shout_context_t *) clientp;
 	return context->err;
@@ -496,8 +505,13 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void
 	switch_mutex_unlock(context->audio_mutex);
 	curl_handle = switch_curl_easy_init();
 	switch_curl_easy_setopt(curl_handle, CURLOPT_URL, context->stream_url);
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x072000)
+	curl_easy_setopt(curl_handle, CURLOPT_XFERINFOFUNCTION, progress_callback);
+	curl_easy_setopt(curl_handle, CURLOPT_XFERINFODATA, (void *)context);
+#else
 	curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, progress_callback);
 	curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, (void *)context);
+#endif
 	switch_curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1);
 	switch_curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 10);
 	switch_curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, stream_callback);
@@ -862,12 +876,20 @@ static switch_status_t shout_file_open(switch_file_handle_t *handle, const char
 				goto error;
 			}
 
+#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
+			if (shout_set_meta(context->shout, SHOUT_META_URL, "http://www.freeswitch.org") != SHOUTERR_SUCCESS) {
+#else
 			if (shout_set_url(context->shout, "http://www.freeswitch.org") != SHOUTERR_SUCCESS) {
+#endif
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
 				goto error;
 			}
 
+#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
+			if (shout_set_meta(context->shout, SHOUT_META_DESCRIPTION, "FreeSWITCH mod_shout Broadcasting Module") != SHOUTERR_SUCCESS) {
+#else
 			if (shout_set_description(context->shout, "FreeSWITCH mod_shout Broadcasting Module") != SHOUTERR_SUCCESS) {
+#endif
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting description: %s\n", shout_get_error(context->shout));
 				goto error;
 			}
@@ -877,7 +899,11 @@ static switch_status_t shout_file_open(switch_file_handle_t *handle, const char
 				goto error;
 			}
 
+#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
+			if (shout_set_content_format(context->shout, SHOUT_FORMAT_MP3, SHOUT_USAGE_AUDIO, NULL) != SHOUTERR_SUCCESS) {
+#else
 			if (shout_set_format(context->shout, SHOUT_FORMAT_MP3) != SHOUTERR_SUCCESS) {
+#endif
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting format: %s\n", shout_get_error(context->shout));
 				goto error;
 			}
@@ -1127,21 +1153,33 @@ static switch_status_t shout_file_set_string(switch_file_handle_t *handle, switc
 
 	switch (col) {
 	case SWITCH_AUDIO_COL_STR_TITLE:
+#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
+		if (shout_set_meta(context->shout, SHOUT_META_NAME, string) == SHOUTERR_SUCCESS) {
+#else
 		if (shout_set_name(context->shout, string) == SHOUTERR_SUCCESS) {
+#endif
 			status = SWITCH_STATUS_SUCCESS;
 		} else {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
 		}
 		break;
 	case SWITCH_AUDIO_COL_STR_COMMENT:
+#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
+		if (shout_set_meta(context->shout, SHOUT_META_URL, string) == SHOUTERR_SUCCESS) {
+#else
 		if (shout_set_url(context->shout, string) == SHOUTERR_SUCCESS) {
+#endif
 			status = SWITCH_STATUS_SUCCESS;
 		} else {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
 		}
 		break;
 	case SWITCH_AUDIO_COL_STR_ARTIST:
+#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
+		if (shout_set_meta(context->shout, SHOUT_META_DESCRIPTION, string) == SHOUTERR_SUCCESS) {
+#else
 		if (shout_set_description(context->shout, string) == SHOUTERR_SUCCESS) {
+#endif
 			status = SWITCH_STATUS_SUCCESS;
 		} else {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
diff --git a/src/switch_apr.c b/src/switch_apr.c
index 9bc5d8a759..bd6cfdec56 100644
--- a/src/switch_apr.c
+++ b/src/switch_apr.c
@@ -74,7 +74,16 @@
 #if (defined(HAVE_LIBMD5) || defined(HAVE_LIBMD) || defined(HAVE_MD5INIT))
 #include <md5.h>
 #elif defined(HAVE_LIBCRYPTO)
-#include <openssl/md5.h>
+	#ifndef OPENSSL_VERSION_NUMBER
+		#include <openssl/opensslv.h>
+	#endif
+	#if OPENSSL_VERSION_NUMBER < 0x30000000
+		#include <openssl/md5.h>
+	#else
+		#include <openssl/evp.h>
+	#endif
+#else
+	#include <apr_md5.h>
 #endif
 
 #ifndef WIN32
@@ -1174,11 +1183,24 @@ SWITCH_DECLARE(switch_status_t) switch_md5(unsigned char digest[SWITCH_MD5_DIGES
 
 	return SWITCH_STATUS_SUCCESS;
 #elif defined(HAVE_LIBCRYPTO)
-	MD5_CTX md5_context;
+	#if OPENSSL_VERSION_NUMBER < 0x30000000
+		MD5_CTX md5_context;
 
-	MD5_Init(&md5_context);
-	MD5_Update(&md5_context, input, inputLen);
-	MD5_Final(digest, &md5_context);
+		MD5_Init(&md5_context);
+		MD5_Update(&md5_context, input, inputLen);
+		MD5_Final(digest, &md5_context);
+	#else
+		EVP_MD_CTX *md5_context;
+
+		/* MD5_Init */
+		md5_context = EVP_MD_CTX_new();
+		EVP_DigestInit_ex(md5_context, EVP_md5(), NULL);
+		/* MD5_Update */
+		EVP_DigestUpdate(md5_context, input, inputLen);
+		/* MD5_Final */
+		EVP_DigestFinal_ex(md5_context, digest, NULL);
+		EVP_MD_CTX_free(md5_context);
+	#endif
 
 	return SWITCH_STATUS_SUCCESS;
 #else
diff --git a/src/switch_core_cert.c b/src/switch_core_cert.c
index c4fdd84210..64f497ea1a 100644
--- a/src/switch_core_cert.c
+++ b/src/switch_core_cert.c
@@ -287,7 +287,10 @@ SWITCH_DECLARE(int) switch_core_gen_certs(const char *prefix)
 
 	//bio_err=BIO_new_fp(stderr, BIO_NOCLOSE);
 
-	mkcert(&x509, &pkey, 4096, 0, 36500);
+	if (!mkcert(&x509, &pkey, 4096, 0, 36500)) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Certificate generation failed\n");
+		goto end;
+	}
 
 	//RSA_print_fp(stdout, pkey->pkey.rsa, 0);
 	//X509_print_fp(stdout, x509);
@@ -410,7 +413,9 @@ static int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days
 {
 	X509 *x;
 	EVP_PKEY *pk;
+#if OPENSSL_VERSION_NUMBER < 0x30000000
 	RSA *rsa;
+#endif
 	X509_NAME *name=NULL;
 
 	switch_assert(pkeyp);
@@ -432,7 +437,26 @@ static int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days
 		x = *x509p;
 	}
 
-#if OPENSSL_VERSION_NUMBER >= 0x10100000
+#if OPENSSL_VERSION_NUMBER >= 0x30000000
+	{
+		EVP_PKEY_CTX *ctx;
+
+		ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
+		/* Setup the key context */
+		if ((!ctx) || (EVP_PKEY_keygen_init(ctx) <= 0) || (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) <= 0)) {
+			abort();
+			goto err;
+		}
+
+		/* Generate key */
+		if (EVP_PKEY_generate(ctx, &pk) <= 0) {
+			abort();
+			goto err;
+		}
+
+		EVP_PKEY_CTX_free(ctx);
+	}
+#elif OPENSSL_VERSION_NUMBER >= 0x10100000
 	rsa = RSA_new();
 	{
 		static const BN_ULONG ULONG_RSA_F4 = RSA_F4;
@@ -449,11 +473,13 @@ static int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days
 	rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);
 #endif
 
+#if OPENSSL_VERSION_NUMBER < 0x30000000
 	if (!EVP_PKEY_assign_RSA(pk, rsa)) {
 		abort();
 	}
 
 	rsa = NULL;
+#endif
 
 	X509_set_version(x, 2);
 	ASN1_INTEGER_set(X509_get_serialNumber(x), serial);
@@ -476,13 +502,21 @@ static int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days
 	 */
 	X509_set_issuer_name(x, name);
 
-	if (!X509_sign(x, pk, EVP_sha1()))
+#if OPENSSL_VERSION_NUMBER >= 0x30000000
+	if (!X509_sign(x, pk, EVP_sha256())) {
+#else
+	if (!X509_sign(x, pk, EVP_sha1())) {
+#endif
 		goto err;
+	}
 
 	*x509p = x;
 	*pkeyp = pk;
+
 	return(1);
- err:
+err:
+	ERR_print_errors_fp(stdout);
+
 	return(0);
 }
 
diff --git a/src/switch_core_media.c b/src/switch_core_media.c
index e75387581d..0d8670622c 100644
--- a/src/switch_core_media.c
+++ b/src/switch_core_media.c
@@ -1170,7 +1170,7 @@ static uint32_t parse_lifetime_mki(const char **p, const char *end)
 					val += ((**p) - '0') * i;
 				}
 				res |= (val & 0x000000ff);					/* MKI_SIZE */
-			} else if (isdigit(*(field_begin + 1)) && (field_begin + 2) && (*(field_begin + 2) == '^') && (field_begin + 3) && isdigit(*(field_begin + 3))) {
+			} else if (isdigit(*(field_begin + 1)) && (*(field_begin + 2) == '^') && isdigit(*(field_begin + 3))) {
 				res |= (CRYPTO_KEY_MATERIAL_LIFETIME << 24);
 				val = ((uint32_t) (*(field_begin + 1) - '0')) << 8;
 				res |= val;									/* LIFETIME base. */
diff --git a/src/switch_curl.c b/src/switch_curl.c
index c99a5f61de..d6cfd6ce19 100644
--- a/src/switch_curl.c
+++ b/src/switch_curl.c
@@ -58,11 +58,16 @@ SWITCH_DECLARE(void) switch_curl_destroy(void)
 	curl_global_cleanup();
 }
 
-SWITCH_DECLARE(switch_status_t) switch_curl_process_form_post_params(switch_event_t *event, switch_CURL *curl_handle, struct curl_httppost **formpostp)
+SWITCH_DECLARE(switch_status_t) switch_curl_process_mime(switch_event_t *event, switch_CURL *curl_handle, switch_curl_mime **mimep)
 {
-
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	curl_mime *mime = NULL;
+	curl_mimepart *part = NULL;
+	uint8_t added = 0;
+#else
 	struct curl_httppost *formpost=NULL;
 	struct curl_httppost *lastptr=NULL;
+#endif
 	switch_event_header_t *hp;
 	int go = 0;
 
@@ -77,39 +82,87 @@ SWITCH_DECLARE(switch_status_t) switch_curl_process_form_post_params(switch_even
 		return SWITCH_STATUS_FALSE;
 	}
 
-	for (hp = event->headers; hp; hp = hp->next) {
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	mime = curl_mime_init(curl_handle);
+#endif
 
+	for (hp = event->headers; hp; hp = hp->next) {
 		if (!strncasecmp(hp->name, "attach_file:", 12)) {
 			char *pname = strdup(hp->name + 12);
 
 			if (pname) {
 				char *fname = strchr(pname, ':');
+
 				if (fname) {
 					*fname++ = '\0';
 
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+					part = curl_mime_addpart(mime);
+					curl_mime_name(part, pname);
+					curl_mime_filename(part, fname);
+					curl_mime_filedata(part, hp->value);
+					added++;
+#else
 					curl_formadd(&formpost,
 								 &lastptr,
 								 CURLFORM_COPYNAME, pname,
 								 CURLFORM_FILENAME, fname,
 								 CURLFORM_FILE, hp->value,
 								 CURLFORM_END);
+#endif
 				}
+
 				free(pname);
 			}
 		} else {
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+			part = curl_mime_addpart(mime);
+			curl_mime_name(part, hp->name);
+			curl_mime_data(part, hp->value, CURL_ZERO_TERMINATED);
+			added++;
+#else
 			curl_formadd(&formpost,
 						 &lastptr,
 						 CURLFORM_COPYNAME, hp->name,
 						 CURLFORM_COPYCONTENTS, hp->value,
 						 CURLFORM_END);
-
+#endif
 		}
 	}
 
-	*formpostp = formpost;
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	if (!added) {
+		curl_mime_free(mime);
+		mime = NULL;
+	}
+
+	*mimep = mime;
+#else
+	*mimep = formpost;
+#endif
 
 	return SWITCH_STATUS_SUCCESS;
+}
 
+SWITCH_DECLARE(void) switch_curl_mime_free(switch_curl_mime **mimep)
+{
+	if (mimep && *mimep) {
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+		curl_mime_free(*mimep);
+#else
+		curl_formfree(*mimep);
+#endif
+		mimep = NULL;
+	}
+}
+
+SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_setopt_mime(switch_CURL *curl_handle, switch_curl_mime *mime)
+{
+#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
+	return curl_easy_setopt(curl_handle, CURLOPT_MIMEPOST, mime);
+#else
+	return curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, mime);
+#endif
 }
 
 /* For Emacs:
diff --git a/src/switch_rtp.c b/src/switch_rtp.c
index 94106aec84..17ba4867f3 100644
--- a/src/switch_rtp.c
+++ b/src/switch_rtp.c
@@ -3643,7 +3643,11 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d
 	const SSL_METHOD *ssl_method;
 	SSL_CTX *ssl_ctx;
 	BIO *bio;
+#if OPENSSL_VERSION_NUMBER >= 0x30000000
+	EVP_PKEY *dh_pk;
+#else
 	DH *dh;
+#endif
 	switch_status_t status = SWITCH_STATUS_SUCCESS;
 #ifndef OPENSSL_NO_EC
 #if OPENSSL_VERSION_NUMBER < 0x10002000L
@@ -3723,13 +3727,21 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d
 	switch_assert(dtls->ssl_ctx);
 
 	bio = BIO_new_file(dtls->pem, "r");
+#if OPENSSL_VERSION_NUMBER < 0x30000000
 	dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
 	BIO_free(bio);
 	if (dh) {
 		SSL_CTX_set_tmp_dh(dtls->ssl_ctx, dh);
 		DH_free(dh);
 	}
+#else 
+	if((dh_pk = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL)) != NULL) {
+		SSL_CTX_set0_tmp_dh_pkey(dtls->ssl_ctx, dh_pk);
+		EVP_PKEY_free(dh_pk);
+	}
 
+	BIO_free(bio);
+#endif
 	SSL_CTX_set_mode(dtls->ssl_ctx, SSL_MODE_AUTO_RETRY);
 
 	//SSL_CTX_set_verify(dtls->ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
diff --git a/src/switch_utils.c b/src/switch_utils.c
index 332137ebda..7561835e69 100644
--- a/src/switch_utils.c
+++ b/src/switch_utils.c
@@ -2380,7 +2380,7 @@ SWITCH_DECLARE(int) switch_cmp_addr(switch_sockaddr_t *sa1, switch_sockaddr_t *s
 			return (s1->sin_addr.s_addr == s2->sin_addr.s_addr && s1->sin_port == s2->sin_port);
 		}
 	case AF_INET6:
-		if (s16->sin6_addr.s6_addr && s26->sin6_addr.s6_addr) {
+		{
 			int i;
 
 			if (!ip_only) {
@@ -2434,7 +2434,7 @@ SWITCH_DECLARE(int) switch_cp_addr(switch_sockaddr_t *sa1, switch_sockaddr_t *sa
 
 		return 1;
 	case AF_INET6:
-		if (s16->sin6_addr.s6_addr && s26->sin6_addr.s6_addr) {
+		{
 			int i;
 
 			s16->sin6_port = s26->sin6_port;