diff --git a/src/common/connection.py b/src/common/connection.py
index e22c935fd9c46529d291283e27d536657fcfd7f3..6821551ad6aa864d84de475867a9c22897180c3b 100644
--- a/src/common/connection.py
+++ b/src/common/connection.py
@@ -490,6 +490,16 @@ class Connection:
 		errcode = iq_obj.getErrorCode()
 		self.dispatch('MSGERROR', (jid, errcode, errmsg))
 
+	def _getRosterCB(self, con, iq_obj):
+		roster = self.connection.getRoster().getRaw()
+		if not roster :
+			roster = {}
+		name = gajim.config.get_per('accounts', self.name, 'name')
+		hostname = gajim.config.get_per('accounts', self.name, 'hostname')
+		if roster.has_key(name + '@' + hostname):
+			del roster[name + '@' + hostname]
+		self.dispatch('ROSTER', roster)
+
 	def connect(self):
 		"""Connect and authentificate to the Jabber server"""
 		name = gajim.config.get_per('accounts', self.name, 'name')
@@ -508,7 +518,7 @@ class Connection:
 		else:
 			proxy = None
 		if gajim.config.get('verbose'):
-			con = common.xmpp.Client(hostname)#, debug = [])
+			con = common.xmpp.Client(hostname)
 		else:
 			con = common.xmpp.Client(hostname, debug = [])
 			#debug = [common.jabber.DBG_ALWAYS], log = sys.stderr, \
@@ -544,16 +554,13 @@ class Connection:
 			common.xmpp.NS_VERSION)
 		con.RegisterHandler('iq', self._MucOwnerCB, 'result',\
 			common.xmpp.NS_MUC_OWNER)
+		con.RegisterHandler('iq', self._getRosterCB, 'result',\
+			common.xmpp.NS_ROSTER)
 
 		gajim.log.debug('Connected to server')
 
 		if con.auth(name, self.password, resource): #FIXME: blocking
-			roster = con.getRoster().getRaw() #FIXME: blocking
-			if not roster :
-				roster = {}
-			if roster.has_key(name + '@' + hostname):
-				del roster[name + '@' + hostname]
-			self.dispatch('ROSTER', roster)
+			con.initRoster()
 			self.connected = 2
 			return con
 		else:
diff --git a/src/common/xmpp/client.py b/src/common/xmpp/client.py
index 803c42cb43faccc3e2382b22d99358df06af8ae2..993acdb254fd7121d0c6ce19b6e585ce0bd17adb 100644
--- a/src/common/xmpp/client.py
+++ b/src/common/xmpp/client.py
@@ -205,10 +205,14 @@ class Client(CommonClient):
                 self.connected+='+sasl'
                 return 'sasl'
 
+    def initRoster(self):
+        """ Plug in the roster. """
+        if not self.__dict__.has_key('Roster'): roster.Roster().PlugIn(self)
+
     def getRoster(self):
         """ Return the Roster instance, previously plugging it in and
             requesting roster from server if needed. """
-        if not self.__dict__.has_key('Roster'): roster.Roster().PlugIn(self)
+        self.initRoster()
         return self.Roster.getRoster()
 
     def sendInitPresence(self,requestRoster=1):
diff --git a/src/common/xmpp/dispatcher.py b/src/common/xmpp/dispatcher.py
index b21f9dfa6ea07d84b76817e9c65a5cb776d86653..3ca0d7c74fda714e74149f4a2cd2ed18d82f0d6d 100644
--- a/src/common/xmpp/dispatcher.py
+++ b/src/common/xmpp/dispatcher.py
@@ -170,7 +170,7 @@ class Dispatcher(PlugIn):
         if not self.handlers.has_key(xmlns): self.RegisterNamespace(xmlns,'warn')
         if not self.handlers[xmlns].has_key(name): self.RegisterProtocol(name,Protocol,xmlns,'warn')
         if not self.handlers[xmlns][name].has_key(typ+ns): self.handlers[xmlns][name][typ+ns]=[]
-        if makefirst: self.handlers[xmlns][name][typ+ns].insert({'func':handler,'system':system})
+        if makefirst: self.handlers[xmlns][name][typ+ns].insert(0,{'func':handler,'system':system})
         else: self.handlers[xmlns][name][typ+ns].append({'func':handler,'system':system})
 
     def RegisterHandlerOnce(self,name,handler,typ='',ns='',xmlns=None,makefirst=0, system=0):
diff --git a/src/common/xmpp/roster.py b/src/common/xmpp/roster.py
index 0ceef00a1179f3d4fffe2e91872cebceabbd47cb..7e1b252543411092ac0fe578e0831d11b3ca25d6 100644
--- a/src/common/xmpp/roster.py
+++ b/src/common/xmpp/roster.py
@@ -42,7 +42,7 @@ class Roster(PlugIn):
         """ Register presence and subscription trackers in the owner's dispatcher.
             Also request roster from server if the 'request' argument is set.
             Used internally."""
-        self._owner.RegisterHandler('iq',self.RosterIqHandler,'result',NS_ROSTER)
+        self._owner.RegisterHandler('iq',self.RosterIqHandler,'result',NS_ROSTER,makefirst=1)
         self._owner.RegisterHandler('iq',self.RosterIqHandler,'set',NS_ROSTER)
         self._owner.RegisterHandler('presence',self.PresenceHandler)
         if request: self.Request()