diff --git a/core/core.py b/core/core.py
index 25422f390..a9e873de0 100644
--- a/core/core.py
+++ b/core/core.py
@@ -22,6 +22,7 @@ import Queue
 import socket
 import sys
 import time
+import string
 import logging
 
 import plugins
@@ -64,12 +65,11 @@ class GajimCore:
 				(prs.getFrom().getBasic(), 'offline', prs.getStatus()))
 		elif type == 'subscribe':
 			log.debug("subscribe request from %s" % who)
-			if self.cfgParser.Core_alwaysauth == 1:
+			if self.cfgParser.Core_alwaysauth == 1 or string.find(who, "@") <= 0:
 				self.con.send(common.jabber.Presence(who, 'subscribed'))
 			else:
 				self.hub.sendPlugin('SUBSCRIBE', who)
 		elif type == 'subscribed':
-			#plein de trucs a faire
 			jid = prs.getFrom()
 			self.hub.sendPlugin('SUBSCRIBED', {'jid':jid.getBasic(), \
 				'nom':jid.getNode()})
@@ -109,6 +109,7 @@ class GajimCore:
 				roster = self.con.getRoster().getRaw()
 				if not roster :
 					roster = {}
+				print roster
 				self.hub.sendPlugin('ROSTER', roster)
 				self.con.sendInitPresence()
 				self.connected = 1
@@ -165,7 +166,14 @@ class GajimCore:
 					self.con.updateRosterItem(jid=ev[1][0], name=ev[1][1], groups=ev[1][2])
 				elif ev[0] == 'REQ_AGENTS':
 					agents = self.con.requestAgents()
-					self.hub.sendPlugin('AGENTS', agents)				
+					self.hub.sendPlugin('AGENTS', agents)
+				elif ev[0] == 'REQ_AGENT_INFO':
+					self.con.requestRegInfo(ev[1])
+					agent_info = self.con.getRegInfo()
+					self.hub.sendPlugin('AGENT_INFO', (ev[1], agent_info))
+				elif ev[0] == 'REG_AGENT':
+					self.con.sendRegInfo(ev[1])
+					print ev[1]
 				else:
 					log.debug("Unknown Command")
 			elif self.connected == 1:
@@ -183,5 +191,6 @@ def start():
 	gc.hub.register('gtkgui', 'SUBSCRIBED')
 	gc.hub.register('gtkgui', 'SUBSCRIBE')
 	gc.hub.register('gtkgui', 'AGENTS')
+	gc.hub.register('gtkgui', 'AGENT_INFO')
 	guiPl.load ()
 	gc.mainLoop()
diff --git a/plugins/gtkgui.glade b/plugins/gtkgui.glade
index 5cb3ba720..d2da10887 100644
--- a/plugins/gtkgui.glade
+++ b/plugins/gtkgui.glade
@@ -1917,6 +1917,7 @@ David Ferlier (david@yazzy.org)
   250
   True
   False
+  
 
   
     
@@ -1942,6 +1943,7 @@ David Ferlier (david@yazzy.org)
 	      False
 	      False
 	      True
+	      
 	    
 	  
 	
@@ -2111,4 +2113,219 @@ David Ferlier (david@yazzy.org)
   
 
 
+
+  True
+  Register to
+  GTK_WINDOW_TOPLEVEL
+  GTK_WIN_POS_NONE
+  False
+  300
+  200
+  True
+  False
+
+  
+    
+      True
+      False
+      0
+
+      
+	
+	  True
+	  
+	  False
+	  False
+	  GTK_JUSTIFY_CENTER
+	  True
+	  False
+	  0.5
+	  0.5
+	  0
+	  4
+	
+	
+	  4
+	  True
+	  True
+	
+      
+
+      
+	
+	  5
+	  True
+	  1
+	  2
+	  False
+	  10
+	  10
+	
+	
+	  0
+	  True
+	  True
+	
+      
+
+      
+	
+	  True
+	
+	
+	  4
+	  False
+	  True
+	
+      
+
+      
+	
+	  9
+	  True
+	  GTK_BUTTONBOX_END
+	  25
+
+	  
+	    
+	      True
+	      True
+	      True
+	      GTK_RELIEF_NORMAL
+	      
+
+	      
+		
+		  True
+		  0.5
+		  0.5
+		  0
+		  0
+
+		  
+		    
+		      True
+		      False
+		      2
+
+		      
+			
+			  True
+			  gtk-ok
+			  4
+			  0.5
+			  0.5
+			  0
+			  0
+			
+			
+			  0
+			  False
+			  False
+			
+		      
+
+		      
+			
+			  True
+			  _OK
+			  True
+			  False
+			  GTK_JUSTIFY_LEFT
+			  False
+			  False
+			  0.5
+			  0.5
+			  0
+			  0
+			
+			
+			  0
+			  False
+			  False
+			
+		      
+		    
+		  
+		
+	      
+	    
+	  
+
+	  
+	    
+	      True
+	      True
+	      True
+	      GTK_RELIEF_NORMAL
+	      
+
+	      
+		
+		  True
+		  0.5
+		  0.5
+		  0
+		  0
+
+		  
+		    
+		      True
+		      False
+		      2
+
+		      
+			
+			  True
+			  gtk-cancel
+			  4
+			  0.5
+			  0.5
+			  0
+			  0
+			
+			
+			  0
+			  False
+			  False
+			
+		      
+
+		      
+			
+			  True
+			  _Cancel
+			  True
+			  False
+			  GTK_JUSTIFY_LEFT
+			  False
+			  False
+			  0.5
+			  0.5
+			  0
+			  0
+			
+			
+			  0
+			  False
+			  False
+			
+		      
+		    
+		  
+		
+	      
+	    
+	  
+	
+	
+	  0
+	  False
+	  True
+	
+      
+    
+  
+
+
 
diff --git a/plugins/gtkgui.py b/plugins/gtkgui.py
index cb7abcb81..41fb8e11c 100644
--- a/plugins/gtkgui.py
+++ b/plugins/gtkgui.py
@@ -136,6 +136,58 @@ class authorize:
 		self.xml.signal_connect('on_button_deny_clicked', self.deny)
 		self.xml.signal_connect('on_button_close_clicked', self.delete_event)
 
+class agent_reg:
+	def delete_event(self, widget):
+		self.window.destroy()
+	
+	def draw_table(self):
+		for name in self.infos.keys():
+			if name != 'key' and name != 'instructions' and name != 'x':
+				self.nbrow = self.nbrow + 1
+				self.table.resize(rows=self.nbrow, columns=2)
+				label = gtk.Label(name)
+				self.table.attach(label, 0, 1, self.nbrow-1, self.nbrow, 0, 0, 0, 0)
+				entry = gtk.Entry()
+				entry.set_text(self.infos[name])
+				self.table.attach(entry, 1, 2, self.nbrow-1, self.nbrow, 0, 0, 0, 0)
+				self.entries[name] = entry
+				if self.nbrow == 1:
+					entry.grab_focus()
+		self.table.show_all()
+	
+	def on_ok(self, widget):
+		for name in self.entries.keys():
+			self.infos[name] = self.entries[name].get_text()
+		self.r.queueOUT.put(('REG_AGENT', self.agent))
+		print self.infos
+#		jid = string.replace(jid, '@', '')
+#		if not self.r.l_group.has_key('Agents'):
+#			iterG = self.r.treestore.append(None, (None, \
+#				'Agents', 'group', FALSE))
+#			self.r.l_group['Agent'] = iterG
+#		user1 = user(jid, jid, ['Agent'], 'online', 'online', 'from')
+#		iterU = self.r.treestore.append(self.r.l_group['Agent'], \
+#			(self.r.pixbufs['online'], jid, jid, TRUE))
+#		self.r.l_contact[jid] = {'user':user1, 'iter':[iterU]}
+		self.delete_event(self)
+	
+	def __init__(self, agent, infos, roster):
+		self.xml = gtk.glade.XML('plugins/gtkgui.glade', 'agent_reg')
+		self.infos = infos
+		self.r = roster
+		self.agent = agent
+		self.window = self.xml.get_widget('agent_reg')
+		self.table = self.xml.get_widget('table')
+		self.window.set_title('Register to ' + agent)
+		self.xml.get_widget('label').set_text(infos['instructions'])
+		self.nbrow = 0
+		self.entries = {}
+		self.draw_table()
+		self.xml.signal_connect('gtk_widget_destroy', self.delete_event)
+		self.xml.signal_connect('on_button_cancel_clicked', self.delete_event)
+		self.xml.signal_connect('on_button_ok_clicked', self.on_ok)
+		
+
 class browser:
 	def delete_event(self, widget):
 		global Wbrowser
@@ -148,11 +200,17 @@ class browser:
 	def agents(self, agents):
 		for jid in agents.keys():
 			iter = self.model.append()
-			self.model.set(iter, 0, agents[jid]['name'], 1, jid)
+			self.model.set(iter, 0, agents[jid]['name'], 1, agents[jid]['service'])
 
 	def on_refresh(self, widget):
 		self.model.clear()
 		self.browse()
+
+	def on_row_activated(self, widget, path, col=0):
+		iter = self.model.get_iter(path)
+		service = self.model.get_value(iter, 1)
+		self.r.queueOUT.put(('REQ_AGENT_INFO', service))
+		self.delete_event(self)
 		
 	def __init__(self, roster):
 		self.xml = gtk.glade.XML('plugins/gtkgui.glade', 'browser')
@@ -167,11 +225,12 @@ class browser:
 		self.treeview.insert_column_with_attributes(-1, 'Name', renderer, text=0)
 		renderer = gtk.CellRendererText()
 		renderer.set_data('column', 1)
-		self.treeview.insert_column_with_attributes(-1, 'JID', renderer, text=1)
-		
+		self.treeview.insert_column_with_attributes(-1, 'Service', renderer, text=1)
+
 		self.xml.signal_connect('gtk_widget_destroy', self.delete_event)
 		self.xml.signal_connect('on_refresh_clicked', self.on_refresh)
-		#TODO: Si connecté
+		self.xml.signal_connect('on_row_activated', self.on_row_activated)
+		#TODO: Si connecte
 		self.browse()
 
 class message:
@@ -245,21 +304,30 @@ class roster:
 		self.l_group = {}
 		self.treestore.clear()
 		for jid in tab.keys():
+			#On enleve la resource
+			ji = string.split(jid, '/')[0]
 			name = tab[jid]['name']
 			if not name:
-				name = ''
+				if string.find(ji, "@") <= 0:
+					name = ji
+				else:
+					name = ''
 			show = tab[jid]['show']
 			if not show:
 				show = 'offline'
-			user1 = user(jid, name, tab[jid]['groups'], show, tab[jid]['status'], tab[jid]['sub'])
+			user1 = user(ji, name, tab[jid]['groups'], show, tab[jid]['status'], tab[jid]['sub'])
 			self.l_contact[user1.jid] = {'user': user1, 'iter': []}
+			print user1.jid
 			if user1.groups == []:
-				user1.groups.append('general')
+				if string.find(ji, "@") <= 0:
+					user1.groups.append('Agents')
+				else:
+					user1.groups.append('general')
 			for g in user1.groups:
 				if not self.l_group.has_key(g):
 					iterG = self.treestore.append(None, (None, g, 'group', FALSE))
 					self.l_group[g] = iterG
-				if user1.show != 'offline' or self.showOffline:
+				if user1.show != 'offline' or self.showOffline or g == 'Agents':
 					iterU = self.treestore.append(self.l_group[g], (self.pixbufs[user1.show], user1.name, user1.jid, TRUE))
 					self.l_contact[user1.jid]['iter'].append(iterU)
 
@@ -292,7 +360,8 @@ class roster:
 				self.l_contact[jid]['iter'] = []
 			else:
 				for i in self.l_contact[jid]['iter']:
-					self.treestore.set_value(i, 0, self.pixbufs[show])
+					if self.pixbufs.has_key(show):
+						self.treestore.set_value(i, 0, self.pixbufs[show])
 		u.show = show
 		u.status = status
 	
@@ -353,7 +422,7 @@ class roster:
 		if not self.l_contact.has_key(jid):
 			user1 = user(jid, jid, ['general'], 'requested', 'requested', 'sub')
 			if not self.l_group.has_key('general'):
-				iterG = self.treestore.append(None, (None, 'general', 'group'))
+				iterG = self.treestore.append(None, (None, 'general', 'group', FALSE))
 				self.l_group['general'] = iterG
 			iterU = self.treestore.append(self.l_group['general'], (self.pixbufs['requested'], jid, jid, TRUE))
 			self.l_contact[jid] = {'user':user1, 'iter':[iterU]}
@@ -487,23 +556,60 @@ class plugin:
 			if ev[0] == 'ROSTER':
 				self.r.mkroster(ev[1])
 			elif ev[0] == 'NOTIFY':
-				if self.r.l_contact.has_key(ev[1][0]):
-					self.r.chg_status(ev[1][0], ev[1][1], ev[1][2])
+				jid = string.split(ev[1][0], '/')[0]
+				print self.r.l_contact
+				print jid
+				if string.find(jid, "@") <= 0:
+					#It must be an agent
+					jid = string.replace(jid, '@', '')
+					if not self.r.l_group.has_key('Agents'):
+						iterG = self.r.treestore.append(None, (None, \
+							'Agents', 'group', FALSE))
+						self.r.l_group['Agents'] = iterG
+					if not self.r.l_contact.has_key(jid):
+						user1 = user(jid, jid, ['Agents'], ev[1][1], ev[1][2], 'from')
+						iterU = self.r.treestore.append(self.r.l_group['Agents'], \
+							(self.r.pixbufs[ev[1][1]], jid, jid, TRUE))
+						self.r.l_contact[jid] = {'user':user1, 'iter':[iterU]}
+					else:
+						#On mets a jour la ligne ki existe deja
+						for i in self.r.l_contact[jid]['iter']:
+							if self.r.pixbufs.has_key(ev[1][1]):
+								self.r.treestore.set_value(i, 0, self.r.pixbufs[ev[1][1]])
+				elif self.r.l_contact.has_key(jid):
+					#ca n'est pas un agent
+					self.r.chg_status(jid, ev[1][1], ev[1][2])
 			elif ev[0] == 'MSG':
-				if not self.r.tab_messages.has_key(ev[1][0]):
+				if string.find(ev[1][0], "@") <= 0:
+					jid = string.replace(ev[1][0], '@', '')
+				if not self.r.tab_messages.has_key(jid):
 					#FIXME:message d'un inconne
-					self.r.tab_messages[ev[1][0]] = message(self.r.l_contact[ev[1][0]]['user'], self.r)
-				self.r.tab_messages[ev[1][0]].print_conversation(ev[1][1])
+					self.r.tab_messages[jid] = message(self.r.l_contact[jid]['user'], self.r)
+				self.r.tab_messages[jid].print_conversation(ev[1][1])
 			elif ev[0] == 'SUBSCRIBE':
 				authorize(self.r, ev[1])
 			elif ev[0] == 'SUBSCRIBED':
-				u = self.r.l_contact[ev[1]['jid']]['user']
-				u.name = ev[1]['nom']
-				for i in self.r.l_contact[u.jid]['iter']:
-					self.r.treestore.set_value(i, 1, u.name)
+				jid = ev[1]['jid']
+				if self.r.l_contact.has_key(jid):
+					u = self.r.l_contact[jid]['user']
+					u.name = ev[1]['nom']
+					for i in self.r.l_contact[u.jid]['iter']:
+						self.r.treestore.set_value(i, 1, u.name)
+				else:
+					user1 = user(jid, jid, ['general'], 'online', 'online', 'to')
+					if not self.r.l_group.has_key('general'):
+						iterG = self.r.treestore.append(None, (None, \
+							'general', 'group', FALSE))
+						self.r.l_group['general'] = iterG
+					iterU = self.r.treestore.append(self.r.l_group['general'], \
+						(self.r.pixbufs['online'], jid, jid, TRUE))
+					self.r.l_contact[jid] = {'user':user1, 'iter':[iterU]}
+				#TODO: print you are now authorized
 			elif ev[0] == 'AGENTS':
 				if Wbrowser:
 					Wbrowser.agents(ev[1])
+			elif ev[0] == 'AGENT_INFO':
+				Wreg = agent_reg(ev[1][0], ev[1][1], self.r)
 		return 1
 
 	def __init__(self, quIN, quOUT):