diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 22e168586621fc8f5f3224a2ee0a59e19c34836f..5d5db0e784ce0687f6e1ff2d8290b0e459622f36 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -4832,6 +4832,8 @@ void DLLCALL ftp_server(void* arg)
 		if(!terminate_server) {
 			lprintf(LOG_INFO,"Recycling server...");
 			mswait(2000);
+			if(startup->recycle!=NULL)
+				startup->recycle(startup->cbdata);
 		}
 
 	} while(!terminate_server);
diff --git a/src/sbbs3/ftpsrvr.h b/src/sbbs3/ftpsrvr.h
index 2ec9640cd5ea1e2b3e4c73fdb26914fa9fb63047..2c7471970dc63468a9c9b7013d122b63b097cf5d 100644
--- a/src/sbbs3/ftpsrvr.h
+++ b/src/sbbs3/ftpsrvr.h
@@ -60,6 +60,7 @@ typedef struct {
 	int 	(*lputs)(void*, int, char*);
 	void	(*status)(void*, char*);
     void	(*started)(void*);
+	void	(*recycle)(void*);
     void	(*terminated)(void*, int code);
     void	(*clients)(void*, int active);
     void	(*thread_up)(void*, BOOL up, BOOL setuid);
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index b18c78f75e02d10ce0fb4e3a04e55e04c2b186be..3cdb391524a482c05d986b63aa16092b0812f15e 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -4333,6 +4333,8 @@ void DLLCALL mail_server(void* arg)
 		if(!terminate_server) {
 			lprintf(LOG_INFO,"Recycling server...");
 			mswait(2000);
+			if(startup->recycle!=NULL)
+				startup->recycle(startup->cbdata);
 		}
 
 	} while(!terminate_server);
diff --git a/src/sbbs3/mailsrvr.h b/src/sbbs3/mailsrvr.h
index 0d1ae33f61bcd1bbe4e100c10a7f5a79a0ebd24b..4885dcbbe25b69e26946423447dedc84922a34a6 100644
--- a/src/sbbs3/mailsrvr.h
+++ b/src/sbbs3/mailsrvr.h
@@ -67,6 +67,7 @@ typedef struct {
 	int 	(*lputs)(void*, int, char*);
 	void	(*status)(void*, char*);
     void	(*started)(void*);
+	void	(*recycle)(void*);
     void	(*terminated)(void*, int code);
     void	(*clients)(void*, int active);
     void	(*thread_up)(void*, BOOL up, BOOL setuid);
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index a0c881083bc4d0fcd69661729fd61b5d443cc822..521c63eb45a40b60ffa27b8c3346991a0902e494 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -4582,6 +4582,8 @@ void DLLCALL bbs_thread(void* arg)
 	if(!terminate_server) {
 		lprintf(LOG_INFO,"Recycling server...");
 		mswait(2000);
+		if(startup->recycle!=NULL)
+			startup->recycle(startup->cbdata);
 	}
 
 	} while(!terminate_server);
diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c
index 4246711f64f7b67e12b06477dbe826a5ab4e3b0b..ae4d2c6f3c242d1c0bc560e1ecb568796d937476 100644
--- a/src/sbbs3/sbbscon.c
+++ b/src/sbbs3/sbbscon.c
@@ -754,7 +754,8 @@ static void terminate(void)
 	}
 }
 
-static void read_startup_ini(void)
+static void read_startup_ini(bbs_startup_t* bbs, ftp_startup_t* ftp, web_startup_t* web
+							 ,mail_startup_t* mail, services_startup_t* services)
 {
 	char	str[MAX_PATH+1];
 	FILE*	fp=NULL;
@@ -775,11 +776,11 @@ static void read_startup_ini(void)
 	/* We call this function to set defaults, even if there's no .ini file */
 	sbbs_read_ini(fp, 
 		NULL,			/* global_startup */
-		&run_bbs,		&bbs_startup,
-		&run_ftp,		&ftp_startup, 
-		&run_web,		&web_startup,
-		&run_mail,		&mail_startup, 
-		&run_services,	&services_startup);
+		&run_bbs,		bbs,
+		&run_ftp,		ftp, 
+		&run_web,		web,
+		&run_mail,		mail, 
+		&run_services,	services);
 
 	/* read/default any sbbscon-specific .ini keys here */
 #if defined(__unix__)
@@ -797,6 +798,28 @@ static void read_startup_ini(void)
 		fclose(fp);
 }
 
+/* Server recycle callback (read relevant startup .ini file section)		*/
+void recycle(void* cbdata)
+{
+	bbs_startup_t* bbs=NULL;
+	ftp_startup_t* ftp=NULL;
+	web_startup_t* web=NULL;
+	mail_startup_t* mail=NULL;
+	services_startup_t* services=NULL;
+
+	if(cbdata==&bbs_startup)
+		bbs=cbdata;
+	else if(cbdata==&ftp_startup)
+		ftp=cbdata;
+	else if(cbdata==&web_startup)
+		web=cbdata;
+	else if(cbdata==&mail_startup)
+		mail=cbdata;
+	else if(cbdata==&services_startup)
+		services=cbdata;
+
+	read_startup_ini(bbs,ftp,web,mail,services);
+}
 
 #if defined(_WIN32)
 BOOL WINAPI ControlHandler(DWORD CtrlType)
@@ -971,10 +994,11 @@ int main(int argc, char** argv)
 	/* Initialize BBS startup structure */
     memset(&bbs_startup,0,sizeof(bbs_startup));
     bbs_startup.size=sizeof(bbs_startup);
-
+	bbs_startup.cbdata=&bbs_startup;
 	bbs_startup.lputs=bbs_lputs;
 	bbs_startup.event_lputs=event_lputs;
     bbs_startup.started=bbs_started;
+	bbs_startup.recycle=recycle;
     bbs_startup.terminated=bbs_terminated;
     bbs_startup.thread_up=thread_up;
     bbs_startup.socket_open=socket_open;
@@ -992,8 +1016,10 @@ int main(int argc, char** argv)
 	/* Initialize FTP startup structure */
     memset(&ftp_startup,0,sizeof(ftp_startup));
     ftp_startup.size=sizeof(ftp_startup);
+	ftp_startup.cbdata=&ftp_startup;
 	ftp_startup.lputs=ftp_lputs;
     ftp_startup.started=ftp_started;
+	ftp_startup.recycle=recycle;
     ftp_startup.terminated=ftp_terminated;
 	ftp_startup.thread_up=thread_up;
     ftp_startup.socket_open=socket_open;
@@ -1008,8 +1034,10 @@ int main(int argc, char** argv)
 	/* Initialize Web Server startup structure */
     memset(&web_startup,0,sizeof(web_startup));
     web_startup.size=sizeof(web_startup);
+	web_startup.cbdata=&web_startup;
 	web_startup.lputs=web_lputs;
     web_startup.started=web_started;
+	web_startup.recycle=recycle;
     web_startup.terminated=web_terminated;
 	web_startup.thread_up=thread_up;
     web_startup.socket_open=socket_open;
@@ -1022,8 +1050,10 @@ int main(int argc, char** argv)
 	/* Initialize Mail Server startup structure */
     memset(&mail_startup,0,sizeof(mail_startup));
     mail_startup.size=sizeof(mail_startup);
+	mail_startup.cbdata=&mail_startup;
 	mail_startup.lputs=mail_lputs;
     mail_startup.started=mail_started;
+	mail_startup.recycle=recycle;
     mail_startup.terminated=mail_terminated;
 	mail_startup.thread_up=thread_up;
     mail_startup.socket_open=socket_open;
@@ -1062,8 +1092,10 @@ int main(int argc, char** argv)
 	/* Initialize Services startup structure */
     memset(&services_startup,0,sizeof(services_startup));
     services_startup.size=sizeof(services_startup);
+	services_startup.cbdata=&services_startup;
 	services_startup.lputs=services_lputs;
     services_startup.started=services_started;
+	services_startup.recycle=recycle;
     services_startup.terminated=services_terminated;
 	services_startup.thread_up=thread_up;
     services_startup.socket_open=socket_open;
@@ -1089,7 +1121,7 @@ int main(int argc, char** argv)
 		}
 	}
 
-	read_startup_ini();
+	read_startup_ini(&bbs_startup, &ftp_startup, &web_startup, &mail_startup, &services_startup);
 
 #if SBBS_MAGIC_FILENAMES	/* This stuff is just broken */
 
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 93b863de73598d1c26a2d1eb11750319f74f60dc..eeea76e4d39b7a346f27ebbebe40323497d98716 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -2161,6 +2161,8 @@ void DLLCALL services_thread(void* arg)
 		if(!terminated) {
 			lprintf(LOG_INFO,"Recycling server...");
 			mswait(2000);
+			if(startup->recycle!=NULL)
+				startup->recycle(startup->cbdata);
 		}
 
 	} while(!terminated);
diff --git a/src/sbbs3/services.h b/src/sbbs3/services.h
index 86e43f3189b60bd341e4e0065c0e63c81b0f47a8..47e5309433907a211ab47e9f9908f2169ab2eb29 100644
--- a/src/sbbs3/services.h
+++ b/src/sbbs3/services.h
@@ -63,6 +63,7 @@ typedef struct {
 	int 	(*lputs)(void*, int, char*);		/* Log - put string */
 	void	(*status)(void*, char*);
     void	(*started)(void*);
+	void	(*recycle)(void*);
     void	(*terminated)(void*, int code);
     void	(*clients)(void*, int active);
     void	(*thread_up)(void*, BOOL up, BOOL setuid);
diff --git a/src/sbbs3/startup.h b/src/sbbs3/startup.h
index 1cdfead3b2b8baa72eb64781f8b1ea37be607b00..053e94000b1f8e7392d59974d37c8db532e9ce6e 100644
--- a/src/sbbs3/startup.h
+++ b/src/sbbs3/startup.h
@@ -97,6 +97,7 @@ typedef struct {
     int 	(*event_lputs)(int, char*);		/* Event log - put string			*/
 	void	(*status)(void*, char*);
     void	(*started)(void*);
+	void	(*recycle)(void*);
     void	(*terminated)(void*, int code);
     void	(*clients)(void*, int active);
     void	(*thread_up)(void*, BOOL up, BOOL setuid);
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index c1eabb5f2ae91163c0a03e49077d524ba9243aab..9d91a16f7c5d6b4353bd83f15309db9de8920567 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -3183,6 +3183,8 @@ void DLLCALL web_server(void* arg)
 		if(!terminate_server) {
 			lprintf(LOG_INFO,"Recycling server...");
 			mswait(2000);
+			if(startup->recycle!=NULL)
+				startup->recycle(startup->cbdata);
 		}
 
 	} while(!terminate_server);
diff --git a/src/sbbs3/websrvr.h b/src/sbbs3/websrvr.h
index 9b16c0ec698d6cfeed9e68bbf98e7eb88e6ecd01..f40f41099964b83b68af51b6cf40d12ab4e25f74 100644
--- a/src/sbbs3/websrvr.h
+++ b/src/sbbs3/websrvr.h
@@ -60,6 +60,7 @@ typedef struct {
 	int 	(*lputs)(void*, int, char*);
 	void	(*status)(void*, char*);
     void	(*started)(void*);
+	void	(*recycle)(void*);
     void	(*terminated)(void*, int code);
     void	(*clients)(void*, int active);
     void	(*thread_up)(void*, BOOL up, BOOL setuid);