diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index 878f7520ef7a7b486ed3e6690897daf4784757b8..74d5a9daea883c4933c82194b6917335c6a410b4 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -321,15 +321,22 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen, long* pmode)
 	if(!strcmp(sp,"LOCATION"))
 		return(cfg.sys_location);
 
-	if(!strcmp(sp,"NODE")) {
+	if(strcmp(sp,"NODE") == 0 || strcmp(sp,"NN") == 0) {
 		safe_snprintf(str,maxlen,"%u",cfg.node_num);
 		return(str);
 	}
-
-	if(!strcmp(sp,"TNODE")) {
+	if(strcmp(sp, "TNODES") == 0 || strcmp(sp, "TNODE") == 0 || strcmp(sp, "TN") == 0) {
 		safe_snprintf(str,maxlen,"%u",cfg.sys_nodes);
 		return(str);
 	}
+	if(strcmp(sp, "ANODES") == 0 || strcmp(sp, "ANODE") == 0 || strcmp(sp, "AN") == 0) {
+		safe_snprintf(str, maxlen, "%u", count_nodes(/* self: */true));
+		return str;
+	}
+	if(strcmp(sp, "ONODES") == 0 || strcmp(sp, "ONODE") == 0 || strcmp(sp, "ON") == 0) {
+		safe_snprintf(str, maxlen, "%u", count_nodes(/* self: */false));
+		return str;
+	}
 
 	if(strcmp(sp, "PAGER") == 0)
 		return (thisnode.misc&NODE_POFF) ? text[Off] : text[On];
diff --git a/src/sbbs3/getnode.cpp b/src/sbbs3/getnode.cpp
index c09096b1d552840ea82ba6ae8388a6985e2d3738..dff1d6ff23b3e6280136e6dfe66d9e68e2a7685d 100644
--- a/src/sbbs3/getnode.cpp
+++ b/src/sbbs3/getnode.cpp
@@ -661,3 +661,20 @@ void sbbs_t::printnodedat(uint number, node_t* node)
 	attr(LIGHTGRAY);
 	CRLF;
 }
+
+uint sbbs_t::count_nodes(bool self)
+{
+	uint count = 0;
+
+	for(int i=1; i<=cfg.sys_nodes && i<=cfg.sys_lastnode; i++) {
+	    node_t	node;
+		if(getnodedat(i, &node, false) != 0)
+			continue;
+		if(!self && i==cfg.node_num)
+			continue;
+		if(node.status != NODE_INUSE)
+			continue;
+		count++;
+	}
+	return count;
+}
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index d5c30254f5bea85b44e57c7b95e5ea18c46c14d3..72549d9c604b13deeb2a925ce4df7bc748b2836f 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -819,6 +819,7 @@ public:
 	void	nodesync(bool clearline = false);
 	user_t	nodesync_user;
 	bool	nodesync_inside;
+	uint	count_nodes(bool self = true);
 
 	/* putnode.cpp */
 	int		putnodedat(uint number, node_t * node);