Index: protocols/jabber/io.c
===================================================================
--- protocols/jabber/io.c	(revision 101d84fe3018ba138a9cb5f0f030997e8ff7bdbe)
+++ protocols/jabber/io.c	(revision 090f1cbe72373b31e753af4a1442ddd53b02791b)
@@ -386,5 +386,5 @@
 	if( jd->flags & JFLAG_AUTHENTICATED && ( jd->flags & ( JFLAG_WAIT_BIND | JFLAG_WAIT_SESSION ) ) == 0 )
 	{
-		if( !jabber_get_roster( gc ) || !jabber_get_privacy( gc ) )
+		if( !jabber_get_roster( gc ) )
 			return XT_ABORT;
 	}
Index: protocols/jabber/iq.c
===================================================================
--- protocols/jabber/iq.c	(revision 101d84fe3018ba138a9cb5f0f030997e8ff7bdbe)
+++ protocols/jabber/iq.c	(revision 090f1cbe72373b31e753af4a1442ddd53b02791b)
@@ -109,40 +109,4 @@
 		account_online( gc );
 	}
-	if( strcmp( type, "result" ) == 0 && xmlns && strcmp( xmlns, "jabber:iq:privacy" ) == 0 )
-	{
-		struct xt_node *node;
-		
-		/* When receiving a list of lists: */
-		if( ( node = xt_find_node( query->children, "active" ) ) )
-		{
-			if( ( s = xt_find_attr( node, "name" ) ) )
-			{
-				set_t *set;
-				
-				g_free( jd->privacy_active );
-				jd->privacy_active = g_strdup( s );
-				
-				/* Save it so the user can see it. */
-				if( ( set = set_find( &gc->acc->set, "privacy_list" ) ) )
-				{
-					g_free( set->value );
-					set->value = g_strdup( s );
-				}
-				
-				if( !jabber_get_privacy( gc ) )
-					return XT_ABORT;
-			}
-		}
-		/* When receiving an actual list: */
-		else if( ( node = xt_find_node( query->children, "list" ) ) )
-		{
-			xt_free_node( jd->privacy_list );
-			jd->privacy_list = xt_dup( node );
-		}
-		else if( query->children == NULL )
-		{
-			/* What to do here if there is no privacy list defined yet... */
-		}
-	}
 	else if( strcmp( type, "result" ) == 0 && orig )
 	{
@@ -157,5 +121,5 @@
 			   the old (non-SASL) way. */
 			jd->flags |= JFLAG_AUTHENTICATED;
-			if( !jabber_get_roster( gc ) || !jabber_get_privacy( gc ) )
+			if( !jabber_get_roster( gc ) )
 				return XT_ABORT;
 		}
@@ -181,18 +145,7 @@
 			if( ( jd->flags & ( JFLAG_WAIT_BIND | JFLAG_WAIT_SESSION ) ) == 0 )
 			{
-				if( !jabber_get_roster( gc ) || !jabber_get_privacy( gc ) )
+				if( !jabber_get_roster( gc ) )
 					return XT_ABORT;
 			}
-		}
-		else if( ( c = xt_find_node( orig->children, "query" ) ) &&
-		         ( c = xt_find_node( c->children, "active" ) ) )
-		{
-			/* We just successfully activated a (different)
-			   privacy list. Fetch it now. */
-			g_free( jd->privacy_active );
-			jd->privacy_active = g_strdup( xt_find_attr( c, "name" ) );
-			
-			if( !jabber_get_privacy( gc ) )
-				return XT_ABORT;
 		}
 	}
@@ -209,31 +162,4 @@
 			return XT_ABORT;
 		}
-		else if( ( xmlns && strcmp( xmlns, "jabber:iq:privacy" ) == 0 ) ||
-		         ( orig &&
-		           ( c = xt_find_node( orig->children, "query" ) ) &&
-		           ( s = xt_find_attr( c, "xmlns" ) ) &&
-		           strcmp( s, "jabber:iq:privacy" ) == 0 ) )
-		{
-			/* All errors related to privacy lists. */
-			if( ( c = xt_find_node( node->children, "error" ) ) == NULL )
-			{
-				hide_login_progress_error( gc, "Received malformed error packet" );
-				signoff( gc );
-				return XT_ABORT;
-			}
-			
-			if( xt_find_node( c->children, "item-not-found" ) )
-			{
-				serv_got_crap( gc, "Error while activating privacy list, maybe it doesn't exist" );
-				/* Should I do anything else here? */
-			}
-			else if( xt_find_node( c->children, "feature-not-implemented" ) )
-			{
-				jd->flags |= JFLAG_PRIVACY_BROKEN;
-				/* Probably there's no need to inform the user.
-				   We can do that if the user ever tries to use
-				   the block/allow commands. */
-			}
-		}
 	}
 	
@@ -316,76 +242,2 @@
 	return st;
 }
-
-/* Request the privacy list from the server. We need this, because every
-   time we remove/add something we have to send the whole new list to the
-   server again... If no privacy list is specified yet, this function will
-   first ask for the list of lists (XMPP supports multiple "privacy lists",
-   don't ask me why), later we can then fetch the list we want to use. */
-int jabber_get_privacy( struct gaim_connection *gc )
-{
-	struct jabber_data *jd = gc->proto_data;
-	struct xt_node *node = NULL;
-	char *name;
-	int st;
-	
-	if( jd->privacy_active )
-	{
-		/* If we know what is the active list right now, fetch it. */
-		node = xt_new_node( "list", NULL, NULL );
-		xt_add_attr( node, "name", jd->privacy_active );
-	}
-	/* Okay, we don't know yet. If the user set a specific list, we'll
-	   activate that one. Otherwise, we should figure out which list is
-	   currently active. */
-	else if( ( name = set_getstr( &gc->acc->set, "privacy_list" ) ) )
-	{
-		return jabber_set_privacy( gc, name );
-	}
-	/* else: sending this packet without a <list/> element will give
-	   a list of available lists and information about the currently
-	   active list. */
-	
-	node = xt_new_node( "query", NULL, node );
-	xt_add_attr( node, "xmlns", "jabber:iq:privacy" );
-	node = jabber_make_packet( "iq", "get", NULL, node );
-	
-	jabber_cache_packet( gc, node );
-	st = jabber_write_packet( gc, node );
-	
-	return st;
-}
-
-int jabber_set_privacy( struct gaim_connection *gc, char *name )
-{
-	struct xt_node *node;
-	
-	node = xt_new_node( "active", NULL, NULL );
-	xt_add_attr( node, "name", name );
-	node = xt_new_node( "query", NULL, node );
-	xt_add_attr( node, "xmlns", "jabber:iq:privacy" );
-	
-	node = jabber_make_packet( "iq", "set", NULL, node );
-	jabber_cache_packet( gc, node );
-	
-	return jabber_write_packet( gc, node );
-}
-
-char *set_eval_privacy_list( set_t *set, char *value )
-{
-	account_t *acc = set->data;
-	struct jabber_data *jd = acc->gc->proto_data;
-	
-	if( jd->flags & JFLAG_PRIVACY_BROKEN )
-	{
-		serv_got_crap( acc->gc, "Privacy lists not supported by this server" );
-		return NULL;
-	}
-	
-	/* If we're on-line, return NULL and let the server decide if the
-	   chosen list is valid. If we're off-line, just accept it and we'll
-	   see later (when we connect). */
-	if( acc->gc )
-		jabber_set_privacy( acc->gc, value );
-	
-	return acc->gc ? NULL : value;
-}
Index: protocols/jabber/jabber.c
===================================================================
--- protocols/jabber/jabber.c	(revision 101d84fe3018ba138a9cb5f0f030997e8ff7bdbe)
+++ protocols/jabber/jabber.c	(revision 090f1cbe72373b31e753af4a1442ddd53b02791b)
@@ -42,6 +42,4 @@
 	s = set_add( &acc->set, "priority", "0", set_eval_priority, acc );
 	
-	s = set_add( &acc->set, "privacy_list", NULL, set_eval_privacy_list, acc );
-	
 	s = set_add( &acc->set, "resource", "BitlBee", NULL, acc );
 	s->flags |= ACC_SET_OFFLINE_ONLY;
@@ -110,7 +108,4 @@
 	if( jd->tx_len )
 		g_free( jd->txq );
-	
-	xt_free_node( jd->privacy_list );
-	g_free( jd->privacy_active );
 	
 	xt_free_node( jd->node_cache );
@@ -227,36 +222,4 @@
 		c->flags |= XT_SEEN;
 	}
-}
-
-static void jabber_add_permit( struct gaim_connection *gc, char *who )
-{
-	struct jabber_data *jd = gc->proto_data;
-	
-	if( jd->flags & JFLAG_PRIVACY_BROKEN )
-	{
-		serv_got_crap( gc, "Privacy lists not supported by this server" );
-		return;
-	}
-}
-
-static void jabber_rem_permit( struct gaim_connection *gc, char *who )
-{
-	struct jabber_data *jd = gc->proto_data;
-	
-	if( jd->flags & JFLAG_PRIVACY_BROKEN )
-	{
-		serv_got_crap( gc, "Privacy lists not supported by this server" );
-		return;
-	}
-}
-
-/* XMPP doesn't have both a block- and and allow-list, so these two functions
-   will be no-ops: */
-static void jabber_add_deny( struct gaim_connection *gc, char *who )
-{
-}
-
-static void jabber_rem_deny( struct gaim_connection *gc, char *who )
-{
 }
 
@@ -282,8 +245,4 @@
 //	ret->chat_open = jabber_chat_open;
 	ret->keepalive = jabber_keepalive;
-	ret->add_permit = jabber_add_permit;
-	ret->rem_permit = jabber_rem_permit;
-	ret->add_deny = jabber_add_deny;
-	ret->rem_deny = jabber_rem_deny;
 //	ret->send_typing = jabber_send_typing;
 	ret->handle_cmp = g_strcasecmp;
Index: protocols/jabber/jabber.h
===================================================================
--- protocols/jabber/jabber.h	(revision 101d84fe3018ba138a9cb5f0f030997e8ff7bdbe)
+++ protocols/jabber/jabber.h	(revision 090f1cbe72373b31e753af4a1442ddd53b02791b)
@@ -37,5 +37,4 @@
 	JFLAG_WAIT_SESSION = 8,		/* Set if we sent a <session> tag and need a reply before we continue. */
 	JFLAG_WAIT_BIND = 16,		/* ... for <bind> tag. */
-	JFLAG_PRIVACY_BROKEN = 32,	/* Or just not supported, actually. */
 } jabber_flags_t;
 
@@ -61,8 +60,4 @@
 	char *away_message;
 	
-	/* Updates to this one should be synchronized using jabber_privacy_update(). */
-	struct xt_node *privacy_list;
-	char *privacy_active;
-	
 	struct xt_node *node_cache;
 };
@@ -74,6 +69,4 @@
 };
 
-#define DEFAULT_PRIVACY_LIST "simple_blocklist"
-
 /* iq.c */
 xt_status jabber_pkt_iq( struct xt_node *node, gpointer data );
@@ -82,7 +75,4 @@
 int jabber_add_to_roster( struct gaim_connection *gc, char *handle, char *name );
 int jabber_remove_from_roster( struct gaim_connection *gc, char *handle );
-int jabber_get_privacy( struct gaim_connection *gc );
-int jabber_set_privacy( struct gaim_connection *gc, char *name );
-char *set_eval_privacy_list( set_t *set, char *value );
 
 /* message.c */
Index: protocols/jabber/xmltree.c
===================================================================
--- protocols/jabber/xmltree.c	(revision 101d84fe3018ba138a9cb5f0f030997e8ff7bdbe)
+++ protocols/jabber/xmltree.c	(revision 090f1cbe72373b31e753af4a1442ddd53b02791b)
@@ -528,8 +528,24 @@
 	int i;
 	
-	for( i = 0; node->attr[i].key; i ++ );
-	node->attr = g_renew( struct xt_attr, node->attr, i + 2 );
-	node->attr[i].key = g_strdup( key );
+	/* Now actually it'd be nice if we can also change existing attributes
+	   (which actually means this function doesn't have the right name).
+	   So let's find out if we have this attribute already... */
+	for( i = 0; node->attr[i].key; i ++ )
+		if( strcmp( node->attr[i].key, key ) == 0 )
+			break;
+	
+	if( node->attr[i].key == NULL )
+	{
+		/* If not, allocate space for a new attribute. */
+		node->attr = g_renew( struct xt_attr, node->attr, i + 2 );
+		node->attr[i].key = g_strdup( key );
+		node->attr[i+1].key = NULL;
+	}
+	else
+	{
+		/* Otherwise, free the old value before setting the new one. */
+		g_free( node->attr[i].value );
+	}
+	
 	node->attr[i].value = g_strdup( value );
-	node->attr[i+1].key = NULL;
-}
+}
