diff --git a/libpurple/dnsquery.c b/libpurple/dnsquery.c
--- a/libpurple/dnsquery.c
+++ b/libpurple/dnsquery.c
@@ -115,12 +115,9 @@ purple_dnsquery_resolved(PurpleDnsQueryD
 		 */
 		while (hosts != NULL)
 		{
-			gpointer data;
-			hosts = g_slist_remove(hosts, hosts->data);
-
-			data = hosts->data;
-			hosts = g_slist_remove(hosts, hosts->data);
-			g_free(data);
+			hosts = g_slist_delete_link(hosts, hosts);
+			g_free(hosts->data);
+			hosts = g_slist_delete_link(hosts, hosts);
 		}
 	}
 
diff --git a/libpurple/dnssrv.c b/libpurple/dnssrv.c
--- a/libpurple/dnssrv.c
+++ b/libpurple/dnssrv.c
@@ -472,8 +472,6 @@ end:
 	write_to_parent(in, out, &size, sizeof(size));
 	while (ret != NULL)
 	{
-		gpointer data;
-
 		if (query.type == T_SRV)
 			write_to_parent(in, out, ret->data, sizeof(PurpleSrvResponse));
 		if (query.type == T_TXT) {
@@ -483,9 +481,8 @@ end:
 			write_to_parent(in, out, response->content, l);
 		}
 
-		data = ret->data;
-		ret = g_list_remove(ret, ret->data);
-		g_free(data);
+		g_free(ret->data);
+		ret = g_list_delete_link(ret, ret);
 	}
 
 	close(out);
diff --git a/libpurple/protocols/bonjour/mdns_common.c b/libpurple/protocols/bonjour/mdns_common.c
--- a/libpurple/protocols/bonjour/mdns_common.c
+++ b/libpurple/protocols/bonjour/mdns_common.c
@@ -141,8 +141,8 @@ static void free_presence_txt_records(GS
 		kvp = lst->data;
 		g_free(kvp->key);
 		g_free(kvp->value);
-		lst = g_slist_remove(lst, lst->data);
 		g_free(kvp);
+		lst = g_slist_delete_link(lst, lst);
 	}
 }
 
diff --git a/libpurple/protocols/novell/nmuser.c b/libpurple/protocols/novell/nmuser.c
--- a/libpurple/protocols/novell/nmuser.c
+++ b/libpurple/protocols/novell/nmuser.c
@@ -1525,9 +1525,8 @@ static void
 		for (node = list; node; node = node->next) {
 			if (nm_utf8_str_equal(nm_user_record_get_dn(user_record),
 								  (const char *) node->data)) {
-				gpointer data = node->data;
-				list = g_slist_remove(list, node->data);
-				g_free(data);
+				g_free(node->data);
+				list = g_slist_remove_link(list, node);
 				nm_request_set_user_define(request, list);
 				break;
 			}
diff --git a/libpurple/protocols/simple/simple.c b/libpurple/protocols/simple/simple.c
--- a/libpurple/protocols/simple/simple.c
+++ b/libpurple/protocols/simple/simple.c
@@ -1803,7 +1803,6 @@ static void simple_udp_host_resolved_lis
 static void simple_udp_host_resolved(GSList *hosts, gpointer data, const char *error_message) {
 	struct simple_account_data *sip = (struct simple_account_data*) data;
 	int addr_size;
-	gpointer hosts_data;
 
 	sip->query_data = NULL;
 
@@ -1815,16 +1814,14 @@ static void simple_udp_host_resolved(GSL
 	}
 
 	addr_size = GPOINTER_TO_INT(hosts->data);
-	hosts = g_slist_remove(hosts, hosts->data);
+	hosts = g_slist_delete_link(hosts, hosts);
 	memcpy(&(sip->serveraddr), hosts->data, addr_size);
-	hosts_data = hosts->data;
-	hosts = g_slist_remove(hosts, hosts->data);
-	g_free(hosts_data);
+	g_free(hosts->data);
+	hosts = g_slist_delete_link(hosts, hosts);
 	while(hosts) {
-		hosts = g_slist_remove(hosts, hosts->data);
-		hosts_data = hosts->data;
-		hosts = g_slist_remove(hosts, hosts->data);
-		g_free(hosts_data);
+		hosts = g_slist_delete_link(hosts, hosts);
+		g_free(hosts->data);
+		hosts = g_slist_delete_link(hosts, hosts);
 	}
 
 	/* create socket for incoming connections */
diff --git a/libpurple/proxy.c b/libpurple/proxy.c
--- a/libpurple/proxy.c
+++ b/libpurple/proxy.c
@@ -579,14 +579,13 @@ purple_proxy_connect_data_destroy(Purple
 
 	while (connect_data->hosts != NULL)
 	{
-		gpointer data;
-
 		/* Discard the length... */
-		connect_data->hosts = g_slist_remove(connect_data->hosts, connect_data->hosts->data);
+		connect_data->hosts = g_slist_delete_link(connect_data->hosts,
+		                                          connect_data->hosts);
 		/* Free the address... */
-		data = connect_data->hosts->data;
-		connect_data->hosts = g_slist_remove(connect_data->hosts, connect_data->hosts->data);
-		g_free(data);
+		g_free(connect_data->hosts->data);
+		connect_data->hosts = g_slist_delete_link(connect_data->hosts,
+		                                          connect_data->hosts);
 	}
 
 	g_free(connect_data->host);
diff --git a/libpurple/util.c b/libpurple/util.c
--- a/libpurple/util.c
+++ b/libpurple/util.c
@@ -1479,7 +1479,6 @@ purple_markup_html_to_xhtml(const char *
 					tag = tag->next;
 				}
 				if(tag) {
-					gpointer data;
 					while(tags) {
 						struct purple_parse_tag *pt = tags->data;
 						if(xhtml && !pt->ignore)
@@ -1501,9 +1500,8 @@ purple_markup_html_to_xhtml(const char *
 						tags = g_list_remove(tags, pt);
 						g_free(pt);
 					}
-					data = tag->data;
-					tags = g_list_remove(tags, tag->data);
-					g_free(data);
+					g_free(tag->data);
+					tags = g_list_delete_link(tags, tag);
 				} else {
 					/* a closing tag we weren't expecting...
 					 * we'll let it slide, if it's really a tag...if it's
diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c
--- a/pidgin/gtkconv.c
+++ b/pidgin/gtkconv.c
@@ -4274,15 +4274,13 @@ tab_complete(PurpleConversation *conv)
 
 		while (matches) {
 			char *tmp = addthis;
-			gpointer data;
 
 			addthis = g_strconcat(tmp, matches->data, " ", NULL);
 
 			g_free(tmp);
-
-			data = matches->data;
-			matches = g_list_remove(matches, matches->data);
-			g_free(data);
+			g_free(matches->data);
+
+			matches = g_list_delete_link(matches, matches);
 		}
 
 		purple_conversation_write(conv, NULL, addthis, PURPLE_MESSAGE_NO_LOG,
