diff --git a/src/mod/formats/mod_sndfile/mod_sndfile.c b/src/mod/formats/mod_sndfile/mod_sndfile.c
index 3d70fd41f6..3df7b8a8fa 100644
--- a/src/mod/formats/mod_sndfile/mod_sndfile.c
+++ b/src/mod/formats/mod_sndfile/mod_sndfile.c
@@ -103,7 +103,8 @@ static switch_status_t sndfile_file_open(switch_file_handle_t *handle, const cha
 		context->sfinfo.channels = handle->channels;
 		context->sfinfo.samplerate = handle->samplerate;
 		if (handle->samplerate == 8000 || handle->samplerate == 16000 ||
-			handle->samplerate == 24000 || handle->samplerate == 32000 || handle->samplerate == 48000) {
+			handle->samplerate == 24000 || handle->samplerate == 32000 || handle->samplerate == 48000 ||
+			handle->samplerate == 11025 || handle->samplerate == 22050 || handle->samplerate == 44100) {
 			context->sfinfo.format |= SF_FORMAT_PCM_16;
 		}
 
diff --git a/src/mod/languages/mod_lua/freeswitch_lua.cpp b/src/mod/languages/mod_lua/freeswitch_lua.cpp
index a5c1cd8007..640cfda0b1 100644
--- a/src/mod/languages/mod_lua/freeswitch_lua.cpp
+++ b/src/mod/languages/mod_lua/freeswitch_lua.cpp
@@ -24,20 +24,23 @@ static switch_status_t lua_hanguphook(switch_core_session_t *session_hungup);
 Session::~Session()
 {
 
-	if (channel) {
-		switch_channel_set_private(channel, "CoreSession", NULL);
-	}
-
-	if (hangup_func_str) {
-		if (session) {
-			switch_core_event_hook_remove_state_change(session, lua_hanguphook);
+	if (session) {
+		if (!channel) {
+			channel = switch_core_session_get_channel(session);
 		}
-		switch_safe_free(hangup_func_str);
+		switch_channel_set_private(channel, "CoreSession", NULL);
+		switch_core_event_hook_remove_state_change(session, lua_hanguphook);
+		session = NULL;
+		channel = NULL;
 	}
 
+	switch_safe_free(hangup_func_str);
 	switch_safe_free(hangup_func_arg);
 	switch_safe_free(cb_function);
 	switch_safe_free(cb_arg);
+
+	init_vars();
+	
 }
 
 bool Session::begin_allow_threads()
diff --git a/src/switch_core_file.c b/src/switch_core_file.c
index 1cc3f20d69..ffc69bdb59 100644
--- a/src/switch_core_file.c
+++ b/src/switch_core_file.c
@@ -290,10 +290,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_write(switch_file_handle_t *fh,
 				fh->dbuf = switch_core_alloc(fh->memory_pool, fh->dbuflen);
 			}
 			switch_assert(fh->resampler->to_len <= fh->dbuflen);
-			memcpy(fh->dbuf, fh->resampler->to, fh->resampler->to_len);
+			memcpy(fh->dbuf, fh->resampler->to, fh->resampler->to_len * 2);
 			data = fh->dbuf;
 		} else {
-			memcpy(data, fh->resampler->to, fh->resampler->to_len);
+			memcpy(data, fh->resampler->to, fh->resampler->to_len * 2);
 		}
 
 		*len = fh->resampler->to_len / fh->channels;
diff --git a/src/switch_cpp.cpp b/src/switch_cpp.cpp
index ebd13bf191..cc5d8116ee 100644
--- a/src/switch_cpp.cpp
+++ b/src/switch_cpp.cpp
@@ -888,22 +888,28 @@ SWITCH_DECLARE(void) CoreSession::destroy(void)
 {
 	this_check_void();
 
-	if (channel) {
-		switch_channel_set_private(channel, "CoreSession", NULL);
-	}
-	
 	switch_safe_free(xml_cdr_text);
 	switch_safe_free(uuid);	
 	switch_safe_free(tts_name);
 	switch_safe_free(voice_name);
 
 	if (session) {
+		if (!channel) {
+			channel = switch_core_session_get_channel(session);
+		}
+
+		if (channel) {
+			switch_channel_set_private(channel, "CoreSession", NULL);
+		}
+		
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "destroy/unlink session from object\n");
-        if (switch_test_flag(this, S_HUP) && !switch_channel_test_flag(channel, CF_TRANSFER)) {
+
+        if (switch_channel_up(channel) && switch_test_flag(this, S_HUP) && !switch_channel_test_flag(channel, CF_TRANSFER)) {
             switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
         }
         switch_core_session_rwunlock(session);
 		session = NULL;
+		channel = NULL;
     }
 
 	allocated = 0;