diff --git a/src/chat.py b/src/chat.py
index 823a5ee4d1e2ca99a7b6812ed3e3bf4714e51d87..9632810f88db58f7cec749e3454168e788ba9988 100644
--- a/src/chat.py
+++ b/src/chat.py
@@ -33,7 +33,7 @@ APP = i18n.APP
 gtk.glade.bindtextdomain(APP, i18n.DIR)
 gtk.glade.textdomain(APP)
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
+GTKGUI_GLADE='gtkgui.glade'
 
 class Chat:
 	"""Class for chat/groupchat windows"""
@@ -58,15 +58,15 @@ class Chat:
 
 	def update_tags(self):
 		for jid in self.tagIn:
-			self.tagIn[jid].set_property("foreground", \
-				self.plugin.config['inmsgcolor'])
-			self.tagOut[jid].set_property("foreground", \
-				self.plugin.config['outmsgcolor'])
-			self.tagStatus[jid].set_property("foreground", \
-				self.plugin.config['statusmsgcolor'])
+			self.tagIn[jid].set_property('foreground', \
+				gajim.config.get('inmsgcolor'))
+			self.tagOut[jid].set_property('foreground', \
+				gajim.config.get('outmsgcolor'))
+			self.tagStatus[jid].set_property('foreground', \
+				gajim.config.get('statusmsgcolor'))
 
 	def update_print_time(self):
-		if self.plugin.config['print_time'] != 'sometimes':
+		if gajim.config.get('print_time') != 'sometimes':
 			list_jid = self.print_time_timeout_id.keys()
 			for jid in list_jid:
 				gobject.source_remove(self.print_time_timeout_id[jid])
@@ -85,9 +85,9 @@ class Chat:
 			unread += self.nb_unread[jid]
 		start = ""
 		if unread > 1:
-			start = "[" + str(unread) + "] "
+			start = '[' + str(unread) + '] '
 		elif unread == 1:
-			start = "* "
+			start = '* '
 		chat = self.names[jid]
 		if len(self.xmls) > 1: # if more than one tabs in the same window
 			if self.widget_name == 'tabbed_chat_window':
@@ -105,9 +105,9 @@ class Chat:
 		"""redraw the label of the tab"""
 		start = ''
 		if self.nb_unread[jid] > 1:
-			start = "[" + str(self.nb_unread[jid]) + "] "
+			start = '[' + str(self.nb_unread[jid]) + '] '
 		elif self.nb_unread[jid] == 1:
-			start = "* "
+			start = '* '
 		child = self.childs[jid]
 		tab_label = self.notebook.get_tab_label(child).get_children()[0]
 		tab_label.set_text(start + self.names[jid])
@@ -134,8 +134,7 @@ class Chat:
 		return active_jid
 
 	def on_close_button_clicked(self, button, jid):
-		"""When close button is pressed :
-		close a tab"""
+		"""When close button is pressed : close a tab"""
 		self.remove_tab(jid)
 
 	def on_chat_window_focus_in_event(self, widget, event):
@@ -219,13 +218,13 @@ class Chat:
 		conversation_buffer.create_mark('end', end_iter, False)
 		
 		self.tagIn[jid] = conversation_buffer.create_tag('incoming')
-		color = self.plugin.config['inmsgcolor']
+		color = gajim.config.get('inmsgcolor')
 		self.tagIn[jid].set_property('foreground', color)
 		self.tagOut[jid] = conversation_buffer.create_tag('outgoing')
-		color = self.plugin.config['outmsgcolor']
+		color = gajim.config.get('outmsgcolor')
 		self.tagOut[jid].set_property('foreground', color)
 		self.tagStatus[jid] = conversation_buffer.create_tag('status')
-		color = self.plugin.config['statusmsgcolor']
+		color = gajim.config.get('statusmsgcolor')
 		self.tagStatus[jid].set_property('foreground', color)
 		
 		tag = conversation_buffer.create_tag('time_sometimes')
@@ -405,7 +404,7 @@ class Chat:
 	def print_time_timeout(self, jid):
 		if not jid in self.xmls.keys():
 			return 0
-		if self.plugin.config['print_time'] == 'sometimes':
+		if gajim.config.get('print_time') == 'sometimes':
 			conversation_textview = self.xmls[jid].\
 				get_widget('conversation_textview')
 			conversation_buffer = conversation_textview.get_buffer()
@@ -487,7 +486,7 @@ class Chat:
 		index = 0
 		
 		# basic: links + mail + formatting is always checked (we like that)
-		if self.plugin.config['useemoticons']: # search for emoticons & urls
+		if gajim.config.get('useemoticons'): # search for emoticons & urls
 			iterator = self.plugin.emot_and_basic_re.finditer(otext)
 		else: # search for just urls + mail + formatting
 			iterator = self.plugin.basic_pattern_re.finditer(otext)
@@ -593,11 +592,11 @@ class Chat:
 			text = ''
 		if conversation_buffer.get_char_count() > 0:
 			conversation_buffer.insert(end_iter, '\n')
-		if self.plugin.config['print_time'] == 'always':
+		if gajim.config.get('print_time') == 'always':
 			if not tim:
 				tim = time.localtime()
-			self.before_time_symbols = self.plugin.config['before_time']
-			self.after_time_symbols = self.plugin.config['after_time']
+			self.before_time_symbols = gajim.config.get('before_time')
+			self.after_time_symbols = gajim.config.get('after_time')
 			format = self.before_time_symbols + '%H:%M:%S' + self.after_time_symbols
 			tim_format = time.strftime(format, tim)
 			conversation_buffer.insert(end_iter, tim_format + ' ')
@@ -614,8 +613,8 @@ class Chat:
 		tags = other_tags_for_name[:] #create a new list
 		tags.append(kind)
 		if name and not print_all_special:
-			self.before_nickname_symbols = self.plugin.config['before_nickname']
-			self.after_nickname_symbols = self.plugin.config['after_nickname']
+			self.before_nickname_symbols = gajim.config.get('before_nickname')
+			self.after_nickname_symbols = gajim.config.get('after_nickname')
 			format = self.before_nickname_symbols + name\
 				 + self.after_nickname_symbols + ' ' 
 			self.print_with_tag_list(conversation_buffer, format, end_iter, tags)
diff --git a/src/common/__init__.py b/src/common/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/common/connection.py b/src/common/connection.py
index f1b85f80aef2e1e7a88497a733e01698cacf7df2..a24af9b1ca162bc9fee9e163458f71197b411481 100644
--- a/src/common/connection.py
+++ b/src/common/connection.py
@@ -1,4 +1,4 @@
-##	Core/connection.py
+##	common/connection.py
 ##
 ## Gajim Team:
 ##	- Yann Le Boulanger <asterix@lagaule.org>
@@ -86,13 +86,12 @@ class connection:
 	def __init__(self, name = None):
 		# dict of function to be calledfor each event
 		self.handlers = {'ROSTER': [], 'WARNING': [], 'ERROR': [], 'STATUS': [], \
-			'NOTIFY': [], 'MSG': [], 'MSGERROR': [], 'SUBSCRIBED': [], \
-			'UNSUBSCRIBED': [], 'SUBSCRIBE': [], 'AGENTS': [], 'AGENT_INFO': [], \
-			'AGENT_INFO_ITEMS': [], 'AGENT_INFO_INFO': [], 'REG_AGENT_INFO': [], \
-			'QUIT': [], 'ACC_OK': [], 'CONFIG': [], 'MYVCARD': [], 'OS_INFO': [], \
-			'VCARD': [], 'LOG_NB_LINE': [], 'LOG_LINE': [], 'VISUAL': [], \
+			'NOTIFY': [], 'MSG': [], 'MSGERROR': [], 'MSGSENT': [] , \
+			'SUBSCRIBED': [], 'UNSUBSCRIBED': [], 'SUBSCRIBE': [], \
+			'AGENT_INFO': [], 'AGENT_INFO_ITEMS': [], 'AGENT_INFO_INFO': [], \
+			'QUIT': [], 'ACC_OK': [], 'MYVCARD': [], 'OS_INFO': [], 'VCARD': [], \
 			'GC_MSG': [], 'GC_SUBJECT': [], 'BAD_PASSPHRASE': [], \
-			'GPG_SECRETE_KEYS': [], 'ROSTER_INFO': [], 'MSGSENT': []}
+			'ROSTER_INFO': []}
 		self.name = name
 		self.connected = 0 # offline
 		self.connection = None # Jabber.py instance
diff --git a/src/config.py b/src/config.py
index 47e7db9f56c936241a8e81f7f5e737426e7ff701..8080e8d0ebad7345c8cf68947b373eb50ea57973 100644
--- a/src/config.py
+++ b/src/config.py
@@ -31,7 +31,7 @@ gtk.glade.textdomain (APP)
 from dialogs import *
 import gtkgui
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
+GTKGUI_GLADE='gtkgui.glade'
 
 
 class Preferences_window:
@@ -1213,9 +1213,13 @@ class Account_modification_window:
 			self.plugin.send('ASK_VCARD', self.account, jid)
 	
 	def on_gpg_choose_button_clicked(self, widget, data=None):
-		w = choose_gpg_key_dialog()
-		self.plugin.windows['gpg_keys'] = w
-		self.plugin.send('GPG_SECRETE_KEYS', None, ())
+		#FIXME:
+		secret_keys = connection.ask_gpg_secrete_keys()
+		if not secret_keys:
+			Error_dialog(_('error contacting %s') % service)
+			return
+		secret_keys['None'] = 'None'
+		w = choose_gpg_key_dialog(secret_keys)
 		keyID = w.run()
 		if keyID == -1:
 			return
@@ -1796,7 +1800,12 @@ class Service_discovery_window:
 		if not iter :
 			return
 		service = model.get_value(iter, 1)
-		self.plugin.send('REG_AGENT_INFO', self.account, service)
+		#FIXME:
+		infos = connection.ask_register_agent_info(service)
+		if not infos.has_key('instructions'):
+			Error_dialog(_('error contacting %s') % service)
+		else:
+			Service_registration_window(service, infos, self.plugin, self.account)
 		self.window.destroy()
 	
 	def on_services_treeview_cursor_changed(self, widget):
diff --git a/src/dialogs.py b/src/dialogs.py
index 8dfd11b7202aea83c7f0eeebbe31a8334893e222..1bebaec24fbcfc826099e24fe9b59196abffac7a 100644
--- a/src/dialogs.py
+++ b/src/dialogs.py
@@ -27,9 +27,8 @@ gtk.glade.bindtextdomain (APP, i18n.DIR)
 gtk.glade.textdomain (APP)
 
 import gtkgui
-import version
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
+GTKGUI_GLADE='gtkgui.glade'
 
 class Vcard_information_window:
 	"""Class for user's information window"""
@@ -363,7 +362,7 @@ class choose_gpg_key_dialog:
 		for keyID in list.keys():
 			model.append((keyID, list[keyID]))
 	
-	def __init__(self):
+	def __init__(self, secret_keys):
 		#list : {keyID: userName, ...}
 		xml = gtk.glade.XML(GTKGUI_GLADE, 'choose_gpg_key_dialog', APP)
 		self.window = xml.get_widget('choose_gpg_key_dialog')
@@ -377,6 +376,7 @@ class choose_gpg_key_dialog:
 		renderer = gtk.CellRendererText()
 		self.keys_treeview.insert_column_with_attributes(-1, _('User name'), \
 			renderer, text=1)
+		self.fill_tree(secret_keys)
 
 		self.window.show_all()
 
@@ -389,12 +389,12 @@ class Change_status_message_dialog:
 		self.autoconnect = autoconnect
 		message_textview = self.xml.get_widget('message_textview')
 		self.message_buffer = message_textview.get_buffer()
-		self.message_buffer.set_text(self.plugin.config['last_msg'])
+		self.message_buffer.set_text(gajim.config.get('last_msg'))
 		self.values = {'':''}
 		i = 0
-		while self.plugin.config.has_key('msg%s_name' % i):
-			self.values[self.plugin.config['msg%s_name' % i]] = \
-				self.plugin.config['msg%s' % i]
+		while gajim.config.exist('msg%s_name' % i):
+			self.values[gajim.config.get('msg%s_name' % i)] = \
+				gajim.config.get('msg%s' % i)
 			i += 1
 		liststore = gtk.ListStore(str, str)
 		message_comboboxentry = self.xml.get_widget('message_comboboxentry')
@@ -413,7 +413,7 @@ class Change_status_message_dialog:
 		if rep == gtk.RESPONSE_OK:
 			beg, end = self.message_buffer.get_bounds()
 			message = self.message_buffer.get_text(beg, end, 0)
-			self.plugin.config['last_msg'] = message
+			gajim.config.set('last_msg', message)
 		else:
 			message = -1
 		self.window.destroy()
@@ -565,7 +565,7 @@ class About_dialog:
 
 		dlg = gtk.AboutDialog()
 		dlg.set_name('Gajim')
-		dlg.set_version(version.version)
+		dlg.set_version(gajim.version.version)
 		s = u'Copyright \xa9 2003-2005 Gajim Team'
 		dlg.set_copyright(s)
 		text = open('COPYING').read()
@@ -683,7 +683,7 @@ class Join_groupchat_window:
 		cell = gtk.CellRendererText()
 		self.recently_combobox.pack_start(cell, True)
 		self.recently_combobox.add_attribute(cell, 'text', 0)
-		self.recently_groupchat = self.plugin.config['recently_groupchat'].split()
+		self.recently_groupchat = gajim.config.get('recently_groupchat').split()
 		for g in self.recently_groupchat:
 			self.recently_combobox.append_text(g)
 
@@ -720,8 +720,7 @@ class Join_groupchat_window:
 		self.recently_groupchat.insert(0, jid)
 		if len(self.recently_groupchat) > 10:
 			self.recently_groupchat = self.recently_groupchat[0:10]
-		self.plugin.config['recently_groupchat'] = \
-			' '.join(self.recently_groupchat)
+		gajim.config.set('recently_groupchat', ' '.join(self.recently_groupchat))
 		self.plugin.roster.new_group(jid, nickname, self.account)
 		self.plugin.send('GC_JOIN', self.account, (nickname, room, server, \
 			password))
diff --git a/src/groupchat_window.py b/src/groupchat_window.py
index 61a43b4ab0d0e6afc87895ddb1181e130f2b1286..f971155de53ea0521143d4a30ff417ad24b6770d 100644
--- a/src/groupchat_window.py
+++ b/src/groupchat_window.py
@@ -34,7 +34,7 @@ APP = i18n.APP
 gtk.glade.bindtextdomain(APP, i18n.DIR)
 gtk.glade.textdomain(APP)
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
+GTKGUI_GLADE='gtkgui.glade'
 
 class Groupchat_window(Chat):
 	"""Class for Groupchat window"""
diff --git a/src/gtkgui.py b/src/gtkgui.py
index 4042bc4f39d0c0a4e1b9609c310903e53b4ee753..0be4a186f8f19caef26b985a7a7cbbc26b763b41 100644
--- a/src/gtkgui.py
+++ b/src/gtkgui.py
@@ -1,4 +1,4 @@
-##	plugins/gtkgui.py
+##	gtkgui.py
 ##
 ## Gajim Team:
 ## - Yann Le Boulanger <asterix@lagaule.org>
@@ -16,41 +16,7 @@
 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ## GNU General Public License for more details.
 ##
-
-if __name__ == "__main__":
-	import getopt, pickle, sys, socket
-
-	try: 	# Import Psyco if available
-		import psyco
-		psyco.full()
-	except ImportError:
-		pass
 		
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], "p:h", ["help"])
-	except getopt.GetoptError:
-		# print help information and exit:
-		usage()
-		sys.exit(2)
-	port = 8255
-	for o, a in opts:
-		if o == '-p':
-			port = a
-		if o in ("-h", "--help"):
-			usage()
-			sys.exit()
-	sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-	try:
-		sock.connect(('', 8255))
-	except:
-		#TODO: use i18n
-		print "unable to connect to localhost on port ", port
-	else:
-		evp = pickle.dumps(('EXEC_PLUGIN', '', 'gtkgui'))
-		sock.send('<'+evp+'>')
-		sock.close()
-	sys.exit()
-
 import pygtk
 pygtk.require('2.0')
 import gtk
@@ -58,10 +24,9 @@ import gtk.glade
 import pango
 import gobject
 import os
-import time
-import sys
-import Queue
 import sre
+global gajim
+import common.gajim as gajim
 import common.sleepy
 
 try:
@@ -72,8 +37,8 @@ except ImportError:
 class CellRendererImage(gtk.GenericCellRenderer):
 
 	__gproperties__ = {
-		"image": (gobject.TYPE_OBJECT, "Image", 
-		"Image", gobject.PARAM_READWRITE),
+		'image': (gobject.TYPE_OBJECT, 'Image', 
+		'Image', gobject.PARAM_READWRITE),
 	}
 
 	def __init__(self):
@@ -115,8 +80,8 @@ class CellRendererImage(gtk.GenericCellRenderer):
 
 		pix_rect.x += cell_area.x
 		pix_rect.y += cell_area.y
-		pix_rect.width  -= 2 * self.get_property("xpad")
-		pix_rect.height -= 2 * self.get_property("ypad")
+		pix_rect.width  -= 2 * self.get_property('xpad')
+		pix_rect.height -= 2 * self.get_property('ypad')
 
 		draw_rect = cell_area.intersect(pix_rect)
 		draw_rect = expose_area.intersect(draw_rect)
@@ -150,15 +115,15 @@ class CellRendererImage(gtk.GenericCellRenderer):
 			return 0, 0, 0, 0
 		pixbuf_width  = pix.get_width()
 		pixbuf_height = pix.get_height()
-		calc_width  = self.get_property("xpad") * 2 + pixbuf_width
-		calc_height = self.get_property("ypad") * 2 + pixbuf_height
+		calc_width  = self.get_property('xpad') * 2 + pixbuf_width
+		calc_height = self.get_property('ypad') * 2 + pixbuf_height
 		x_offset = 0
 		y_offset = 0
 		if cell_area and pixbuf_width > 0 and pixbuf_height > 0:
-			x_offset = self.get_property("xalign") * (cell_area.width - \
-				calc_width -  self.get_property("xpad"))
-			y_offset = self.get_property("yalign") * (cell_area.height - \
-				calc_height -  self.get_property("ypad"))
+			x_offset = self.get_property('xalign') * (cell_area.width - \
+				calc_width -  self.get_property('xpad'))
+			y_offset = self.get_property('yalign') * (cell_area.height - \
+				calc_height -  self.get_property('ypad'))
 		return x_offset, y_offset, calc_width, calc_height
 
 gobject.type_register(CellRendererImage)
@@ -205,63 +170,24 @@ APP = i18n.APP
 gtk.glade.bindtextdomain(APP, i18n.DIR)
 gtk.glade.textdomain(APP)
 
-def usage():
-	#TODO: use i18n
-	print 'usage :', sys.argv[0], ' [OPTION]'
-	print '  -p\tport on which the sock plugin listen'
-	print '  -h, --help\tdisplay this help and exit'
-
+GTKGUI_GLADE='gtkgui.glade'
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
-
-
-class plugin:
-	"""Class called by the core in a new thread"""
-
-	class accounts:
-		"""Class where are stored the accounts and users in them"""
-		def __init__(self):
-			self.__accounts = {}
-
-		def add_account(self, account, users=()):
-			#users must be like (user1, user2)
-			self.__accounts[account] = users
-
-		def add_user_to_account(self, account, user):
-			if self.__accounts.has_key(account):
-				self.__accounts[account].append(user)
-			else :
-				return 1
-
-		def get_accounts(self):
-			return self.__accounts.keys();
-
-		def get_users(self, account):
-			if self.__accounts.has_key(account):
-				return self.__accounts[account]
-			else :
-				return None
-
-		def which_account(self, user):
-			for a in self.__accounts.keys():
-				if user in self.__accounts[a]:
-					return a
-			return None
 
+class interface:
 	def launch_browser_mailer(self, kind, url):
 		#kind = 'url' or 'mail'
-		if self.config['openwith'] == 'gnome-open':
+		if gajim.config.get('openwith') == 'gnome-open':
 			app = 'gnome-open'
 			args = ['gnome-open']
 			args.append(url)
-		elif self.config['openwith'] == 'kfmclient exec':
+		elif gajim.config.get('openwith') == 'kfmclient exec':
 			app = 'kfmclient'
 			args = ['kfmclient', 'exec']
-		elif self.config['openwith'] == 'custom':
+		elif gajim.config.get('openwith') == 'custom':
 			if kind == 'url':
-				conf = self.config['custombrowser']
+				conf = gajim.config.get('custombrowser')
 			if kind == 'mail':
-				conf = self.config['custommailapp']
+				conf = gajim.config.get('custommailapp')
 			if conf == '': # if no app is configured
 				return
 			args = conf.split()
@@ -280,44 +206,24 @@ class plugin:
 		return 0
 
 	def play_sound(self, event):
-		if not self.config['sounds_on']:
+		if not gajim.config.get('sounds_on'):
 			return
-		path_to_soundfile = self.config[event + '_file']
+		path_to_soundfile = gajim.config.get(event + '_file')
 		if not os.path.exists(path_to_soundfile):
 			return
 		if os.name  == 'nt':
 			winsound.PlaySound(path_to_soundfile, \
 									winsound.SND_FILENAME|winsound.SND_ASYNC)
 		elif os.name == 'posix':
-			if self.config['soundplayer'] == '':
+			if gajim.config.get('soundplayer') == '':
 				return
-			argv = self.config['soundplayer'].split()
+			argv = gajim.config.get('soundplayer').split()
 			argv.append(path_to_soundfile)
 			pid = os.spawnvp(os.P_NOWAIT, argv[0], argv)
 			pidp, r = os.waitpid(pid, os.WNOHANG)
 			if pidp == 0:
 				gobject.timeout_add(10000, self.play_timeout, pid)
 
-	def send(self, event, account, data):
-		self.queueOUT.put((event, account, data))
-
-	def wait(self, what):
-		"""Wait for a message from Core"""
-		#TODO: timeout
-		temp_q = Queue.Queue(50)
-		while 1:
-			if not self.queueIN.empty():
-				ev = self.queueIN.get()
-				if ev[0] == what and ev[2][0] == 'GtkGui':
-					#Restore messages
-					while not temp_q.empty():
-						ev2 = temp_q.get()
-						self.queueIN.put(ev2)
-					return ev[2][1]
-				else:
-					#Save messages
-					temp_q.put(ev)
-
 	def handle_event_roster(self, account, data):
 		#('ROSTER', account, (state, array))
 		statuss = ['offline', 'online', 'away', 'xa', 'dnd', 'invisible']
@@ -500,11 +406,6 @@ class plugin:
 	def handle_event_unsubscribed(self, account, jid):
 		Information_dialog(_("You are now unsubscribed by %s") % jid)
 
-	def handle_event_agents(self, account, agents):
-		#('AGENTS', account, agents)
-		if self.windows[account].has_key('disco'):
-			self.windows[account]['disco'].agents(agents)
-
 	def handle_event_agent_info(self, account, array):
 		#('AGENT_INFO', account, (agent, identities, features, items))
 		if self.windows[account].has_key('disco'):
@@ -522,13 +423,6 @@ class plugin:
 			self.windows[account]['disco'].agent_info_info(array[0], array[1], \
 				array[2])
 
-	def handle_event_reg_agent_info(self, account, array):
-		#('REG_AGENTS_INFO', account, (agent, infos))
-		if not array[1].has_key('instructions'):
-			Error_dialog(_("error contacting %s") % array[0])
-		else:
-			Service_registration_window(array[0], array[1], self, account)
-
 	def handle_event_acc_ok(self, account, array):
 		#('ACC_OK', account, (hostname, login, pasword, name, resource, prio,
 		#use_proxy, proxyhost, proxyport))
@@ -559,11 +453,6 @@ class plugin:
 	def handle_event_quit(self, p1, p2):
 		self.roster.on_quit() # SUCH FUNCTION DOES NOT EXIST!!
 
-	def save_config(self):
-		hidden_lines = self.config['hiddenlines'].split('\t')
-		self.config['hiddenlines'] = '\t'.join(hidden_lines)
-		self.send('CONFIG', None, ('GtkGui', self.config, 'GtkGui'))
-
 	def handle_event_myvcard(self, account, array):
 		nick = ''
 		if array.has_key('NICKNAME'):
@@ -581,22 +470,6 @@ class plugin:
 			self.windows[account]['infos'][array[0]].set_os_info(array[1], \
 				array[2])
 
-	def handle_event_log_nb_line(self, account, array):
-		#('LOG_NB_LINE', account, (jid, nb_line))
-		if self.windows['logs'].has_key(array[0]):
-			self.windows['logs'][array[0]].set_nb_line(array[1])
-			begin = 0
-			if array[1] > 50:
-				begin = array[1] - 50
-			self.send('LOG_GET_RANGE', None, (array[0], begin, array[1]))
-
-	def handle_event_log_line(self, account, array):
-		#('LOG_LINE', account, (jid, num_line, date, type, data))
-		# if type = 'recv' or 'sent' data = [msg]
-		# else type = jid and data = [status, away_msg]
-		if self.windows['logs'].has_key(array[0]):
-			self.windows['logs'][array[0]].new_line(array[1:])
-
 	def handle_event_gc_msg(self, account, array):
 		#('GC_MSG', account, (jid, msg, time))
 		jids = array[0].split('/')
@@ -626,11 +499,6 @@ class plugin:
 	def handle_event_bad_passphrase(self, account, array):
 		Warning_dialog(_("Your GPG passphrase is wrong, so you are connected without your GPG key."))
 
-	def handle_event_gpg_secrete_keys(self, account, keys):
-		keys['None'] = 'None'
-		if self.windows.has_key('gpg_keys'):
-			self.windows['gpg_keys'].fill_tree(keys)
-
 	def handle_event_roster_info(self, account, array):
 		#('ROSTER_INFO', account, (jid, name, sub, ask, groups))
 		jid = array[0]
@@ -652,68 +520,6 @@ class plugin:
 				user.groups = array[4]
 		self.roster.redraw_jid(jid, account)
 
-	def read_queue(self):
-		"""Read queue from the core and execute commands from it"""
-		while self.queueIN.empty() == 0:
-			ev = self.queueIN.get()
-			if ev[0] == 'ROSTER':
-				self.handle_event_roster(ev[1], ev[2])
-			elif ev[0] == 'WARNING':
-				self.handle_event_warning(ev[1], ev[2])
-			elif ev[0] == 'ERROR':
-				self.handle_event_error(ev[1], ev[2])
-			elif ev[0] == 'STATUS':
-				self.handle_event_status(ev[1], ev[2])
-			elif ev[0] == 'NOTIFY':
-				self.handle_event_notify(ev[1], ev[2])
-			elif ev[0] == 'MSG':
-				self.handle_event_msg(ev[1], ev[2])
-			elif ev[0] == 'MSGERROR':
-				self.handle_event_msgerror(ev[1], ev[2])
-			elif ev[0] == 'MSGSENT':
-				self.handle_event_msgsent(ev[1], ev[2])
-			elif ev[0] == 'SUBSCRIBE':
-				self.handle_event_subscribe(ev[1], ev[2])
-			elif ev[0] == 'SUBSCRIBED':
-				self.handle_event_subscribed(ev[1], ev[2])
-			elif ev[0] == 'UNSUBSCRIBED':
-				self.handle_event_unsubscribed(ev[1], ev[2])
-			elif ev[0] == 'AGENTS':
-				self.handle_event_agents(ev[1], ev[2])
-			elif ev[0] == 'AGENT_INFO':
-				self.handle_event_agent_info(ev[1], ev[2])
-			elif ev[0] == 'AGENT_INFO_ITEMS':
-				self.handle_event_agent_info_items(ev[1], ev[2])
-			elif ev[0] == 'AGENT_INFO_INFO':
-				self.handle_event_agent_info_info(ev[1], ev[2])
-			elif ev[0] == 'REG_AGENT_INFO':
-				self.handle_event_reg_agent_info(ev[1], ev[2])
-			elif ev[0] == 'ACC_OK':
-				self.handle_event_acc_ok(ev[1], ev[2])
-			elif ev[0] == 'QUIT':
-				self.handle_event_quit(ev[1], ev[2])
-			elif ev[0] == 'MYVCARD':
-				self.handle_event_myvcard(ev[1], ev[2])
-			elif ev[0] == 'OS_INFO':
-				self.handle_event_os_info(ev[1], ev[2])
-			elif ev[0] == 'VCARD':
-				self.handle_event_vcard(ev[1], ev[2])
-			elif ev[0] == 'LOG_NB_LINE':
-				self.handle_event_log_nb_line(ev[1], ev[2])
-			elif ev[0] == 'LOG_LINE':
-				self.handle_event_log_line(ev[1], ev[2])
-			elif ev[0] == 'GC_MSG':
-				self.handle_event_gc_msg(ev[1], ev[2])
-			elif ev[0] == 'GC_SUBJECT':
-				self.handle_event_gc_subject(ev[1], ev[2])
-			elif ev[0] == 'BAD_PASSPHRASE':
-				self.handle_event_bad_passphrase(ev[1], ev[2])
-			elif ev[0] == 'GPG_SECRETE_KEYS':
-				self.handle_event_gpg_secrete_keys(ev[1], ev[2])
-			elif ev[0] == 'ROSTER_INFO':
-				self.handle_event_roster_info(ev[1], ev[2])
-		return 1
-	
 	def read_sleepy(self):	
 		"""Check if we are idle"""
 		if not self.sleeper.poll():
@@ -847,117 +653,25 @@ class plugin:
 		# update regular expressions
 		self.make_regexps()
 
-	def __init__(self, quIN, quOUT):
-		gtk.gdk.threads_init()
+	def __init__(self):
 		if gtk.pygtk_version >= (2, 6, 0):
 			gtk.about_dialog_set_email_hook(self.on_launch_browser_mailer, 'mail')
 			gtk.about_dialog_set_url_hook(self.on_launch_browser_mailer, 'url')
-		self.queueIN = quIN
-		self.queueOUT = quOUT
-		self.send('REG_MESSAGE', 'gtkgui', ['ROSTER', 'WARNING', 'ERROR', \
-			'STATUS', 'NOTIFY', 'MSG', 'MSGERROR', 'SUBSCRIBED', 'UNSUBSCRIBED', \
-			'SUBSCRIBE', 'AGENTS', 'AGENT_INFO', 'AGENT_INFO_ITEMS', \
-			'AGENT_INFO_INFO', 'REG_AGENT_INFO', 'QUIT', 'ACC_OK', 'CONFIG', \
-			'MYVCARD', 'OS_INFO', 'VCARD', 'LOG_NB_LINE', 'LOG_LINE', 'VISUAL', \
-			'GC_MSG', 'GC_SUBJECT', 'BAD_PASSPHRASE', 'GPG_SECRETE_KEYS', \
-			'ROSTER_INFO', 'MSGSENT'])
-		self.default_config = {'autopopup':0,\
-			'autopopupaway':0,\
-			'ignore_unknown_contacts':0,\
-			'showoffline':0,\
-			'autoaway':1,\
-			'autoawaytime':10,\
-			'autoxa':1,\
-			'autoxatime':20,\
-			'ask_online_status':0,\
-			'ask_offline_status':0,\
-			'last_msg':'',\
-			'msg0_name':'Nap',\
-			'msg0':'I\'m taking a nap.',\
-			'msg1_name':'Brb',\
-			'msg1':'Back in some minutes.',\
-			'msg2_name':'Eating',\
-			'msg2':'I\'m eating, so leave me a message.',\
-			'msg3_name':'Movie',\
-			'msg3':'I\'m watching a movie.',\
-			'msg4_name':'Working',\
-			'msg4':'I\'m working.',\
-			'trayicon':1,\
-			'iconset':'sun',\
-			'inmsgcolor':'#ff0000',\
-			'outmsgcolor': '#0000ff',\
-			'statusmsgcolor':'#1eaa1e',\
-			'hiddenlines':'',\
-			'accounttextcolor': '#ffffff',\
-			#ff0000
-			'accountbgcolor': '#94aa8c',\
-			#9fdfff
-			'accountfont': 'Sans Bold 10',\
-			'grouptextcolor': '#0000ff',\
-			'groupbgcolor': '#eff3e7',\
-			#ffffff
-			'groupfont': 'Sans Italic 10',\
-			'usertextcolor': '#000000',\
-			'userbgcolor': '#ffffff',\
-			'userfont': 'Sans 10',\
-			'saveposition': 1,\
-			'mergeaccounts': 0,\
-			'usetabbedchat': 1,\
-			'print_time': 'always',\
-			'useemoticons': 1,\
-			'emoticons': ':-)\tplugins/gtkgui/emoticons/smile.png\t(@)\tplugins/gtkgui/emoticons/pussy.png\t8)\tplugins/gtkgui/emoticons/coolglasses.png\t:(\tplugins/gtkgui/emoticons/unhappy.png\t:)\tplugins/gtkgui/emoticons/smile.png\t(})\tplugins/gtkgui/emoticons/hugleft.png\t:$\tplugins/gtkgui/emoticons/blush.png\t(Y)\tplugins/gtkgui/emoticons/yes.png\t:-@\tplugins/gtkgui/emoticons/angry.png\t:-D\tplugins/gtkgui/emoticons/biggrin.png\t(U)\tplugins/gtkgui/emoticons/brheart.png\t(F)\tplugins/gtkgui/emoticons/flower.png\t:-[\tplugins/gtkgui/emoticons/bat.png\t:>\tplugins/gtkgui/emoticons/biggrin.png\t(T)\tplugins/gtkgui/emoticons/phone.png\t:-S\tplugins/gtkgui/emoticons/frowing.png\t:-P\tplugins/gtkgui/emoticons/tongue.png\t(H)\tplugins/gtkgui/emoticons/coolglasses.png\t(D)\tplugins/gtkgui/emoticons/drink.png\t:-O\tplugins/gtkgui/emoticons/oh.png\t(C)\tplugins/gtkgui/emoticons/coffee.png\t({)\tplugins/gtkgui/emoticons/hugright.png\t(*)\tplugins/gtkgui/emoticons/star.png\tB-)\tplugins/gtkgui/emoticons/coolglasses.png\t(Z)\tplugins/gtkgui/emoticons/boy.png\t(E)\tplugins/gtkgui/emoticons/mail.png\t(N)\tplugins/gtkgui/emoticons/no.png\t(P)\tplugins/gtkgui/emoticons/photo.png\t(K)\tplugins/gtkgui/emoticons/kiss.png\t(R)\tplugins/gtkgui/emoticons/rainbow.png\t:-|\tplugins/gtkgui/emoticons/stare.png\t;-)\tplugins/gtkgui/emoticons/wink.png\t;-(\tplugins/gtkgui/emoticons/cry.png\t(6)\tplugins/gtkgui/emoticons/devil.png\t(L)\tplugins/gtkgui/emoticons/heart.png\t(W)\tplugins/gtkgui/emoticons/brflower.png\t:|\tplugins/gtkgui/emoticons/stare.png\t:O\tplugins/gtkgui/emoticons/oh.png\t;)\tplugins/gtkgui/emoticons/wink.png\t;(\tplugins/gtkgui/emoticons/cry.png\t:S\tplugins/gtkgui/emoticons/frowing.png\t;\'-(\tplugins/gtkgui/emoticons/cry.png\t:-(\tplugins/gtkgui/emoticons/unhappy.png\t8-)\tplugins/gtkgui/emoticons/coolglasses.png\t(B)\tplugins/gtkgui/emoticons/beer.png\t:D\tplugins/gtkgui/emoticons/biggrin.png\t(8)\tplugins/gtkgui/emoticons/music.png\t:@\tplugins/gtkgui/emoticons/angry.png\tB)\tplugins/gtkgui/emoticons/coolglasses.png\t:-$\tplugins/gtkgui/emoticons/blush.png\t:\'(\tplugins/gtkgui/emoticons/cry.png\t:->\tplugins/gtkgui/emoticons/biggrin.png\t:[\tplugins/gtkgui/emoticons/bat.png\t(I)\tplugins/gtkgui/emoticons/lamp.png\t:P\tplugins/gtkgui/emoticons/tongue.png\t(%)\tplugins/gtkgui/emoticons/cuffs.png\t(S)\tplugins/gtkgui/emoticons/moon.png',\
-			'sounds_on': 1,\
-			'soundplayer': 'play',\
-			'sound_first_message_received': 1,\
-			'sound_first_message_received_file': 'sounds/message1.wav',\
-			'sound_next_message_received': 0,\
-			'sound_next_message_received_file': 'sounds/message2.wav',\
-			'sound_contact_connected': 1,\
-			'sound_contact_connected_file': 'sounds/connected.wav',\
-			'sound_contact_disconnected': 1,\
-			'sound_contact_disconnected_file': 'sounds/disconnected.wav',\
-			'sound_message_sent': 1,\
-			'sound_message_sent_file': 'sounds/sent.wav',\
-			'openwith': 'gnome-open',\
-			'custombrowser' : 'firefox',\
-			'custommailapp' : 'mozilla-thunderbird -compose',\
-			'x-position': 0,\
-			'y-position': 0,\
-			'width': 150,\
-			'height': 400,\
-			'latest_disco_addresses': '',\
-			'recently_groupchat': '',\
-			'before_time': '[',\
-			'after_time': ']',\
-			'before_nickname': '<',\
-			'after_nickname': '>',\
-			'do_not_send_os_info': 0,\
-			}
-		self.send('ASK_CONFIG', None, ('GtkGui', 'GtkGui', self.default_config))
-		self.config = self.wait('CONFIG')
-		self.send('ASK_CONFIG', None, ('GtkGui', 'accounts'))
-		self.accounts = self.wait('CONFIG')
 		self.windows = {'logs':{}}
 		self.queues = {}
-		self.connected = {}
 		self.nicks = {}
 		self.sleeper_state = {} #whether we pass auto away / xa or not
-		for a in self.accounts.keys():
+		for a in gajim.connections:
 			self.windows[a] = {'infos': {}, 'chats': {}, 'gc': {}}
 			self.queues[a] = {}
-			self.connected[a] = 0 #0->offline 1->connecting 2->online 3->away
-										#4->xa 5->dnd 6->invisible
-			self.nicks[a] = self.accounts[a]['name']
+			self.nicks[a] = gajim.config.get_per('accounts', a, 'name')
 			self.sleeper_state[a] = 0	#0:don't use sleeper for this account
 												#1:online and use sleeper
 												#2:autoaway and use sleeper
 												#3:autoxa and use sleeper
-			self.send('ASK_ROSTER', a, self.queueIN)
 
-		iconset = self.config['iconset']
-		if not iconset:
-			iconset = 'sun'
-		path = 'plugins/gtkgui/iconsets/' + iconset + '/'
+		iconset = gajim.config.get('iconset')
+		path = 'data/iconsets/' + iconset + '/'
 		files = [path + 'online.gif', path + 'online.png', path + 'online.xpm']
 		pix = None
 		for fname in files:
@@ -967,11 +681,10 @@ class plugin:
 		if pix:
 			gtk.window_set_default_icon(pix)
 		self.roster = Roster_window(self)
-		gobject.timeout_add(100, self.read_queue)
 		gobject.timeout_add(100, self.read_sleepy)
 		self.sleeper = common.sleepy.Sleepy( \
-			self.config['autoawaytime']*60, \
-			self.config['autoxatime']*60)
+			gajim.config.get('autoawaytime')*60, \
+			gajim.config.get('autoxatime')*60)
 		self.systray_enabled = False
 		try:
 			import egg.trayicon as trayicon # use gnomepythonextras trayicon
@@ -979,8 +692,6 @@ class plugin:
 			try:
 				import trayicon # use yann's
 			except: # user doesn't have trayicon capabilities
-				self.config['trayicon'] = 0
-				self.send('CONFIG', None, ('GtkGui', self.config, 'GtkGui'))
 				self.systray_capabilities = False
 			else:
 				self.systray_capabilities = True
@@ -988,20 +699,25 @@ class plugin:
 		else:
 			self.systray_capabilities = True
 			self.systray = Systray(self)
-		if self.config['trayicon']:
+		if self.systray_capabilities:
 			self.show_systray()
-			
+
 		self.init_regexp()
 		
 		# get instances for windows/dialogs that will show_all()/hide()
 		self.windows['preferences'] = Preferences_window(self)
 		self.windows['add_remove_emoticons_window'] = \
-														Add_remove_emoticons_window(self)
+			Add_remove_emoticons_window(self)
 		self.windows['roster'] = self.roster
 
-		gtk.gdk.threads_enter()
 		gobject.timeout_add(100, self.autoconnect)
-		gtk.main()
-		gtk.gdk.threads_leave()
 
-print _('plugin gtkgui loaded')
+if __name__ == '__main__':
+	try: 	# Import Psyco if available
+		import psyco
+		psyco.full()
+	except ImportError:
+		pass
+	
+	interface()
+	gtk.main()
diff --git a/src/history_window.py b/src/history_window.py
index 5d08c7c287c3cd98b8b3aa7f4ff1eecc73ad3c60..839be845d00498ac9f077116adadb08c19889b4f 100644
--- a/src/history_window.py
+++ b/src/history_window.py
@@ -28,7 +28,7 @@ APP = i18n.APP
 gtk.glade.bindtextdomain(APP, i18n.DIR)
 gtk.glade.textdomain(APP)
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
+GTKGUI_GLADE='gtkgui.glade'
 
 class history_window:
 	"""Class for bowser agent window:
@@ -148,13 +148,13 @@ class history_window:
 		self.latest_button = xml.get_widget('latest_button')
 		xml.signal_autoconnect(self)
 		tagIn = self.history_buffer.create_tag('incoming')
-		color = self.plugin.config['inmsgcolor']
+		color = gajim.config.get('inmsgcolor')
 		tagIn.set_property('foreground', color)
 		tagOut = self.history_buffer.create_tag('outgoing')
-		color = self.plugin.config['outmsgcolor']
+		color = gajim.config.get('outmsgcolor')
 		tagOut.set_property('foreground', color)
 		tagStatus = self.history_buffer.create_tag('status')
-		color = self.plugin.config['statusmsgcolor']
+		color = gajim.config.get('statusmsgcolor')
 		tagStatus.set_property('foreground', color)
 		self.window.show_all()
 		self.plugin.send('LOG_NB_LINE', None, jid)
diff --git a/src/roster_window.py b/src/roster_window.py
index 1a587e8e26ce5f86e2be79ad5a05efda168756b9..8fef4d0e32e67c9efbe9808954de6329cf6a45d0 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -39,7 +39,7 @@ APP = i18n.APP
 gtk.glade.bindtextdomain(APP, i18n.DIR)
 gtk.glade.textdomain(APP)
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
+GTKGUI_GLADE='gtkgui.glade'
 
 class Roster_window:
 	"""Class for main window of gtkgui plugin"""
@@ -120,7 +120,7 @@ class Roster_window:
 
 	def add_user_to_roster(self, jid, account):
 		"""Add a user to the roster and add groups if they aren't in roster"""
-		showOffline = self.plugin.config['showoffline']
+		showOffline = gajim.config.get('showoffline')
 		if not self.contacts[account].has_key(jid):
 			return
 		users = self.contacts[account][jid]
@@ -148,7 +148,8 @@ class Roster_window:
 					self.groups[account][g] = {'expand': False}
 				else:
 					self.groups[account][g] = {'expand': True}
-			if not account in self.hidden_lines and not self.plugin.config['mergeaccounts']:
+			if not account in self.hidden_lines and not gajim.config.get(\
+				'mergeaccounts'):
 				self.tree.expand_row((model.get_path(iterG)[0]), False)
 
 			typestr = 'user'
@@ -365,7 +366,7 @@ class Roster_window:
 
 	def chg_user_status(self, user, show, status, account):
 		"""When a user change his status"""
-		showOffline = self.plugin.config['showoffline']
+		showOffline = gajim.config.get('showoffline')
 		model = self.tree.get_model()
 		luser = self.contacts[account][user.jid]
 		user.show = show
@@ -721,7 +722,7 @@ class Roster_window:
 			if self.plugin.accounts[account].has_key('keyid'):
 				keyid = self.plugin.accounts[account]['keyid']
 			if keyid and self.plugin.connected[account] < 2 and \
-				self.plugin.config['usegpg']:
+				gajim.config.get('usegpg'):
 				if save_gpg_pass:
 					passphrase = self.plugin.accounts[account]['gpgpassword']
 				else:
@@ -749,9 +750,8 @@ class Roster_window:
 			self.plugin.sleeper_state[account] = 0
 
 	def get_status_message(self, status, autoconnect = 0):
-		if (status == 'online' and not self.plugin.config['ask_online_status']) \
-			or (status == 'offline' and not \
-			self.plugin.config['ask_offline_status']):
+		if (status == 'online' and not gajim.config.get('ask_online_status')) or \
+			(status == 'offline' and not gajim.config.get('ask_offline_status')):
 			return status
 		dlg = Change_status_message_dialog(self.plugin, status, autoconnect)
 		message = dlg.run()
@@ -829,7 +829,7 @@ class Roster_window:
 		self.update_status_comboxbox()
 
 	def new_chat(self, user, account):
-		if self.plugin.config['usetabbedchat']:
+		if gajim.config.get('usetabbedchat'):
 			if not self.plugin.windows[account]['chats'].has_key('tabbed'):
 				self.plugin.windows[account]['chats']['tabbed'] = \
 					Tabbed_chat_window(user, self.plugin, account)
@@ -845,7 +845,7 @@ class Roster_window:
 				Tabbed_chat_window(user, self.plugin, account)
 
 	def new_group(self, jid, nick, account):
-		if self.plugin.config['usetabbedchat']:
+		if gajim.config.get('usetabbedchat'):
 			if not self.plugin.windows[account]['gc'].has_key('tabbed'):
 				self.plugin.windows[account]['gc']['tabbed'] = \
 					Groupchat_window(jid, nick, self.plugin, account)
@@ -871,8 +871,8 @@ class Roster_window:
 			path = self.tree.get_model().get_path(iters[0])
 		else:
 			path = None
-		autopopup = self.plugin.config['autopopup']
-		autopopupaway = self.plugin.config['autopopupaway']
+		autopopup = gajim.config.get('autopopup')
+		autopopupaway = gajim.config.get('autopopupaway')
 		if (autopopup == 0 or ( not autopopupaway and \
 			self.plugin.connected[account] > 2)) and not \
 			self.plugin.windows[account]['chats'].has_key(jid):
@@ -964,16 +964,17 @@ class Roster_window:
 	def quit_gtkgui_plugin(self):
 		"""When we quit the gtk plugin :
 		tell that to the core and exit gtk"""
-		if self.plugin.config.has_key('saveposition'):
-			if self.plugin.config['saveposition']:
-				self.plugin.config['x-position'], self.plugin.config['y-position']=\
-					self.window.get_position()
-				self.plugin.config['width'], self.plugin.config['height'] = \
-					self.window.get_size()
+		if gajim.config.exist('saveposition'):
+			if gajim.config.get('saveposition'):
+				x, y = self.window.get_position()
+				gajim.config.set('x-position', x)
+				gajim.config.set('y-position', y)
+				width, height = self.window.get_size()
+				gajim.config.set('width', width)
+				gajim.config.set('height', height)
 
 		self.plugin.save_config()
 		self.plugin.send('QUIT', None, ('gtkgui', 1))
-		print _("plugin gtkgui stopped")
 		self.close_all(self.plugin.windows)
 		if self.plugin.systray_enabled:
 			self.plugin.hide_systray()
@@ -1010,7 +1011,7 @@ class Roster_window:
 				self.tree.expand_row(path, False)
 		else:
 			if self.plugin.windows[account]['chats'].has_key(jid):
-				if self.plugin.config['usetabbedchat']:
+				if gajim.config.get('usetabbedchat'):
 					self.plugin.windows[account]['chats'][jid].active_tab(jid)
 				self.plugin.windows[account]['chats'][jid].window.present()
 			elif self.contacts[account].has_key(jid):
@@ -1103,7 +1104,7 @@ class Roster_window:
 
 	def mkpixbufs(self):
 		"""initialise pixbufs array"""
-		iconset = self.plugin.config['iconset']
+		iconset = gajim.config.get('iconset')
 		if not iconset:
 			iconset = 'sun'
 		self.path = 'plugins/gtkgui/iconsets/' + iconset + '/'
@@ -1161,19 +1162,18 @@ class Roster_window:
 	def on_show_offline_contacts_menuitem_activate(self, widget):
 		"""when show offline option is changed:
 		redraw the treeview"""
-		self.plugin.config['showoffline'] = 1 - self.plugin.config['showoffline']
-		self.plugin.send('CONFIG', None, ('GtkGui', self.plugin.config, 'GtkGui'))
+		gajim.config.set('showoffline', 1 - gajim.config.get('showoffline'))
 		self.draw_roster()
 
 	def iconCellDataFunc(self, column, renderer, model, iter, data=None):
 		"""When a row is added, set properties for icon renderer"""
 		if model.get_value(iter, 2) == 'account':
 			renderer.set_property('cell-background', \
-				self.plugin.config['accountbgcolor'])
+				gajim.config.get('accountbgcolor'))
 			renderer.set_property('xalign', 0)
 		elif model.get_value(iter, 2) == 'group':
 			renderer.set_property('cell-background', \
-				self.plugin.config['groupbgcolor'])
+				gajim.config.get('groupbgcolor'))
 			renderer.set_property('xalign', 0.5)
 		else:
 			jid = model.get_value(iter, 3)
@@ -1184,7 +1184,7 @@ class Roster_window:
 				renderer.set_property('cell-background', '#ab6161')
 			else:
 				renderer.set_property('cell-background', \
-					self.plugin.config['userbgcolor'])
+					gajim.config.get('userbgcolor'))
 			renderer.set_property('xalign', 1)
 		renderer.set_property('width', 20)
 	
@@ -1192,31 +1192,31 @@ class Roster_window:
 		"""When a row is added, set properties for name renderer"""
 		if model.get_value(iter, 2) == 'account':
 			renderer.set_property('foreground', \
-				self.plugin.config['accounttextcolor'])
+				gajim.config.get('accounttextcolor'))
 			renderer.set_property('cell-background', \
-				self.plugin.config['accountbgcolor'])
-			renderer.set_property('font', self.plugin.config['accountfont'])
+				gajim.config.get('accountbgcolor'))
+			renderer.set_property('font', gajim.config.get('accountfont'))
 			renderer.set_property('xpad', 0)
 		elif model.get_value(iter, 2) == 'group':
 			renderer.set_property('foreground', \
-				self.plugin.config['grouptextcolor'])
+				gajim.config.get('grouptextcolor'))
 			renderer.set_property('cell-background', \
-				self.plugin.config['groupbgcolor'])
-			renderer.set_property('font', self.plugin.config['groupfont'])
+				gajim.config.get('groupbgcolor'))
+			renderer.set_property('font', gajim.config.get('groupfont'))
 			renderer.set_property('xpad', 4)
 		else:
 			jid = model.get_value(iter, 3)
 			account = model.get_value(iter, 4)
 			renderer.set_property('foreground', \
-				self.plugin.config['usertextcolor'])
+				gajim.config.get('usertextcolor'))
 			if jid in self.newly_added[account]:
 				renderer.set_property('cell-background', '#adc3c6')
 			elif jid in self.to_be_removed[account]:
 				renderer.set_property('cell-background', '#ab6161')
 			else:
 				renderer.set_property('cell-background', \
-					self.plugin.config['userbgcolor'])
-			renderer.set_property('font', self.plugin.config['userfont'])
+					gajim.config.get('userbgcolor'))
+			renderer.set_property('font', gajim.config.get('userfont'))
 			renderer.set_property('xpad', 8)
 
 	def compareIters(self, model, iter1, iter2, data = None):
@@ -1249,7 +1249,7 @@ class Roster_window:
 	def drag_data_received_data(self, treeview, context, x, y, selection, info,
 		etime):
 		merge = 0
-		if self.plugin.config['mergeaccounts']:
+		if gajim.config.get('mergeaccounts'):
 			merge = 1
 		model = treeview.get_model()
 		data = selection.data
@@ -1325,18 +1325,12 @@ class Roster_window:
 		self.join_gc_handler_id = False
 		self.new_message_menuitem_handler_id = False
 		self.regroup = 0
-		if self.plugin.config.has_key('mergeaccounts'):
-			self.regroup = self.plugin.config['mergeaccounts']
-		if self.plugin.config.has_key('saveposition'):
-			if self.plugin.config['saveposition']:
-				if self.plugin.config.has_key('x-position') and \
-					self.plugin.config.has_key('y-position'):
-					self.window.move(self.plugin.config['x-position'], \
-						self.plugin.config['y-position'])
-				if self.plugin.config.has_key('width') and \
-					self.plugin.config.has_key('height'):
-					self.window.resize(self.plugin.config['width'], \
-						self.plugin.config['height'])
+		self.regroup = gajim.config.get('mergeaccounts')
+		if gajim.config.get('saveposition'):
+			self.window.move(gajim.config.get('x-position'), \
+				gajim.config.get('y-position'))
+			self.window.resize(gajim.config.get('width'), \
+				gajim.config.get('height'))
 		self.window.show_all()
 		self.groups = {}
 		self.contacts = {}
@@ -1380,7 +1374,7 @@ class Roster_window:
 		self.status_combobox.set_model(liststore)
 		self.status_combobox.set_active(5)
 
-		showOffline = self.plugin.config['showoffline']
+		showOffline = gajim.config.get('showoffline')
 		self.xml.get_widget('show_offline_contacts_menuitem').set_active(showOffline)
 
 		#columns
@@ -1420,7 +1414,7 @@ class Roster_window:
 		self.id_signal_cb = self.status_combobox.connect('changed',\
 														self.on_status_combobox_changed)
 
-		self.hidden_lines = self.plugin.config['hiddenlines'].split('\t')
+		self.hidden_lines = gajim.config.get('hiddenlines').split('\t')
 		self.draw_roster()
 		if len(self.plugin.accounts) == 0: # if no account
 			self.plugin.windows['account_modification'] = \
diff --git a/src/systray.py b/src/systray.py
index 5982f4dc84cbbce9ae4fbb6185bf0f7b0af9c400..43d178b845df6cd5ae2de8eb7c0faf10ffdd4a50 100644
--- a/src/systray.py
+++ b/src/systray.py
@@ -28,7 +28,7 @@ APP = i18n.APP
 gtk.glade.bindtextdomain(APP, i18n.DIR)
 gtk.glade.textdomain(APP)
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
+GTKGUI_GLADE='gtkgui.glade'
 
 class Systray:
 	"""Class for icon in the systray"""
diff --git a/src/tabbed_chat_window.py b/src/tabbed_chat_window.py
index 32571930ca3de70a14464935634a7c388f933a1d..2e0753d820f4a9ba8595da0a520b7f419264f956 100644
--- a/src/tabbed_chat_window.py
+++ b/src/tabbed_chat_window.py
@@ -34,7 +34,7 @@ APP = i18n.APP
 gtk.glade.bindtextdomain(APP, i18n.DIR)
 gtk.glade.textdomain(APP)
 
-GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
+GTKGUI_GLADE='gtkgui.glade'
 
 class Tabbed_chat_window(Chat):
 	"""Class for tabbed chat window"""
@@ -144,7 +144,7 @@ class Tabbed_chat_window(Chat):
 		if self.plugin.queues[self.account].has_key(user.jid):
 			self.read_queue(user.jid)
 
-		if self.plugin.config['print_time'] == 'sometimes':
+		if gajim.config.get('print_time') == 'sometimes':
 			self.print_time_timeout(user.jid)
 			self.print_time_timeout_id[user.jid] = gobject.timeout_add(300000, \
 				self.print_time_timeout, user.jid)
@@ -211,7 +211,7 @@ class Tabbed_chat_window(Chat):
 		self.plugin.roster.redraw_jid(jid, self.account)
 		if self.plugin.systray_enabled:
 			self.plugin.systray.remove_jid(jid, self.account)
-		showOffline = self.plugin.config['showoffline']
+		showOffline = gajim.config.get('showoffline')
 		if (user.show == 'offline' or user.show == 'error') and \
 			not showOffline:
 			if len(self.plugin.roster.contacts[self.account][jid]) == 1: