diff --git a/formats/format_gsm.c b/formats/format_gsm.c
index 5f7b74b00fea78c744aa5bd6d07b4bd4b6efaa4d..0c36fde305ee19d386c05e50be5c2e24b3e1b9c6 100755
--- a/formats/format_gsm.c
+++ b/formats/format_gsm.c
@@ -30,6 +30,8 @@
 #else
 #include <machine/endian.h>
 #endif
+#include "msgsm.h"
+
 
 /* Some Ideas for this code came from makegsme.c by Jeffery Chilton */
 
@@ -45,7 +47,7 @@ struct ast_filestream {
 	struct ast_frame fr;				/* Frame information */
 	char waste[AST_FRIENDLY_OFFSET];	/* Buffer for sending frames, etc */
 	char empty;							/* Empty character */
-	unsigned char gsm[33];				/* Two Real GSM Frames */
+	unsigned char gsm[66];				/* Two Real GSM Frames */
 	int lasttimeout;
 	struct timeval last;
 	int adj;
@@ -233,6 +235,7 @@ static int gsm_play(struct ast_filestream *s)
 static int gsm_write(struct ast_filestream *fs, struct ast_frame *f)
 {
 	int res;
+	unsigned char gsm[66];
 	if (f->frametype != AST_FRAME_VOICE) {
 		ast_log(LOG_WARNING, "Asked to write non-voice frame!\n");
 		return -1;
@@ -241,20 +244,33 @@ static int gsm_write(struct ast_filestream *fs, struct ast_frame *f)
 		ast_log(LOG_WARNING, "Asked to write non-GSM frame (%d)!\n", f->subclass);
 		return -1;
 	}
-	if (f->datalen % 33) {
-		ast_log(LOG_WARNING, "Invalid data length, %d, should be multiple of 33\n", f->datalen);
-		return -1;
-	}
-	if ((res = write(fs->fd, f->data, f->datalen)) != f->datalen) {
-			ast_log(LOG_WARNING, "Bad write (%d/33): %s\n", res, strerror(errno));
+	if (!(f->datalen % 65)) {
+		/* This is in MSGSM format, need to be converted */
+		int len=0;
+		while(len < f->datalen) {
+			conv65(f->data + len, gsm);
+			if ((res = write(fs->fd, gsm, 66)) != 66) {
+				ast_log(LOG_WARNING, "Bad write (%d/66): %s\n", res, strerror(errno));
+				return -1;
+			}
+			len += 65;
+		}
+	} else {
+		if (f->datalen % 33) {
+			ast_log(LOG_WARNING, "Invalid data length, %d, should be multiple of 33\n", f->datalen);
 			return -1;
+		}
+		if ((res = write(fs->fd, f->data, f->datalen)) != f->datalen) {
+				ast_log(LOG_WARNING, "Bad write (%d/33): %s\n", res, strerror(errno));
+				return -1;
+		}
 	}
 	return 0;
 }
 
 static int gsm_seek(struct ast_filestream *fs, long sample_offset, int whence)
 {
-	off_t offset,min,cur,max,distance;
+	off_t offset=0,min,cur,max,distance;
 	
 	min = 0;
 	cur = lseek(fs->fd, 0, SEEK_CUR);
diff --git a/formats/format_wav_gsm.c b/formats/format_wav_gsm.c
index fc6323b670db2cb4b47206409e4da8d37f72fe40..06275402f05e31b198b6cf8ca42693ed75d498ea 100755
--- a/formats/format_wav_gsm.c
+++ b/formats/format_wav_gsm.c
@@ -520,6 +520,7 @@ static int wav_write(struct ast_filestream *fs, struct ast_frame *f)
 	int res;
 	char msdata[66];
 	int len =0;
+	int alreadyms=0;
 	if (f->frametype != AST_FRAME_VOICE) {
 		ast_log(LOG_WARNING, "Asked to write non-voice frame!\n");
 		return -1;
@@ -528,29 +529,42 @@ static int wav_write(struct ast_filestream *fs, struct ast_frame *f)
 		ast_log(LOG_WARNING, "Asked to write non-GSM frame (%d)!\n", f->subclass);
 		return -1;
 	}
+	if (!(f->datalen % 65)) 
+		alreadyms = 1;
 	while(len < f->datalen) {
-		if (fs->secondhalf) {
-			memcpy(fs->gsm + 33, f->data + len, 33);
-			conv66(fs->gsm, msdata);
-			if ((res = write(fs->fd, msdata, 65)) != 65) {
+		if (alreadyms) {
+			fs->secondhalf = 0;
+			if ((res = write(fs->fd, f->data + len, 65)) != 65) {
 				ast_log(LOG_WARNING, "Bad write (%d/65): %s\n", res, strerror(errno));
 				return -1;
 			}
 			fs->bytes += 65;
 			update_header(fs->fd);
+			len += 65;
 		} else {
-			/* Copy the data and do nothing */
-			memcpy(fs->gsm, f->data + len, 33);
+			if (fs->secondhalf) {
+				memcpy(fs->gsm + 33, f->data + len, 33);
+				conv66(fs->gsm, msdata);
+				if ((res = write(fs->fd, msdata, 65)) != 65) {
+					ast_log(LOG_WARNING, "Bad write (%d/65): %s\n", res, strerror(errno));
+					return -1;
+				}
+				fs->bytes += 65;
+				update_header(fs->fd);
+			} else {
+				/* Copy the data and do nothing */
+				memcpy(fs->gsm, f->data + len, 33);
+			}
+			fs->secondhalf = !fs->secondhalf;
+			len += 33;
 		}
-		fs->secondhalf = !fs->secondhalf;
-		len += 33;
 	}
 	return 0;
 }
 
 static int wav_seek(struct ast_filestream *fs, long sample_offset, int whence)
 {
-	off_t offset,distance,cur,min,max;
+	off_t offset=0,distance,cur,min,max;
 	min = 52;
 	cur = lseek(fs->fd, 0, SEEK_CUR);
 	max = lseek(fs->fd, 0, SEEK_END);