diff --git a/src/sbbs3/qbbsdefs.hpp b/src/sbbs3/qbbsdefs.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..12d0034b8a550124a9577556aac154b1469ca0a3
--- /dev/null
+++ b/src/sbbs3/qbbsdefs.hpp
@@ -0,0 +1,145 @@
+/* QuickBBS Structure Definitions, Source: STRUCT.290 from QuickBBS v2.90 */
+
+/****************************************************************************
+ * @format.tab-size 4		(Plain Text/Source Code File Header)			*
+ * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
+ *																			*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
+ *																			*
+ * This library is free software; you can redistribute it and/or			*
+ * modify it under the terms of the GNU Lesser General Public License		*
+ * as published by the Free Software Foundation; either version 2			*
+ * of the License, or (at your option) any later version.					*
+ * See the GNU Lesser General Public License for more details: lgpl.txt or	*
+ * http://www.fsf.org/copyleft/lesser.html									*
+ *																			*
+ * For Synchronet coding style and modification guidelines, see				*
+ * http://www.synchro.net/source.html										*
+ *																			*
+ * Note: If this box doesn't appear square, then you need to fix your tabs.	*
+ ****************************************************************************/
+
+#ifndef QBBSDEFS_H_
+#define QBBSDEFS_H_
+
+#include "pascal_types.hpp"
+
+namespace QBBS {
+
+using Pascal::String;
+using Pascal::Byte;
+using Pascal::Word;
+using Pascal::Boolean;
+using Pascal::Integer;
+using Pascal::LongInt;
+using Pascal::LongWord;
+
+static const int USER_NAME_LEN			= 35;
+
+static const int USER_ATTRIB_DELETED	= (1<<0);
+static const int USER_ATTRIB_CLRSCRN	= (1<<1);
+static const int USER_ATTRIB_MORE		= (1<<2);
+static const int USER_ATTRIB_ANSI		= (1<<3);
+static const int USER_ATTRIB_NO_KILL	= (1<<4);
+static const int USER_ATTRIB_IGN_DL_HRS	= (1<<5);
+static const int USER_ATTRIB_ANSI_FSED	= (1<<6);
+static const int USER_ATTRIB_FEMALE		= (1<<7);
+
+static const int USER_ATTRIB2_GUEST		= (1<<0);
+static const int USER_ATTRIB2_SSR		= (1<<1);
+static const int USER_ATTRIB2_DIRTY		= (1<<7);
+
+#pragma pack(push,1)	// Disk image structures must be packed
+
+struct sysinfo {
+	LongInt	CallCount;
+	String<USER_NAME_LEN> LastCallerName; // Just "LastCaller" in QuickBBS v2.75
+	String<USER_NAME_LEN> LastCallerAlias; // Not present in QuickBBS v2.75
+	Byte ExtraSpace[92];
+};
+
+struct timelog {
+	String<8> StartDate;	// MM-DD-YY
+	Word BusyPerHour[24];
+	Word BusyPerDay[7];
+};
+
+struct user {
+	String<USER_NAME_LEN> Name;
+	String<25> Location; // "City"
+	// End of commonality with RemoteAccess
+	Byte	Reserved; // Reserved, should always be 0 (used to be the password string length)
+	Byte	Language;
+	LongInt	PwdCrc;	// Was PascalString<15> Password in QuickBBS v2.75
+	Word	PwdChangeData,
+			ExpireData; // Number of days since 1/1/1900
+	LongInt	HighMsgRead;
+	Byte Attrib2;
+	Byte ExtraSpace;
+	String<12> DataPhone;
+	String<12> HomePhone;
+	String<5> LastTime;
+	String<8> LastDate;
+	Byte Attrib;
+	LongWord Flags; // Byte[4]
+	Word	Credit,
+			Pending,
+			TimesPosted,
+			ObsoleteField, // Was HighMsgRead in QuickBBS v2.75
+			SecLvl,
+			Times,
+			Ups,
+			Downs,
+			UpK,
+			DownK,
+			TodayK;
+	Integer	Elapsed,
+			ScreenLength; // "Len" in QuickBBS STRUCT.*, "ScreenLength" in RemoteAccess STUCT.* (at different offset)
+	Word	CombinedPtr; // Record number in COMBINED.BBS, Note:  0 signifies no combined record assigned
+	Word	AliasPtr; // Record number in ALIAS.BBS, Note:  0 signifies no alias record assigned
+	LongInt	Birthday; // Number of days since 1/1/1600
+};
+
+struct exitinfo {
+	Word		BaudRate;
+	sysinfo		SysInfo;
+	timelog		TimeLogInfo;
+	user		UserInfo;
+	Byte		EventInfo[19]; // *NO LONGER* used, It should be initialized to NULL
+	Boolean		NetMailEntered;
+	Boolean		EchoMailEntered;
+	String<5>	LoginTime;
+	String<8>	LoginDate;
+	Integer		TimeLimit; // TmLimit
+	LongInt		LoginSec;
+	// End of commonality with RemoteAccess v2.52 EXITINFO.BBS definition (STRUCT.252)
+	LongInt		Credit;
+	Integer		UserRecNum;
+	Word		ReadThru;
+	Integer		PageTimes;
+	Integer		DownLimit;
+	Boolean		WantChat;
+	Byte		GosubLevel;
+	String<8>	GoSubDataType[20];
+	String<8>	Menu;
+	// End of QuickBBS v2.75 EXITINFO.BBS definition (STRUCT.275)
+	Boolean		ScreenClear,
+				MorePrompts,
+				GraphicsMode,
+				ExternEdit;
+	Integer		ScreenLength;
+	Boolean		MNP_Connect;
+	String<48>	ChatReason;
+	Boolean		ExternLogoff;
+	Boolean		ANSI_Capable;
+	// End of Synchronet v3.19b EXITINFO.BBS generation
+	Byte		CurrentLanguage;
+	Boolean		RIP_Active;
+	Byte		ExtraSpace[199];
+};
+
+#pragma pack(pop)		// original packing
+
+} // namespace QBBS
+
+#endif // Don't add anything after this line