diff --git a/exec/qnet-ftp.src b/exec/qnet-ftp.src
new file mode 100644
index 0000000000000000000000000000000000000000..4deb840faf73c6db13f7bb0d402447ad70b33916
--- /dev/null
+++ b/exec/qnet-ftp.src
@@ -0,0 +1,178 @@
+# qnet-ftp.src
+
+# $Id$
+
+# @format.tab-size 8, @format.use-tabs true
+
+###############################################################################
+#	  Baja module for performing FTP-based QWKnet call-outs		      #
+#	        Requires Synchronet v3.00d and Baja v2.30		      #
+#			Developed 2001 by Rob Swindell 			      #
+###############################################################################
+
+# Usage: *QNET-FTP HUBID ADDRESSS PASSWORD
+# Example: *QNET-FTP VERT vert.synchro.net YOURPASS
+
+# You may use the qnet-ftp.bin module INSTEAD of your normal ftp/script
+# QWKnet call-out routine (exec/vert.bat). You can do this by changing
+#
+# SCFG->Networks->QWK->Hubs->VERT->Call-out Command Line to:
+#
+# *QNET-FTP VERT vert.synchro.net YOURPASS
+#
+# The asterisk is important! YOURPASS is your QWKnet password here on Vertrauen
+. 
+#
+# No modification or recompilation of this module should be necessary.
+
+!include sbbsdefs.inc
+!include file_io.inc
+
+# Must be FIRST function call (or module will immediately terminate)
+set _online ON_LOCAL
+
+# Variables
+int i argc argv sock port
+str tmp rep qwk hubid addr user password 
+str cmdline
+
+set _ftp_mode FTP_PASV
+
+# Process command line arguments
+set hubid ""
+set addr ""
+set password ""
+
+# Display command line
+copy cmdline str
+lprintf "QNET-FTP: %s" cmdline
+set argc 0
+:process_args
+compare_str ""
+if_true
+	goto end_args
+	end_if
+sprintf tmp "%.1s" str
+shift_str 1
+compare tmp " "
+if_true
+	add argc 1
+	goto process_args
+	end_if
+switch argc
+	case 0
+		strcat hubid tmp
+		end_case
+	case 1
+		strcat addr tmp
+		end_case
+	case 2
+		strcat password tmp
+		end_case
+	default
+		goto usage
+	end_switch
+goto process_args
+
+:usage
+lprintf "QNET-FTP: !INCORRECT USAGE: %s" cmdline
+return
+
+:end_args
+compare hubid ""
+if_true
+	goto usage
+	end_if
+compare addr ""
+if_true
+	goto usage
+	end_if
+compare password ""
+if_true
+	goto usage
+	end_if
+
+sprintf rep "%%j%s.rep" hubid
+sprintf qwk "%%j%s.qwk" hubid
+chkfile qwk
+if_true
+	lprintf "QNET-FTP: %s already exists!" qwk
+	set i 0
+	:check_qwk
+	sprintf qwk "%%j%s.QW%ld" hubid i
+	chkfile qwk
+	if_true
+		lprintf "QNET-FTP: %s already exists!" qwk
+		add i 1
+		compare i 10
+		if_equal
+			goto exit
+			end_if
+		goto check_qwk
+		end_if
+	end_if
+
+socket_open sock
+if_false
+	lprintf "QNET-FTP: !socket_open failure socket_error=%d" _socket_error
+	goto exit
+	end_if
+
+set port 21	# default FTP port
+lprintf "QNET-FTP: Connecting to %s ... " addr
+socket_connect sock addr port 
+crlf
+if_false
+	lprintf "QNET-FTP: !socket_connect failed socket_error=%d" _socket_error
+	goto exit
+	end_if
+lprintf "QNET-FTP: Connected to %s" addr
+
+set user "%q"
+lprintf "QNET-FTP: Logging in as '%s' (PW: '%s')" user password
+ftp_login sock user password
+if_false
+	lprintf "QNET-FTP: !ftp_login failed socket_error=%d" _socket_error
+	goto exit
+	end_if
+
+lprintf "QNET-FTP: Logged in successfully"
+
+chkfile rep
+if_true
+	###################
+	# Send REP packet #
+	###################
+	lprintf "QNET-FTP: Sending REP packet: %s" rep
+
+	sprintf str "%s.rep" hubid
+
+	ftp_put sock rep str
+	if_false
+		lprintf "QNET-FTP: !ftp_put failed socket_error=%d\r\n" _socket_error
+	else
+		lprintf "QNET-FTP: REP packet sent successfully"
+		end_if
+
+	remove_file rep
+	end_if
+
+#######################
+# Download QWK packet #
+#######################
+sprintf str "%s.qwk" hubid
+lprintf "QNET-FTP: Downloading QWK Packet: %s" str
+ftp_get sock str qwk
+if_true
+	lprintf "QNET-FTP: Downloaded %s successfully" str
+else
+	lprintf "QNET-FTP: %s NOT downloaded (no new messages?)" str
+	end_if
+
+#################
+# Exit routine	#
+#################
+:exit
+lprintf "QNET-FTP: Done."
+
+# End of QNET-FTP.SRC