diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index 3db003ec7bac8b54426b251e1b34bc7675a72706..dd345061d18ac6c44f85e3da8d43da4bccf6c5f6 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -479,7 +479,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if(argc>1)
 		JS_ValueToInt32(cx,argv[1],&len);
 
-	if((linebuf=(char*)malloc(len+1))==NULL)
+	if((linebuf=(char*)malloc((len*2)+2))==NULL) /* room for ^A codes */
 		return(JS_FALSE);
 
 	outbuf[0]=0;
@@ -492,18 +492,24 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		else if(inbuf[i]=='\t') {
 			if((col%8)==0)
 				col++;
-			while(col%8)
-				col++;
+			col+=(col%8);
+		} else if(inbuf[i]==CTRL_A && inbuf[i+1]!=0) {
+			if(l<(len*2)) {
+				strncpy(linebuf+l,inbuf+i,2);
+				l+=2;
+			}
+			i+=2;
+			continue;
 		} else if(inbuf[i]>=' ')
 			col++;
 		linebuf[l]=inbuf[i++];
-		if(col<=len && l<=len) {
+		if(col<=len) {
 			l++;
 			continue;
 		}
 		/* wrap line here */
 		k=l;
-		while(k && linebuf[k]>' ') k--;
+		while(k && linebuf[k]>' ' && linebuf[k-1]!=CTRL_A) k--;
 		if(k==0)	/* continuous printing chars, no word wrap possible */
 			strncat(outbuf,linebuf,l+1);
 		else {
@@ -514,7 +520,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		}
 		strcat(outbuf,"\r\n");
 		/* skip white space (but no more than one LF) for starting of new line */
-		while(inbuf[i] && inbuf[i]<=' ' && inbuf[i]!='\n') i++;	
+		while(inbuf[i] && inbuf[i]<=' ' && inbuf[i]!='\n' && inbuf[i]!=CTRL_A) i++;	
 		if(inbuf[i]=='\n') i++;
 		l=0;
 		col=1;