diff --git a/src/sbbs3/sexyz.c b/src/sbbs3/sexyz.c
index be43801332ebe6e6fe80445110f4bfd46d74c10f..c0e8079962a9bdbd1f50725b67e749bfd5c2e1d0 100644
--- a/src/sbbs3/sexyz.c
+++ b/src/sbbs3/sexyz.c
@@ -87,7 +87,7 @@ FILE*	statfp;
 
 char	revision[16];
 
-SOCKET	sock;
+SOCKET	sock=INVALID_SOCKET;
 #define DCDHIGH		socket_check(sock, NULL, NULL, 0)
 
 #define getcom(t)	recv_byte(sock,t,mode)
@@ -1092,14 +1092,14 @@ void receive_files(char** fname, int fnames, FILE* log)
 
 static const char* usage=
 	"usage: sexyz <socket> [opts] <cmd> [file | path | +list]\n\n"
-	"where:\n\n"
 	"socket = TCP socket descriptor\n"
 	"opts   = o  to overwrite files when receiving\n"
 	"         d  to disable dropped carrier detection\n"
 	"         a  to sound alarm at start and stop of transfer\n"
 	"         p  to pause after abnormal exit (error)\n"
 	"         l  to disable local keyboard (Ctrl-C) checking\n"
-	"cmd    = sx to send Xmodem     rx to recv Xmodem\n"
+	"cmd    = v  to display detailed version information\n"
+	"         sx to send Xmodem     rx to recv Xmodem\n"
 	"         sX to send Xmodem-1k  rc to recv Xmodem-CRC\n"
 	"         sy to send Ymodem     ry to recv Ymodem\n"
 	"         sY to send Ymodem-1k  rg to recv Ymodem-G\n"
@@ -1119,6 +1119,9 @@ int main(int argc, char **argv)
 	uint	fnames=0;
 	FILE*	fp;
 	FILE*	log=NULL;
+	char	compiler[32];
+
+	DESCRIBE_COMPILER(compiler);
 
 	errfp=stderr;
 	statfp=stdout;
@@ -1131,25 +1134,21 @@ int main(int argc, char **argv)
 		,PLATFORM_DESC
 		);
 
+#if 0
 	if(argc>1) {
 		fprintf(statfp,"Command line: ");
 		for(i=1;i<argc;i++)
 			fprintf(statfp,"%s ",argv[i]);
 		fprintf(statfp,"\n",statfp);
 	}
+#endif
 
-	if(argc<3) {
-		fprintf(errfp,usage);
-		exit(1); 
-	}
-
-	sock=atoi(argv[1]);
-	if(sock==INVALID_SOCKET || sock<1) {
-		fprintf(errfp,usage);
-		exit(1);
-	}
+	for(i=1;i<argc;i++) {
 
-	for(i=2;i<argc;i++) {
+		if(sock==INVALID_SOCKET && isdigit(argv[i][0])) {
+			sock=atoi(argv[i]);
+			continue;
+		}
 
 		if(!(mode&(SEND|RECV))) {
 			if(toupper(argv[i][0])=='S' || toupper(argv[i][0])=='R') { /* cmd */
@@ -1189,6 +1188,20 @@ int main(int argc, char **argv)
 				} 
 			}
 
+			else if(toupper(argv[i][0])=='V') {
+
+				fprintf(statfp,"%-8s %s\n",getfname(__FILE__),revision);
+				fprintf(statfp,"%-8s %s\n",getfname(xmodem_source()),xmodem_ver(str));
+				fprintf(statfp,"%-8s %s\n",getfname(zmodem_source()),zmodem_ver(str));
+#ifdef _DEBUG
+				fprintf(statfp,"Debug\n");
+#endif
+				fprintf(statfp,"Compiled %s %.5s with %s\n",__DATE__,__TIME__,compiler);
+				fprintf(statfp,"%s\n",os_version(str));
+				exit(1);
+			}
+
+
 			else if(toupper(argv[i][0])=='O')
 				mode|=OVERWRITE;
 
@@ -1256,14 +1269,20 @@ int main(int argc, char **argv)
 		} 
 	}
 
+	if(sock==INVALID_SOCKET || sock<1) {
+		fprintf(statfp,"!No socket descriptor specified\n\n");
+		fprintf(errfp,usage);
+		exit(1);
+	}
+
 	if(!(mode&(SEND|RECV))) {
-		fprintf(statfp,"No command specified\n");
+		fprintf(statfp,"!No command specified\n\n");
 		fprintf(statfp,usage);
 		exit(1); 
 	}
 
 	if(mode&(SEND|XMODEM) && !fnames) { /* Sending with any or recv w/Xmodem */
-		fprintf(statfp,"Must specify filename or filelist\n");
+		fprintf(statfp,"!Must specify filename or filelist\n\n");
 		fprintf(statfp,usage);
 		exit(1); 
 	}
diff --git a/src/sbbs3/xmodem.c b/src/sbbs3/xmodem.c
index d03aacbe69e7b7540d61a390a041b05f4d5cd269..af1cb7f39fea2d80e1602075b3ca5635285f0df7 100644
--- a/src/sbbs3/xmodem.c
+++ b/src/sbbs3/xmodem.c
@@ -262,3 +262,15 @@ int xmodem_get_ack(xmodem_t* xm, int tries)
 
 	return(0);
 }
+
+char* xmodem_ver(char *buf)
+{
+	sscanf("$Revision$", "%*s %s", buf);
+
+	return(buf);
+}
+
+const char* xmodem_source(void)
+{
+	return(__FILE__);
+}
\ No newline at end of file
diff --git a/src/sbbs3/xmodem.h b/src/sbbs3/xmodem.h
index 7a6d63e1e17a56e865ba4294db8dc271d8e83d89..d4e2b423fb41e31caf092727434fe54f7a6efdc1 100644
--- a/src/sbbs3/xmodem.h
+++ b/src/sbbs3/xmodem.h
@@ -52,10 +52,12 @@ typedef struct {
 } xmodem_t;
 
 
-void	xmodem_cancel(xmodem_t* xm);
-int		xmodem_get_ack(xmodem_t* xm, int tries);
-void	xmodem_put_nak(xmodem_t* xm);
-int		xmodem_get_block(xmodem_t* xm, uchar* block, uint block_size, BOOL hdrblock);
-void	xmodem_put_block(xmodem_t* xm, uchar* block, uint block_size, ulong block_num);
+char*		xmodem_ver(char *buf);
+const char* xmodem_source(void);
+void		xmodem_cancel(xmodem_t* xm);
+int			xmodem_get_ack(xmodem_t* xm, int tries);
+void		xmodem_put_nak(xmodem_t* xm);
+int			xmodem_get_block(xmodem_t* xm, uchar* block, uint block_size, BOOL hdrblock);
+void		xmodem_put_block(xmodem_t* xm, uchar* block, uint block_size, ulong block_num);
 
 #endif	/* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c
index 61123d7e39e7896d3acb3894b1dda260a622f22c..a55039476cfcd6ae29a8f236a26be398d989dee1 100644
--- a/src/sbbs3/zmodem.c
+++ b/src/sbbs3/zmodem.c
@@ -1835,4 +1835,16 @@ zmodem_send_files(char** fname, int total_files)
 
 
 
-#endif
\ No newline at end of file
+#endif
+
+char* zmodem_ver(char *buf)
+{
+	sscanf("$Revision$", "%*s %s", buf);
+
+	return(buf);
+}
+
+const char* zmodem_source(void)
+{
+	return(__FILE__);
+}
\ No newline at end of file
diff --git a/src/sbbs3/zmodem.h b/src/sbbs3/zmodem.h
index d21e8ed8021c9663c6fe9721857b3091fd3e3de5..34b61d4e8974ecf568aa7222559b80215a90ef2c 100644
--- a/src/sbbs3/zmodem.h
+++ b/src/sbbs3/zmodem.h
@@ -244,10 +244,12 @@ typedef struct {
 
 } zmodem_t;
 
-int		zmodem_get_zrinit(zmodem_t* zm);
-void	zmodem_parse_zrinit(zmodem_t* zm);
-int		zmodem_send_zfin(zmodem_t* zm);
-int		zmodem_send_file(zmodem_t* zm, char* name, FILE* fp);
+char*		zmodem_ver(char *buf);
+const char* zmodem_source(void);
+int			zmodem_get_zrinit(zmodem_t* zm);
+void		zmodem_parse_zrinit(zmodem_t* zm);
+int			zmodem_send_zfin(zmodem_t* zm);
+int			zmodem_send_file(zmodem_t* zm, char* name, FILE* fp);
 
 #endif