diff --git a/database/convert-tsql b/database/convert-tsql
new file mode 100755
index 0000000000000000000000000000000000000000..32428122f4b416812d48c3bf71c71853908ed838
--- /dev/null
+++ b/database/convert-tsql
@@ -0,0 +1,110 @@
+#!/bin/bash
+# Database translation/creation script
+# Copyright (C) 2008, LinuxRulz
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+database="$1"
+file="$2"
+prefix="$3"
+
+
+# Display usage info
+display_usage() {
+    echo "Usage: $0 <database type> <file> [prefix]"
+    echo
+    echo "Valid database types:"
+    echo "      mysql4  - For MySQL v4"
+    echo "      mysql   - For MySQL v5"
+    echo "      pgsql   - For PostgreSQL"
+    echo "      sqlite  - For SQLite v3"
+    echo 
+    exit
+}
+
+
+# Check we have our params
+if [ -z "$database" -o -z "$file" ]
+then
+    display_usage
+fi
+
+
+
+# Check file exists
+if [ ! -f "$file" ]
+then
+    echo "ERROR: Cannot open file '$file'"
+    exit 1
+fi
+
+# Check what we converting for
+case "$database" in
+    	"mysql4")
+		sed \
+			-e "s/@PREFIX@/$prefix/g" \
+			-e 's/@PRELOAD@/SET FOREIGN_KEY_CHECKS=0;/' \
+			-e 's/@POSTLOAD@/SET FOREIGN_KEY_CHECKS=1;/' \
+			-e 's/@CREATE_TABLE_SUFFIX@/TYPE=InnoDB CHARACTER SET latin1 COLLATE latin1_bin/' \
+			-e 's/@SERIAL_TYPE@/SERIAL/' \
+			-e 's/@BIG_INTEGER@/BIGINT UNSIGNED/' \
+			-e 's/@TRACK_KEY_LEN@/255/' \
+			-e 's/@SERIAL_REF_TYPE@/BIGINT UNSIGNED/' < "$file"
+		;;
+
+    	"mysql")
+		sed \
+			-e "s/@PREFIX@/$prefix/g" \
+			-e 's/@PRELOAD@/SET FOREIGN_KEY_CHECKS=0;/' \
+			-e 's/@POSTLOAD@/SET FOREIGN_KEY_CHECKS=1;/' \
+			-e 's/@CREATE_TABLE_SUFFIX@/TYPE=InnoDB CHARACTER SET latin1 COLLATE latin1_bin/' \
+			-e 's/@SERIAL_TYPE@/SERIAL/' \
+			-e 's/@BIG_INTEGER@/BIGINT UNSIGNED/' \
+			-e 's/@TRACK_KEY_LEN@/512/' \
+			-e 's/@SERIAL_REF_TYPE@/BIGINT UNSIGNED/' < "$file"
+		;;
+
+	"pgsql")
+		sed \
+			-e "s/@PREFIX@/$prefix/g" \
+			-e 's/@PRELOAD@/SET CONSTRAINTS ALL DEFERRED;/' \
+			-e 's/@POSTLOAD@//' \
+			-e 's/@CREATE_TABLE_SUFFIX@//' \
+			-e 's/@SERIAL_TYPE@/SERIAL PRIMARY KEY/' \
+			-e 's/@BIG_INTEGER@/INT8/' \
+			-e 's/@TRACK_KEY_LEN@/512/' \
+			-e 's/@SERIAL_REF_TYPE@/INT8/' < "$file"
+		;;
+
+	"sqlite")
+		sed \
+			-e "s/@PREFIX@/$prefix/g" \
+			-e 's/@PRELOAD@//' \
+			-e 's/@POSTLOAD@//' \
+			-e 's/@CREATE_TABLE_SUFFIX@//' \
+			-e 's/@SERIAL_TYPE@/INTEGER PRIMARY KEY AUTOINCREMENT/' \
+			-e 's/@BIG_INTEGER@/INT8/' \
+			-e 's/@TRACK_KEY_LEN@/512/' \
+			-e 's/@SERIAL_REF_TYPE@/INT8/' < "$file"
+		;;
+
+	*)
+	    echo "ERROR: Invalid database type '$database'"
+	    exit 1
+	    ;;
+
+esac
+
+
diff --git a/database/core.tsql b/database/core.tsql
new file mode 100644
index 0000000000000000000000000000000000000000..74b00de512a312466c8aa6bd246a257e933c1bae
--- /dev/null
+++ b/database/core.tsql
@@ -0,0 +1,253 @@
+@PRELOAD@
+
+
+/* Users */
+CREATE TABLE @PREFIX@users (
+	ID			@SERIAL_TYPE@,
+
+	Username		VARCHAR(255) NOT NULL,
+
+	Description		TEXT,
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0'
+
+	UNIQUE (Username)
+) @CREATE_TABLE_SUFFIX@;
+CREATE INDEX @PREFIX@users_idx1 ON @PREFIX@users (Username);
+
+
+/* User check items */
+CREATE TABLE @PREFIX@user_check_items (
+	ID			@SERIAL_TYPE@,
+
+	Name			VARCHAR(255) NOT NULL,
+	Op			VARCHAR(3) NOT NULL,
+	Value			VARCHAR(255),
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0'
+
+	UNIQUE (Name)
+) @CREATE_TABLE_SUFFIX@;
+
+
+/* User reply items */
+CREATE TABLE @PREFIX@user_reply_items (
+	ID			@SERIAL_TYPE@,
+
+	Name			VARCHAR(255) NOT NULL,
+	Op			VARCHAR(3) NOT NULL,
+	Value			VARCHAR(255),
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0'
+
+	UNIQUE (Name)
+) @CREATE_TABLE_SUFFIX@;
+
+
+
+/* Groups */
+CREATE TABLE @PREFIX@groups (
+	ID			@SERIAL_TYPE@,
+
+	Name			VARCHAR(255) NOT NULL,
+
+	Priority		SMALLINT NOT NULL,
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0',
+
+	Comment			VARCHAR(1024),
+
+	UNIQUE (Name)
+)  @CREATE_TABLE_SUFFIX@;
+CREATE INDEX @PREFIX@groups_idx1 ON @PREFIX@users (Name);
+
+
+/* Group check items */
+CREATE TABLE @PREFIX@group_check_items (
+	ID			@SERIAL_TYPE@,
+
+	Name			VARCHAR(255) NOT NULL,
+	Op			VARCHAR(3) NOT NULL,
+	Value			VARCHAR(255),
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0'
+
+	UNIQUE (Name)
+) @CREATE_TABLE_SUFFIX@;
+
+
+/* Group reply items */
+CREATE TABLE @PREFIX@group_reply_items (
+	ID			@SERIAL_TYPE@,
+
+	Name			VARCHAR(255) NOT NULL,
+	Op			VARCHAR(3) NOT NULL,
+	Value			VARCHAR(255),
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0'
+
+	UNIQUE (Name)
+) @CREATE_TABLE_SUFFIX@;
+
+
+
+/* User to group mapping */
+CREATE TABLE @PREFIX@users_to_groups (
+	ID			@SERIAL_TYPE@,
+
+	UserID			@SERIAL_REF_TYPE@ NOT NULL,
+	GroupID			@SERIAL_REF_TYPE@ NOT NULL,
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0',
+	Comment			VARCHAR(1024),
+
+	UNIQUE (UserID,GroupID),
+	FOREIGN KEY (UserID) REFERENCES @PREFIX@users(ID),
+	FOREIGN KEY (GroupID) REFERENCES @PREFIX@groups(ID)
+)  @CREATE_TABLE_SUFFIX@;
+CREATE INDEX @PREFIX@users_to_groups_idx1 ON @PREFIX@users_to_groups (UserID,GroupID);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/* Member list for policies */
+CREATE TABLE @PREFIX@policy_members (
+	ID			@SERIAL_TYPE@,
+
+	PolicyID		@SERIAL_REF_TYPE@,
+
+	/* 
+		Format of key: 
+		NULL = any
+		a.b.c.d/e = IP address with optional /e
+		@domain = domain specification, 
+		%xyz = xyz group, 
+		abc@domain = abc user specification
+
+		all options support negation using !<key>
+	*/
+	Source			TEXT,
+	Destination		TEXT,
+
+	Comment			VARCHAR(1024),
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0',
+
+	FOREIGN KEY (PolicyID) REFERENCES @PREFIX@policies(ID)
+) @CREATE_TABLE_SUFFIX@;
+
+
+/* Default System Policy */
+INSERT INTO @PREFIX@policy_members (PolicyID,Source,Destination) VALUES
+	(1,NULL,NULL);
+/* Default Outbound System Policy */
+INSERT INTO @PREFIX@policy_members (PolicyID,Source,Destination) VALUES
+	(2,'%internal_ips,%internal_domains','!%internal_domains');
+/* Default Inbound System Policy */
+INSERT INTO @PREFIX@policy_members (PolicyID,Source,Destination) VALUES
+	(3,'!%internal_ips,!%internal_domains','%internal_domains');
+/* Default Internal System Policy */
+INSERT INTO @PREFIX@policy_members (PolicyID,Source,Destination) VALUES
+	(4,'%internal_ips,%internal_domains','%internal_domains');
+/* Test Policy */
+INSERT INTO @PREFIX@policy_members (PolicyID,Source,Destination) VALUES
+	(5,'@example.net',NULL);
+
+
+
+/* Groups usable in ACL */
+CREATE TABLE @PREFIX@policy_groups (
+	ID			@SERIAL_TYPE@,
+
+	Name			VARCHAR(255) NOT NULL,
+
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0',
+
+	Comment			VARCHAR(1024),
+
+
+	UNIQUE (Name)
+)  @CREATE_TABLE_SUFFIX@;
+
+INSERT INTO @PREFIX@policy_groups (Name) VALUES ('internal_ips');
+INSERT INTO @PREFIX@policy_groups (Name) VALUES ('internal_domains');
+
+
+
+/* Group members */
+CREATE TABLE @PREFIX@policy_group_members (
+	ID			@SERIAL_TYPE@,
+
+	PolicyGroupID		@SERIAL_REF_TYPE@,
+
+	/* Format of member: a.b.c.d/e = ip,  @domain = domain, %xyz = xyz group, abc@domain = abc user */
+	Member			VARCHAR(255) NOT NULL,
+	
+
+	Disabled		SMALLINT NOT NULL DEFAULT '0',
+	Comment			VARCHAR(1024),
+
+
+	FOREIGN KEY (PolicyGroupID) REFERENCES @PREFIX@policy_groups(ID)
+)  @CREATE_TABLE_SUFFIX@;
+
+INSERT INTO @PREFIX@policy_group_members (PolicyGroupID,Member) VALUES (1,'10.0.0.0/8');
+INSERT INTO @PREFIX@policy_group_members (PolicyGroupID,Member) VALUES (2,'@example.org');
+INSERT INTO @PREFIX@policy_group_members (PolicyGroupID,Member) VALUES (2,'@example.com');
+
+
+
+/* Message session tracking */
+CREATE TABLE @PREFIX@session_tracking (
+	Instance		VARCHAR(255),
+	QueueID			VARCHAR(255),
+
+	Timestamp		BIGINT NOT NULL,
+
+	ClientAddress		VARCHAR(64),
+	ClientName		VARCHAR(255),
+	ClientReverseName	VARCHAR(255),
+
+	Protocol		VARCHAR(255),
+
+	EncryptionProtocol	VARCHAR(255),
+	EncryptionCipher	VARCHAR(255),
+	EncryptionKeySize	VARCHAR(255),
+
+	SASLMethod		VARCHAR(255),
+	SASLSender		VARCHAR(255),
+	SASLUsername		VARCHAR(255),
+
+	Helo			VARCHAR(255),
+
+	Sender			VARCHAR(255),
+
+	Size			@BIG_INTEGER@,
+
+	RecipientData		TEXT,  /* Policy state information */
+
+	UNIQUE (Instance)
+)  @CREATE_TABLE_SUFFIX@;
+CREATE INDEX @PREFIX@session_tracking_idx1 ON @PREFIX@session_tracking (QueueID,ClientAddress,Sender);
+CREATE INDEX @PREFIX@session_tracking_idx2 ON @PREFIX@session_tracking (Timestamp);
+
+
+