diff --git a/src/sbbs3/getmsg.cpp b/src/sbbs3/getmsg.cpp
index 1c2313c32100b1d6a0cf586a2069647864c33a14..0923a4269d0c1b3503ad64a3a1c459346ffed616 100644
--- a/src/sbbs3/getmsg.cpp
+++ b/src/sbbs3/getmsg.cpp
@@ -75,7 +75,7 @@ int sbbs_t::loadmsg(smbmsg_t *msg, ulong number)
 }
 
 /* Synchronized with atcode()! */
-void sbbs_t::show_msgattr(smbmsg_t* msg)
+void sbbs_t::show_msgattr(const smbmsg_t* msg)
 {
 	uint16_t attr = msg->hdr.attr;
 	uint16_t poll = attr&MSG_POLL_VOTE_MASK;
@@ -163,7 +163,7 @@ const char* sbbs_t::msghdr_field(const smbmsg_t* msg, const char* str, char* buf
 /****************************************************************************/
 /* Displays a message header to the screen                                  */
 /****************************************************************************/
-void sbbs_t::show_msghdr(smb_t* smb, smbmsg_t* msg, const char* subject, const char* from, const char* to)
+void sbbs_t::show_msghdr(smb_t* smb, const smbmsg_t* msg, const char* subject, const char* from, const char* to)
 {
 	char	str[MAX_PATH+1];
 	char	age[64];
diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index a28b9ed1fadea950f368d2b972110992291c2287..aa6044f596ce92778ba661557de51e1ddab90e70 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -3948,7 +3948,7 @@ js_change_msg_attr(JSContext *cx, uintN argc, jsval *arglist)
 		return JS_TRUE;
 
 	rc=JS_SUSPENDREQUEST(cx);
-	int32 attr = sbbs->chmsgattr(*msg);
+	int32 attr = sbbs->chmsgattr(msg);
 	JS_RESUMEREQUEST(cx, rc);
 
 	JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(attr));
diff --git a/src/sbbs3/readmail.cpp b/src/sbbs3/readmail.cpp
index e6deffd55da923b8ad603ac906367fb2e934e28f..9c177e98a2595c2cf5eac63eefa035efd30221ee 100644
--- a/src/sbbs3/readmail.cpp
+++ b/src/sbbs3/readmail.cpp
@@ -503,7 +503,7 @@ void sbbs_t::readmail(uint usernumber, int which, long lm_mode)
 				done=1;
 				break;
 			case 'C':   /* Change attributes of last piece */
-				i=chmsgattr(msg);
+				i=chmsgattr(&msg);
 				if(msg.hdr.attr==i)
 					break;
 				if(msg.total_hfields)
diff --git a/src/sbbs3/readmsgs.cpp b/src/sbbs3/readmsgs.cpp
index 76c45a583c0eb872ed7ace82b10863c04d15f242..13c94fa2989d9ba734e41cef04358fe585df625f 100644
--- a/src/sbbs3/readmsgs.cpp
+++ b/src/sbbs3/readmsgs.cpp
@@ -1214,7 +1214,7 @@ int sbbs_t::scanposts(uint subnum, long mode, const char *find)
 								: matchuser(&cfg,msg.from,FALSE));
 							break;
 						case 'C':   /* Change message attributes */
-							i=chmsgattr(msg);
+							i=chmsgattr(&msg);
 							if(msg.hdr.attr==i)
 								break;
 							if(msg.total_hfields)
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index f07fa53584afe073ce911c8fbed0a0d0178b55ac..dabf50743ab04a08bff0ce846f58d1dc4f644a89 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -614,7 +614,7 @@ public:
 
 	csi_t	main_csi;		/* Main Command Shell Image */
 
-	smbmsg_t*	current_msg;	/* For message header @-codes */
+	const smbmsg_t*	current_msg;	/* For message header @-codes */
 	const char*	current_msg_subj;
 	const char*	current_msg_from;
 	const char*	current_msg_to;
@@ -745,7 +745,7 @@ public:
 	void	removeline(char *str, char *str2, char num, char skip);
 	ulong	msgeditor(char *buf, const char *top, char *title);
 	bool	editfile(char *path, bool msg=false);
-	ushort	chmsgattr(smbmsg_t);
+	ushort	chmsgattr(const smbmsg_t*);
 	bool	quotemsg(smb_t*, smbmsg_t*, bool tails = false);
 	bool	editmsg(smb_t*, smbmsg_t*);
 	void	editor_inf(int xeditnum, const char *to, const char* from, const char *subj, long mode
@@ -767,8 +767,8 @@ public:
 
 	/* getmsg.cpp */
 	int		loadmsg(smbmsg_t *msg, ulong number);
-	void	show_msgattr(smbmsg_t*);
-	void	show_msghdr(smb_t*, smbmsg_t*, const char *subj = NULL, const char* from = NULL, const char* to = NULL);
+	void	show_msgattr(const smbmsg_t*);
+	void	show_msghdr(smb_t*, const smbmsg_t*, const char *subj = NULL, const char* from = NULL, const char* to = NULL);
 	bool	show_msg(smb_t*, smbmsg_t*, long p_mode = 0, post_t* post = NULL);
 	bool	msgtotxt(smb_t*, smbmsg_t*, const char *fname, bool header = true, ulong gettxt_mode = GETMSGTXT_ALL);
 	const char* msghdr_text(const smbmsg_t*, uint index);
diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp
index c7f39e459f75e34f1883900af42df68e012cf4bd..5c3434602390a873ed862b8a5c0e947783a7d94e 100644
--- a/src/sbbs3/writemsg.cpp
+++ b/src/sbbs3/writemsg.cpp
@@ -1845,57 +1845,58 @@ bool sbbs_t::movemsg(smbmsg_t* msg, uint subnum)
 	return(true);
 }
 
-ushort sbbs_t::chmsgattr(smbmsg_t msg)
+ushort sbbs_t::chmsgattr(const smbmsg_t* msg)
 {
 	int ch;
+	uint16_t attr = msg->hdr.attr;
 
 	while(online && !(sys_status&SS_ABORT)) {
 		CRLF;
-		show_msgattr(&msg);
+		show_msgattr(msg);
 		menu("msgattr");
 		ch=getkey(K_UPPER);
 		if(ch)
 			bprintf("%c\r\n",ch);
 		switch(ch) {
 			case 'P':
-				msg.hdr.attr^=MSG_PRIVATE;
+				attr^=MSG_PRIVATE;
 				break;
 			case 'S':
-				msg.hdr.attr^=MSG_SPAM;
+				attr^=MSG_SPAM;
 				break;
 			case 'R':
-				msg.hdr.attr^=MSG_READ;
+				attr^=MSG_READ;
 				break;
 			case 'K':
-				msg.hdr.attr^=MSG_KILLREAD;
+				attr^=MSG_KILLREAD;
 				break;
 			case 'A':
-				msg.hdr.attr^=MSG_ANONYMOUS;
+				attr^=MSG_ANONYMOUS;
 				break;
 			case 'N':   /* Non-purgeable */
-				msg.hdr.attr^=MSG_PERMANENT;
+				attr^=MSG_PERMANENT;
 				break;
 			case 'M':
-				msg.hdr.attr^=MSG_MODERATED;
+				attr^=MSG_MODERATED;
 				break;
 			case 'V':
-				msg.hdr.attr^=MSG_VALIDATED;
+				attr^=MSG_VALIDATED;
 				break;
 			case 'D':
-				msg.hdr.attr^=MSG_DELETE;
+				attr^=MSG_DELETE;
 				break;
 			case 'L':
-				msg.hdr.attr^=MSG_LOCKED;
+				attr^=MSG_LOCKED;
 				break;
 			case 'C':
-				msg.hdr.attr^=MSG_NOREPLY;
+				attr^=MSG_NOREPLY;
 				break;
 			case 'E':
-				msg.hdr.attr^=MSG_REPLIED;
+				attr^=MSG_REPLIED;
 				break;
 			default:
-				return(msg.hdr.attr); 
+				return(attr); 
 		} 
 	}
-	return(msg.hdr.attr);
+	return(attr);
 }
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index 1b00516d7112575deb8515074d6b3fba8aef3f7a..eb2f37760a16c2b32bf562882d7c33a190ac1528 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -243,8 +243,8 @@ SMBEXPORT char*		smb_hfieldtype(uint16_t type);
 SMBEXPORT uint16_t	smb_hfieldtypelookup(const char*);
 SMBEXPORT char*		smb_dfieldtype(uint16_t type);
 SMBEXPORT char*		smb_faddrtoa(fidoaddr_t* addr, char* outstr);
-SMBEXPORT char*		smb_netaddr(net_t* net);
-SMBEXPORT char*		smb_netaddrstr(net_t* net, char* fidoaddr_buf);
+SMBEXPORT char*		smb_netaddr(const net_t* net);
+SMBEXPORT char*		smb_netaddrstr(const net_t* net, char* fidoaddr_buf);
 SMBEXPORT char*		smb_nettype(enum smb_net_type);
 SMBEXPORT char*		smb_zonestr(int16_t zone, char* outstr);
 SMBEXPORT char*		smb_msgattrstr(int16_t attr, char* outstr, size_t maxlen);
diff --git a/src/smblib/smbstr.c b/src/smblib/smbstr.c
index 9d9e894e0ffa262b026f04d820cee891d8ccf5aa..6d4a2ef5e40ee32306482d4e080dbeed5f55f71c 100644
--- a/src/smblib/smbstr.c
+++ b/src/smblib/smbstr.c
@@ -309,7 +309,7 @@ fidoaddr_t smb_atofaddr(const fidoaddr_t* sys_addr, const char *str)
 /* Returns ASCIIZ representation of network address (net_t)					*/
 /* NOT THREAD-SAFE!															*/
 /****************************************************************************/
-char* smb_netaddr(net_t* net)
+char* smb_netaddr(const net_t* net)
 {
 	return(smb_netaddrstr(net, NULL));
 }
@@ -317,7 +317,7 @@ char* smb_netaddr(net_t* net)
 /****************************************************************************/
 /* Copies ASCIIZ representation of network address (net_t) into buf			*/
 /****************************************************************************/
-char* smb_netaddrstr(net_t* net, char* fidoaddr_buf)
+char* smb_netaddrstr(const net_t* net, char* fidoaddr_buf)
 {
 	if(net->type==NET_FIDO)
 		return(smb_faddrtoa((fidoaddr_t*)net->addr,fidoaddr_buf));