diff -ruN ./pyicq-t-0.8.orig/config_example.xml ./pyicq-t-0.8/config_example.xml
--- ./pyicq-t-0.8.orig/config_example.xml	2006-10-01 00:16:49.000000000 +0400
+++ ./pyicq-t-0.8/config_example.xml	2006-10-09 17:23:19.000000000 +0400
@@ -128,6 +128,17 @@
 	<!--<format>encrypted</format>--> <!-- Enable encryption of passwords -->
 	<!--</xdbDriver_mysql>-->
 
+	<!-- For PostgreSQL -->
+	<xdbDriver>postgresql</xdbDriver>
+	<xdbDriver_postgresql>
+	<username>pyicqt</username> 
+	<password>pyicqt</password> 
+	<database>pyicqt</database> 
+	<server>localhost</server> 
+	<format>encrypted</format> <!--  Enable encryption of passwords --> 
+	<table_prefix>pyicq</table_prefix> 
+	</xdbDriver_postgresql>
+
 	<!-- For XMLFiles -->
 	<!--<xdbDriver>xmlfiles</xdbDriver>-->
 	<!--<xdbDriver_xmlfiles>-->
diff -ruN ./pyicq-t-0.8.orig/src/config.py ./pyicq-t-0.8/src/config.py
--- ./pyicq-t-0.8.orig/src/config.py	2006-09-17 21:59:10.000000000 +0400
+++ ./pyicq-t-0.8/src/config.py	2006-10-06 00:50:18.000000000 +0400
@@ -46,6 +46,7 @@
 xdbDriver = "xmlfiles"
 xdbDriver_mysql = {}
 xdbDriver_xmlfiles = {}
+xdbDriver_postgresql = {}
 useXCP = bool(False)
 useComponentBinding = bool(False)
 useRouteWrap = bool(False)
@@ -64,3 +65,4 @@
 disableVCardAvatars = bool(False)
 #disablePEPAvatars = bool(False)
 disableAwayMessage = bool(False)
+table_prefix = ""
diff -ruN ./pyicq-t-0.8.orig/src/xdb/postgresql.py ./pyicq-t-0.8/src/xdb/postgresql.py
--- ./pyicq-t-0.8.orig/src/xdb/postgresql.py	1970-01-01 03:00:00.000000000 +0300
+++ ./pyicq-t-0.8/src/xdb/postgresql.py	2006-10-06 01:25:10.000000000 +0400
@@ -0,0 +1,184 @@
+# Copyright 2005-2006 Daniel Henninger <jadestorm@nc.rr.com>
+# Licensed for distribution under the GPL version 2, check COPYING for details
+#
+# MySQL database storage.  See db-setup.mysql in the tools directory in
+# the root of the distribution, as well as configuration options in your
+# transport config file.  (see config_example.xml)
+#
+
+import config
+import os
+import psycopg2
+import utils
+
+class XDB:
+	"""
+	Class for storage of data.
+	"""
+	def __init__(self, name):
+		""" Creates an XDB object. """
+
+		# Define names of tables
+		self.table_prefix = str(config.xdbDriver_postgresql["table_prefix"])
+		self.table_register = self.table_prefix + "register"
+		self.table_settings = self.table_prefix + "settings"
+		self.table_lists = self.table_prefix + "lists"
+		self.table_la = self.table_prefix + "list_attributes"
+					
+		dsn = "host=" + str(config.xdbDriver_postgresql["server"]) + " dbname=" + str(config.xdbDriver_postgresql["database"]) + " user=" + str(config.xdbDriver_postgresql["username"]) + " password=" + str(config.xdbDriver_postgresql["password"])
+		self.db=psycopg2.connect(dsn)
+		if not self.db:
+			print "Unable to connect to PosgreSQL database."
+			os.exit(1)
+
+	def getRegistration(self, jabberID):
+		""" Retrieve registration information from the XDB.
+		Returns a username and password. """
+		c=self.db.cursor()
+		c.execute("SELECT username,password,encryptedpassword FROM %s WHERE owner = '%s'" % (self.table_register, jabberID))
+		ret = c.fetchone()
+		if ret:
+			(username,password,encpass) = ret
+			if encpass:
+				return (username,utils.decryptPassword(encpass))
+			else:
+				return (username,password)
+		else:
+			return None
+
+	def getRegistrationList(self):
+		""" Returns an array of all of the registered jids. """
+		c=self.db.cursor()
+		c.execute("SELECT owner FROM %s" % (self.table_register))
+		results = []
+		ret = c.fetchone()
+		while ret:
+			(jid) = ret[0]
+			results.append(jid)
+			ret = c.fetchone()
+		return results
+
+	def setRegistration(self, jabberID, username, password):
+		""" Sets up or creates a registration in the XDB.
+		username and password are for the legacy account. """
+		c=self.db.cursor()
+		c.execute("DELETE FROM %s WHERE owner = '%s'" % (self.table_register, jabberID))
+                if config.xdbDriver_postgresql.get("format","") == "encrypted":
+			c.execute("INSERT INTO %s(owner,username,encryptedpassword) VALUES('%s','%s','%s')" % (self.table_register, jabberID, username, utils.encryptPassword(password)))
+		else:
+			c.execute("INSERT INTO %s(owner,username,password) VALUES('%s','%s','%s')" % (self.table_register, jabberID, username, password))
+		self.db.commit()
+
+	def removeRegistration(self, jabberID):
+		""" Removes a registration from the XDB. """
+		c=self.db.cursor()
+		c.execute("DELETE FROM %s WHERE owner = '%s'" % (self.table_register, jabberID))
+		c.execute("DELETE FROM %s WHERE owner = '%s'" % (self.table_settings, jabberID))
+		c.execute("DELETE FROM %s WHERE owner = '%s'" % (self.table_lists, jabberID))
+		c.execute("DELETE FROM %s WHERE owner = '%s'" % (self.table_la, jabberID))
+		self.db.commit()
+
+	def getSettingList(self, jabberID):
+		""" Gets a list of all settings for a user from the XDB. """
+		c=self.db.cursor()
+		c.execute("SELECT variable,value FROM %s WHERE owner = '%s'" % (self.table_settings, jabberID))
+		results = []
+		ret = c.fetchone()
+		while ret:
+			(variable) = ret[0]
+			(value) = ret[1]
+			results[variable] = value
+			ret = c.fetchone()
+		return results
+
+	def getSetting(self, jabberID, variable):
+		""" Gets a user setting from the XDB. """
+		c=self.db.cursor()
+		c.execute("SELECT value FROM %s WHERE owner = '%s' AND variable = '%s'" % (self.table_settings, jabberID, variable))
+		ret = c.fetchone()
+		if ret:
+			(value) = ret[0]
+			return value
+		else:
+			return None
+
+	def setSetting(self, jabberID, variable, value):
+		""" Sets a user setting in the XDB. """
+		c=self.db.cursor()
+		c.execute("DELETE FROM %s WHERE owner = '%s' AND variable = '%s'" % (self.table_settings, jabberID, variable))
+		c.execute("INSERT INTO %s(owner,variable,value) VALUES('%s','%s','%s')" % (self.table_settings, jabberID, variable, value))
+		self.db.commit()
+
+	def getListEntry(self, type, jabberID, legacyID):
+		""" Retrieves a legacy ID entry from a list in
+		the XDB, based off the type and jabberID you provide. """
+		attributes = {}
+		c=self.db.cursor()
+		c.execute("SELECT attribute,value FROM %s WHERE owner = '%s' AND type = '%s' AND jid = '%s'" % (self.table_la, jabberID, type, legacyID))
+		ret = c.fetchone()
+		while ret:
+			(attribute,value) = ret[0:1]
+			attributes[attribute] = value
+			ret = c.fetchone()
+		return attributes
+
+	def getListTypes(self, jabberID):
+		""" Returns an array containing a list of all list types
+		associated with a user. """
+		types = []
+		c=self.db.cursor()
+		c.execute("SELECT type FROM %s WHERE owner = '%s'" % (self.table_lists, jabberID))
+		ret = c.fetchone()
+		while ret:
+			(type) = ret[0]
+			types.append(type)
+			ret = c.fetchone()
+                return types
+
+	def getList(self, type, jabberID):
+		""" Retrieves an array containing an entire list of a
+		 jabberID's from the XDB, based off the type and jabberID
+		you provide. """
+		entities = []
+		c=self.db.cursor()
+		c.execute("SELECT jid FROM %s WHERE owner = '%s' AND type = '%s'" % (self.table_lists, jabberID, type))
+		ret = c.fetchone()
+		while ret:
+			(jid) = ret[0]
+			entity = []
+			entity.append(jid)
+			attributes = {}
+			ic = self.db.cursor()
+			ic.execute("SELECT attribute,value FROM %s WHERE owner = '%s' AND type = '%s' AND jid = '%s'" % (self.table_la, jabberID, type, jid))
+			iret = ic.fetchone()
+			while iret:
+				(attribute,value) = iret[0:2]
+				attributes[attribute] = value
+				iret = ic.fetchone()
+			entity.append(attributes)
+			ret = c.fetchone()
+		return entities
+
+	def setListEntry(self, type, jabberID, legacyID, payload = {}):
+		""" Updates or adds a legacy ID entry to a list in
+		the XDB, based off the type and jabberID you provide. """
+		c=self.db.cursor()
+		c.execute("DELETE FROM %s WHERE owner = '%s' AND type = '%s' AND jid = '%s'" % (self.table_lists, jabberID, type, legacyID))
+		c.execute("DELETE FROM %s WHERE owner = '%s' AND type = '%s' AND jid = '%s'" % (self.table_la, jabberID, type, legacyID))
+		c.execute("INSERT INTO %s(owner,type,jid) VALUES('%s','%s','%s')" % (self.table_lists, jabberID, type, legacyID))
+		for p in payload.keys():
+			c.execute("INSERT INTO %s(owner,type,jid,attribute,value) VALUES('%s','%s','%s','%s','%s')" % (self.table_la, jabberID, type, legacyID, p, payload[p].replace("'", "\\'")))
+		self.db.commit()
+
+	def removeListEntry(self, type, jabberID, legacyID):
+		""" Removes a legacy ID entry from a list in
+		the XDB, based off the type and jabberID you provide. """
+		c=self.db.cursor()
+		c.execute("DELETE FROM %s WHERE owner = '%s' AND type = '%s' AND jid = '%s'" % (self.table_lists, jabberID, type, legacyID))
+		c.execute("DELETE FROM %s WHERE owner = '%s' AND type = '%s' AND jid = '%s'" % (self.table_la, jabberID, type, legacyID))
+		self.db.commit()
+
+
+def housekeep():
+	""" Perform cleanup type tasks upon startup. """
+	pass
diff -ruN ./pyicq-t-0.8.orig/tools/db-setup.pgsql ./pyicq-t-0.8/tools/db-setup.pgsql
--- ./pyicq-t-0.8.orig/tools/db-setup.pgsql	1970-01-01 03:00:00.000000000 +0300
+++ ./pyicq-t-0.8/tools/db-setup.pgsql	2006-10-06 01:19:07.000000000 +0400
@@ -0,0 +1,144 @@
+--
+-- registration table
+--
+CREATE TABLE pyicq_register
+(
+  "owner" text NOT NULL,
+  username varchar(255),
+  "password" varchar(255),
+  encryptedpassword text,
+  CONSTRAINT "PK_register_owner" PRIMARY KEY ("owner")
+) 
+WITHOUT OIDS;
+
+
+-- Index: register_owner_index
+
+-- DROP INDEX register_owner_index;
+
+CREATE INDEX register_owner_index
+  ON pyicq_register
+  USING btree
+  ("owner");
+
+commit;
+--
+-- settings table
+--
+-- Table: settings
+
+-- DROP TABLE settings;
+
+CREATE TABLE pyicq_settings
+(
+  "owner" text NOT NULL,
+  variable varchar(255),
+  value varchar(255),
+  CONSTRAINT "PK_settings_owner" PRIMARY KEY ("owner")
+) 
+WITHOUT OIDS;
+
+
+-- Index: settings_owner_index
+
+-- DROP INDEX settings_owner_index;
+
+CREATE INDEX settings_owner_index
+  ON pyicq_settings
+  USING btree
+  ("owner");
+
+-- Index: settings_variable_index
+
+-- DROP INDEX settings_variable_index;
+
+CREATE INDEX settings_variable_index
+  ON pyicq_settings
+  USING btree
+  (variable);
+
+commit;
+--
+-- lists table
+--
+CREATE TABLE pyicq_lists
+(
+  "owner" text NOT NULL,
+  "type" varchar(255) NOT NULL,
+  jid varchar(255),
+  CONSTRAINT "PK_lists_owner" PRIMARY KEY ("owner")
+) 
+WITHOUT OIDS;
+
+
+-- Index: lists_jid_index
+
+-- DROP INDEX lists_jid_index;
+
+CREATE INDEX lists_jid_index
+  ON pyicq_lists
+  USING btree
+  (jid);
+
+-- Index: lists_owner_index
+
+-- DROP INDEX lists_owner_index;
+
+CREATE INDEX lists_owner_index
+  ON pyicq_lists
+  USING btree
+  ("owner");
+
+-- Index: lists_type_index
+
+-- DROP INDEX lists_type_index;
+
+CREATE INDEX lists_type_index
+  ON pyicq_lists
+  USING btree
+  ("type");
+
+commit;
+--
+-- list attributes table
+--
+CREATE TABLE pyicq_list_attributes
+(
+  "owner" text NOT NULL,
+  "type" varchar(255) NOT NULL,
+  jid varchar(255),
+  attribute varchar(255),
+  value varchar(255),
+  CONSTRAINT "PK_la_owner" PRIMARY KEY ("owner")
+) 
+WITHOUT OIDS;
+
+
+-- Index: la_jid_index
+
+-- DROP INDEX la_jid_index;
+
+CREATE INDEX la_jid_index
+  ON pyicq_list_attributes
+  USING btree
+  (jid);
+
+-- Index: la_owner_index
+
+-- DROP INDEX la_owner_index;
+
+CREATE INDEX la_owner_index
+  ON pyicq_list_attributes
+  USING btree
+  ("owner");
+
+-- Index: la_type_index
+
+-- DROP INDEX la_type_index;
+
+CREATE INDEX la_type_index
+  ON pyicq_list_attributes
+  USING btree
+  ("type");
+
+commit;
