diff --git a/src/sbbs3/putmsg.cpp b/src/sbbs3/putmsg.cpp
index 01b9b918faef80ad6fee2ac7d73e7957c3bdee60..d4510cd7524108151033d052e9e23084b571f68f 100644
--- a/src/sbbs3/putmsg.cpp
+++ b/src/sbbs3/putmsg.cpp
@@ -383,7 +383,7 @@ char sbbs_t::putmsgfrag(const char* buf, long& mode, long org_cols, JSObject* ob
 			l+=2;
 		}
 		else {
-			if(str[l]=='\n') {
+			if(!(mode&P_PETSCII) && str[l]=='\n') {
 				if(exatr) 	/* clear at newline for extra attr codes */
 					attr(LIGHTGRAY);
 				if(l==0 || str[l-1]!='\r')	/* expand sole LF to CR/LF */
@@ -474,9 +474,49 @@ char sbbs_t::putmsgfrag(const char* buf, long& mode, long org_cols, JSObject* ob
 			}
 			size_t skip = sizeof(char);
 			if(mode&P_PETSCII) {
-				if(term&PETSCII)
+				if(term&PETSCII) {
 					outcom(str[l]);
-				else
+					switch(str[l]) {
+						case '\r':	// PETSCII "Return" / new-line
+							column = 0;
+						case PETSCII_DOWN:
+							lncntr++;
+							break;
+						case PETSCII_CLEAR:
+						case PETSCII_HOME:
+							row=0;
+							column=0;
+							lncntr=0;
+							break;
+						case PETSCII_BLACK:
+						case PETSCII_WHITE:
+						case PETSCII_RED:
+						case PETSCII_GREEN:
+						case PETSCII_BLUE:
+						case PETSCII_ORANGE:
+						case PETSCII_BROWN:
+						case PETSCII_YELLOW:
+						case PETSCII_CYAN:
+						case PETSCII_LIGHTRED:
+						case PETSCII_DARKGRAY:
+						case PETSCII_MEDIUMGRAY:
+						case PETSCII_LIGHTGREEN:
+						case PETSCII_LIGHTBLUE:
+						case PETSCII_LIGHTGRAY:
+						case PETSCII_PURPLE:
+						case PETSCII_UPPERLOWER:
+						case PETSCII_UPPERGRFX:
+						case PETSCII_FLASH_ON:
+						case PETSCII_FLASH_OFF:
+						case PETSCII_REVERSE_ON:
+						case PETSCII_REVERSE_OFF:
+							// No cursor movement
+							break;
+						default:
+							inc_column(1);
+							break;
+					}
+				} else
 					petscii_to_ansibbs(str[l]);
 			} else if((str[l]&0x80) && (mode&P_UTF8)) {
 				if(term&UTF8)