diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py
index c4674a6340858297868fb9b732e8b111029a9cfe..b21de9ec6157eb59e32f449d8e58ca446eafc8c5 100644
--- a/src/common/connection_handlers.py
+++ b/src/common/connection_handlers.py
@@ -647,22 +647,12 @@ class ConnectionDisco:
 			common.xmpp.NS_DISCO, frm = to)
 		iq.setAttr('id', id)
 		query = iq.setTag('query')
-		# bytestream transfers
-		feature = common.xmpp.Node('feature')
-		feature.setAttr('var', common.xmpp.NS_BYTESTREAM)
-		query.addChild(node=feature)
-		# si methods
-		feature = common.xmpp.Node('feature')
-		feature.setAttr('var', common.xmpp.NS_SI)
-		query.addChild(node=feature)
-		# filetransfers transfers
-		feature = common.xmpp.Node('feature')
-		feature.setAttr('var', common.xmpp.NS_FILE)
-		query.addChild(node=feature)
-		# exposing adhoc commands
-		feature = common.xmpp.Node('feature')
-		feature.setAttr('var', common.xmpp.NS_COMMANDS)
-		query.addChild(node=feature)
+		query.setAttr('node','http://gajim.org/caps#' + gajim.version)
+		for f in (common.xmpp.NS_BYTESTREAM, common.xmpp.NS_SI, \
+						common.xmpp.NS_FILE, common.xmpp.NS_COMMANDS):
+			feature = common.xmpp.Node('feature')
+			feature.setAttr('var', f)
+			query.addChild(node=feature)
 		
 		self.connection.send(iq)
 		raise common.xmpp.NodeProcessed
@@ -725,6 +715,8 @@ class ConnectionDisco:
 		else:
 			iq = iq_obj.buildReply('result')
 			q = iq.getTag('query')
+			if node:
+				q.setAttr('node', node)
 			q.addChild('identity', attrs = {'type': 'pc', 'category': 'client',
 				'name': 'Gajim'})
 			extension = None
@@ -732,18 +724,20 @@ class ConnectionDisco:
 				extension = node[node.index('#') + 1:]
 			client_version = 'http://gajim.org/caps#' + gajim.version
 
-			if node in (None, client_version) or extension == 'ftrans':
+			if node in (None, client_version):
 				q.addChild('feature', attrs = {'var': common.xmpp.NS_BYTESTREAM})
 				q.addChild('feature', attrs = {'var': common.xmpp.NS_SI})
 				q.addChild('feature', attrs = {'var': common.xmpp.NS_FILE})
-			if node in (None, client_version) or extension == 'xhtml':
-				q.addChild('feature', attrs = {'var': common.xmpp.NS_XHTML_IM})
-			if node in (None, client_version):
 				q.addChild('feature', attrs = {'var': common.xmpp.NS_MUC})
-				q.addChild('feature', attrs = {'var': common.xmpp.NS_CHATSTATES})
 				q.addChild('feature', attrs = {'var': common.xmpp.NS_COMMANDS})
 				q.addChild('feature', attrs = {'var': common.xmpp.NS_DISCO_INFO})
 
+			if (node is None or extension == 'cstates') and gajim.config.get('outgoing_chat_state_notifactions') != 'disabled':
+				q.addChild('feature', attrs = {'var': common.xmpp.NS_CHATSTATES})
+
+			if (node is None or extension == 'xhtml') and not gajim.config.get('ignore_incoming_xhtml'):
+				q.addChild('feature', attrs = {'var': common.xmpp.NS_XHTML_IM})
+
 			if q.getChildren():
 				self.connection.send(iq)
 				raise common.xmpp.NodeProcessed
@@ -824,7 +818,14 @@ class ConnectionVcard:
 		''' advertise our capabilities in presence stanza (jep-0115)'''
 		c = p.setTag('c', namespace = common.xmpp.NS_CAPS)
 		c.setAttr('node', 'http://gajim.org/caps')
-		c.setAttr('ext', 'ftrans xhtml')
+		ext = []
+		if not gajim.config.get('ignore_incoming_xhtml'):
+			ext.append('xhtml')
+		if gajim.config.get('outgoing_chat_state_notifactions') != 'disabled':
+			ext.append('cstates')
+ 
+		if len(ext):
+			c.setAttr('ext', ' '.join(ext))
 		c.setAttr('ver', gajim.version)
 		return p