diff -Nru gajim-20060727/src/common/xmpp/transports_nb.py gajim-20060727-ipv6/src/common/xmpp/transports_nb.py
--- gajim-20060727/src/common/xmpp/transports_nb.py	2006-07-26 14:49:11.000000000 +0200
+++ gajim-20060727-ipv6/src/common/xmpp/transports_nb.py	2006-07-27 22:48:24.000000000 +0200
@@ -60,6 +60,11 @@
 		# -2 - disconnected
 		self.state = 0
 		
+		# server information (IPv6 or IPv4 addresses to try connect to)
+		self._addrinfo = None
+		# socket address information used to connect to server
+		self._serveraddr = None
+		
 		# queue with messages to be send 
 		self.sendqueue = []
 		
@@ -90,9 +95,16 @@
 		
 	def read_timeout(self):
 		if self.state == 0:
-			self.idlequeue.unplug_idle(self.fd)
-			if self.on_connect_failure:
-				self.on_connect_failure()
+			# connect with this server address failed
+			self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (timeout)"%(self._server[0],self._server[1],self._serveraddr[0],self._serveraddr[1]),'info')
+			self._addrinfo.pop(0)
+			# try another server address if possible, otherwise failure
+			if len(self._addrinfo) > 0:
+				self.connect()
+			else:
+				self.idlequeue.unplug_idle(self.fd)
+				if self.on_connect_failure:
+					self.on_connect_failure()
 		else:
 			if self.on_timeout:
 				self.on_timeout()
@@ -105,14 +117,39 @@
 		else: 
 			self._server = server
 		self.state = 0
-		try:
-			self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-			self._sock.setblocking(False)
-		except:
+		
+		# get server addresses (either IPv6 or IPv4) if not already done
+		if self._addrinfo is None:
+			self._addrinfo = socket.getaddrinfo(server[0], server[1], socket.AF_UNSPEC, socket.SOCK_STREAM)
+		
+		# try to connect to server with one of its addresses
+		self._sock = None
+		for res in self._addrinfo:
+			af, socktype, proto, canonname, sa = res
+		
+			self.DEBUG("Connect to %s:%d with address [%s]:%d"%(server[0],server[1],sa[0],sa[1]),'info')
+			try:
+				self._sock = socket.socket(af, socktype, proto)
+				self._sock.setblocking(False)
+			except socket.error, msg:
+				self._sock = None
+				self._addrinfo.pop(0)
+				self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (socket() failed)"%(server[0],server[1],sa[0],sa[1]),'info')
+				continue
+
+			self._serveraddr = sa
+			break
+
+		# if socket creation failed and no more addresses are available,
+		# failure
+		if self._sock is None:
 			sys.exc_clear()
 			if self.on_connect_failure:
 				self.on_connect_failure()
 			return False
+
+		# if socket creation with one server address is successful,
+		# try to connect
 		self.fd = self._sock.fileno()
 		self.idlequeue.plug_idle(self, True, False)
 		self.set_timeout(CONNECT_TIMEOUT_SECONDS)
@@ -285,7 +322,7 @@
 		self._sock.setblocking(False)
 		errnum = 0
 		try:
-			self._sock.connect(self._server)
+			self._sock.connect(self._serveraddr)
 		except socket.error, e:
 			errnum = e[0]
 			sys.exc_clear()
@@ -295,10 +332,18 @@
 		# 10056  - already connected, only on win32
 		# code 'WS*' is not available on GNU, so we use its numeric value
 		elif errnum not in (0, 10056, errno.EISCONN): 
+			self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (connect() failed with error %d)"%(self._server[0],self._server[1],self._serveraddr[0],self._serveraddr[1],errnum),'info')
 			self.remove_timeout()
-			if self.on_connect_failure:
-				self.on_connect_failure()
+			self._sock.close()
+			self._addrinfo.pop(0)
+			# try another server address if possible, otherwise failure
+			if len(self._addrinfo) > 0:
+				self.connect()
+			else:
+				if self.on_connect_failure:
+					self.on_connect_failure()
 			return
+		
 		self.remove_timeout()
 		self._owner.Connection=self
 		self.state = 1
diff -Nru gajim-20060727/src/common/xmpp/transports.py gajim-20060727-ipv6/src/common/xmpp/transports.py
--- gajim-20060727/src/common/xmpp/transports.py	2006-01-20 14:23:38.000000000 +0100
+++ gajim-20060727-ipv6/src/common/xmpp/transports.py	2006-07-27 22:53:14.000000000 +0200
@@ -94,15 +94,30 @@
 
     def connect(self,server=None):
         """ Try to connect. Returns non-empty string on success. """
-        try:
-            if not server: server=self._server
-            self._sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            self._sock.connect(server)
-            self._send=self._sock.sendall
-            self._recv=self._sock.recv
-            self.DEBUG("Successfully connected to remote host %s"%`server`,'start')
-            return 'ok'
-        except: pass
+        if not server: server=self._server
+        s = None
+        for res in socket.getaddrinfo(server[0], server[1], socket.AF_UNSPEC, socket.SOCK_STREAM):
+            af, socktype, proto, canonname, sa = res
+            self.DEBUG("Connect to %s:%d with address [%s]:%d"%(server[0],server[1],sa[0],sa[1]),'info')
+            try:
+                s = socket.socket(af, socktype, proto)
+            except socket.error, msg:
+                self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (socket() failed)"%(server[0],server[1],sa[0],sa[1]),'info')
+                s = None
+                continue
+            try:
+                s.connect(sa)
+            except socket.error, msg:
+                self.DEBUG("Failed to connect to %s:%d with address [%s]:%d (connect() failed)"%(server[0],server[1],sa[0],sa[1]),'info')
+                s.close()
+                s = None
+                continue
+            self.DEBUG("Successfully connected to remote host %s:%d with address [%s]:%d"%(server[0],server[1],sa[0],sa[1]),'info')
+            break
+        if s is None:
+            self.DEBUG("Failed to connect to remote host %s:%s"%(server[0],server[1]),'info')
+            pass
+        return 'ok'
 
     def plugout(self):
         """ Disconnect from the remote server and unregister self.disconnected method from
diff -Nru gajim-20060727/THANKS gajim-20060727-ipv6/THANKS
--- gajim-20060727/THANKS	2006-07-04 00:08:50.000000000 +0200
+++ gajim-20060727-ipv6/THANKS	2006-07-27 22:51:41.000000000 +0200
@@ -10,6 +10,7 @@
 Christoph Neuroth
 David Campey
 Dennis Craven
+Didier Barvaux (IPv6 support)
 Fabian Neumann
 Filippos Papadopoulos
 Francisco Alburquerque Parra (Membris Khan)
