diff --git a/exec/newslink.js b/exec/newslink.js
index 6832766ac5dd5d0fd5c3b9ab2f3e20cb759526ed..991572133a081f77a724dfbe068be40de13abdc1 100644
--- a/exec/newslink.js
+++ b/exec/newslink.js
@@ -34,6 +34,7 @@ var antispam = format(".remove-%s-this"
 var cfg_fname = system.ctrl_dir + "newslink.cfg";
 
 load("sbbsdefs.js");
+load("newsutil.js");
 
 var debug = false;
 var slave = false;
@@ -304,7 +305,6 @@ for(i in area) {
 			break;
 		}
 
-		writeln("Path: " + hdr.path);
 		if(!email_addresses)
 			writeln(format("From: %s@%s",hdr.from,newsgroup));
 		else if(hdr.from.indexOf('@')!=-1)
@@ -325,22 +325,15 @@ for(i in area) {
 				,hdr.from
 				,hdr.from.replace(/ /g,".").toLowerCase()
 				,system.inetaddr,antispam));
-		if(hdr.from_org==undefined && !hdr.from_net_type)
-			hdr.from_org=system.name;
-		if(hdr.from_org!=undefined)
-			writeln("Organization: " + hdr.from_org);
-		writeln("To: " + hdr.to);
-		writeln("X-Comment-To: " + hdr.to);
-		writeln("Subject: " + hdr.subject);
-		writeln("Message-ID: " + hdr.id);
-		writeln("Date: " + hdr.date);
+
 		if(hdr.newsgroups==undefined)
 			hdr.newsgroups=newsgroup;
-		writeln("Newsgroups: " + hdr.newsgroups);
-		if(hdr.replyto!=undefined)
-			writeln("Reply-To: " + hdr.replyto);
-		if(hdr.reply_id!=undefined)
-			writeln("References: " + hdr.reply_id);
+
+		if(hdr.from_org==undefined && !hdr.from_net_type)
+			hdr.from_org=system.name;
+
+		write_news_header(hdr); // from newsutil.js
+
 		writeln("X-Gateway: "
 			+ system.inetaddr
 			+ " [Synchronet "
@@ -350,20 +343,6 @@ for(i in area) {
 			+ "]"
 			);
 
-		/* Add a Sender: header field? */
-
-		/* FidoNet header */
-		if(hdr.ftn_pid!=undefined)
-			writeln("X-FTN-PID: " + hdr.ftn_pid);
-		if(hdr.ftn_area!=undefined)
-			writeln("X-FTN-AREA: " + hdr.ftn_area);
-		if(hdr.ftn_flags!=undefined)
-			writeln("X-FTN-FLAGS: " + hdr.ftn_flags);
-		if(hdr.ftn_msgid!=undefined)
-			writeln("X-FTN-MSGID: " + hdr.ftn_msgid);
-		if(hdr.ftn_reply!=undefined)
-			writeln("X-FTN-REPLY: " + hdr.ftn_reply);
-
 		writeln("");
 		if(hdr.to.toLowerCase()!="all") {
 			writeln("  To: " + hdr.to);
@@ -461,78 +440,12 @@ for(i in area) {
 			}
 			//print(line);
 
-			/* Parse header lines */
-			if((sp=line.indexOf(':'))==-1)
-				continue;
-
-			data=line.slice(sp+1);
-			while(data.charAt(0)==' ')	// trim prepended spaces
-				data=data.slice(1);
-			data=truncsp(data);			// trim trailing spaces
-
-			line=line.substr(0,sp);
-			while(line.charAt(0)==' ')	// trim prepended spaces
-				line=line.slice(1);
-			line=truncsp(line);			// trim trailing spaces
-
-			switch(line.toLowerCase()) {
-				case "to":
-				case "apparently-to":
-				case "x-comment-to":
-					hdr.to=data;
-					break;
-				case "newsgroups":
-					if(hdr.to==newsgroup)
-						hdr.to=data;
-					hdr.newsgroups=data;
-					break;
-				case "path":
-					hdr.path=data;
-					break;
-				case "from":
-					hdr.from=data;
-					break;
-				case "organization":
-					hdr.from_org=data;
-					break;
-				case "reply-to":
-					hdr.replyto_net_type=NET_INTERNET;
-					hdr.replyto=data;
-					break;
-				case "date":
-					hdr.date=data;
-					break;
-				case "subject":
-					hdr.subject=data;
-					break;
-				case "message-id":
-					hdr.id=data;
-					break;
-				case "references":
-					hdr.reply_id=data;
-					break;
-				case "x-gateway":
-					hdr.gateway=data;
-					break;
-
-				/* FidoNet headers */
-				case "x-ftn-pid":
-					hdr.ftn_pid=data;
-					break;
-				case "x-ftn-area":
-					hdr.ftn_area=data;
-					break;
-				case "x-ftn-flags":
-					hdr.ftn_flags=data;
-					break;
-				case "x-ftn-msgid":
-					hdr.ftn_msgid=data;
-					break;
-				case "x-ftn-reply":
-					hdr.ftn_reply=data;
-					break;
-			}
+			parse_news_header(hdr,line);	// from newsutil.js
 		}
+
+		if(hdr.to==newsgroup && hdr.newsgroups!=undefined)
+			hdr.to=hdr.newsgroups;
+
 		// Duplicate/looped message detection here
 		if(hdr.id.indexOf('@' + system.inetaddr)!=-1)
 			continue;
diff --git a/exec/nntpservice.js b/exec/nntpservice.js
index 2b3a96b43bad9dfd2fb9dffaf97ed0a6f657cf13..34baf2a04cce82b168b13738337bae74954d272e 100644
--- a/exec/nntpservice.js
+++ b/exec/nntpservice.js
@@ -14,8 +14,6 @@
 //					Xnews 5.04.25
 //					Mozilla 1.1 (Requires -auto, and a prior login via other method)
 
-load("sbbsdefs.js");
-
 const REVISION = "$Revision$".split(' ')[1];
 
 var tearline = format("--- Synchronet %s%s-%s NNTP Service %s\r\n"
@@ -23,6 +21,9 @@ var tearline = format("--- Synchronet %s%s-%s NNTP Service %s\r\n"
 var tagline	=  format(" *  %s - %s - telnet://%s\r\n"
 					  ,system.name,system.location,system.inetaddr);
 
+load("sbbsdefs.js");
+load("newsutil.js");
+
 var debug = false;
 var no_anonymous = false;
 var auto_login = false;
@@ -438,9 +439,7 @@ while(client.socket.is_connected) {
 				break;
 
 			if(cmd[0].toUpperCase()!="BODY") {
-				if(hdr.path==undefined)
-					hdr.path="not-for-mail";
-				writeln("Path: " + system.inetaddr + "!" + hdr.path);
+
 				if(!hdr.from_net_type)	/* local message */
 					writeln(format("From: \"%s\" <%s@%s>"
 						,hdr.from
@@ -457,36 +456,17 @@ while(client.socket.is_connected) {
 						,hdr.from
 						,hdr.from.replace(/ /g,".").toLowerCase()
 						,hdr.from_net_addr));
-				if(hdr.from_org!=undefined)
-					hdr.from_org=system.name;
-				writeln("Organization: " + hdr.from_org);
-				writeln("To: " + hdr.to);
-				writeln("X-Comment-To: " + hdr.to);
-				writeln("Subject: " + hdr.subject);
-				writeln("Message-ID: " + hdr.id);
-				writeln("Date: " + hdr.date);
-				if(hdr.newsgroups!=undefined
-					&& hdr.newsgroups.indexOf(selected.newsgroup) >= 0)
-					writeln("Newsgroups: " + hdr.newsgroups);
-				else
-					writeln("Newsgroups: " + selected.newsgroup);
-
-				if(hdr.replyto!=undefined)
-					writeln("Reply-To: " + hdr.replyto);
-				if(hdr.reply_id!=undefined)
-					writeln("References: " + hdr.reply_id);
-				/* FidoNet header */
-				if(hdr.ftn_pid!=undefined)
-					writeln("X-FTN-PID: " + hdr.ftn_pid);
-				if(hdr.ftn_area!=undefined)
-					writeln("X-FTN-AREA: " + hdr.ftn_area);
-				if(hdr.ftn_flags!=undefined)
-					writeln("X-FTN-FLAGS: " + hdr.ftn_flags);
-				if(hdr.ftn_msgid!=undefined)
-					writeln("X-FTN-MSGID: " + hdr.ftn_msgid);
-				if(hdr.ftn_reply!=undefined)
-					writeln("X-FTN-REPLY: " + hdr.ftn_reply);
 
+				if(hdr.path==undefined)
+					hdr.path="not-for-mail";
+
+				if(hdr.newsgroups==undefined)
+					hdr.newsgroups = selected.newsgroup;
+
+				if(hdr.from_org==undefined && !hdr.from_net_type)
+					hdr.from_org=system.name;
+		
+				write_news_header(hdr);	// from newsutil.js
 			}
 			if(hdr!=null && body!=null)	/* both, separate with blank line */
 				writeln("");
@@ -530,11 +510,6 @@ while(client.socket.is_connected) {
 			writeln("340 send article to be posted. End with <CR-LF>.<CR-LF>");
 
 			var hdr={ from: "", subject: "" };
-			if(!(user.security.restrictions&(UFLAG_G|UFLAG_Q))) {	// !Guest and !Network Node
-				hdr.from=user.alias;
-				hdr.from_ext=user.number;
-			}
-
 			var posted=false;
 			var header=true;
 			var body="";
@@ -568,79 +543,21 @@ while(client.socket.is_connected) {
 				}
 				log(line);
 
-				/* Parse header lines */
-				if((sp=line.indexOf(':'))==-1)
-					continue;
-
-				data=line.slice(sp+1);
-				while(data.charAt(0)==' ')	// trim prepended spaces
-					data=data.slice(1);
-				data=truncsp(data);			// trim trailing spaces
+				parse_news_header(hdr,line);	// from newsutil.js
+			}
+			newsgroups=hdr.newsgroups.split(',');
 
-				line=line.substr(0,sp);
-				while(line.charAt(0)==' ')	// trim prepended spaces
-					line=line.slice(1);
-				line=truncsp(line);			// trim trailing spaces
+			if(hdr.to==undefined && hdr.reply_id!=undefined)
+				hdr.to=getReferenceTo(hdr.reply_id);
 
-				switch(line.toLowerCase()) {
-					case "to":
-					case "apparently-to":
-					case "x-comment-to":
-						hdr.to=data;
-						break;
-					case "path":
-						hdr.path=data;
-						break;
-					case "from":
-						if(user.security.restrictions&(UFLAG_G|UFLAG_Q)) // Guest or Network Node
-							hdr.from=data;
-						break;
-					case "organization":
-						hdr.from_org=data;
-						break;
-					case "reply-to":
-						hdr.replyto_net_type=NET_INTERNET;
-						hdr.replyto=data;
-						break;
-					case "date":
-						hdr.date=data;
-						break;
-					case "subject":
-						hdr.subject=data;
-						break;
-					case "message-id":
-						if(slave)
-							hdr.id=data;
-						break;
-					case "references":
-						hdr.reply_id=data;
-						if(hdr.to==undefined)
-							hdr.to=getReferenceTo(data);
-						break;
-					case "newsgroups":
-						newsgroups=data.split(',');
-						hdr.newsgroups=data;
-						break;
-					case "x-ftn-pid":
-						hdr.ftn_pid=data;
-						break;
-					case "x-ftn-area":
-						hdr.ftn_area=data;
-						break;
-					case "x-ftn-flags":
-						hdr.ftn_flags=data;
-						break;
-					case "x-ftn-msgid":
-						hdr.ftn_msgid=data;
-						break;
-					case "x-ftn-reply":
-						hdr.ftn_reply=data;
-						break;
-				}
-			}
 			if(hdr.to==undefined && hdr.newsgroups!=undefined)
 				hdr.to=hdr.newsgroups;
 
+			if(!(user.security.restrictions&(UFLAG_G|UFLAG_Q))) {	// !Guest and !Network Node
+				hdr.from=user.alias;
+				hdr.from_ext=user.number;
+			}
+
 			if(system.trashcan("subject",hdr.subject)) {
 				log(format("!BLOCKED subject: %s",hdr.subject));
 				var reason = format("Blocked subject from %s (%s): %s"