diff --git a/libpurple/protocols.h b/libpurple/protocols.h
--- a/libpurple/protocols.h
+++ b/libpurple/protocols.h
@@ -109,10 +109,9 @@ void purple_protocol_got_account_login_t
 
 /**
  * purple_protocol_got_account_status:
- * @account:   The account the user is on.
+ * @account: The account the user is on.
  * @status_id: The status ID.
- * @...:       A NULL-terminated list of attribute IDs and values,
- *             beginning with the value for <literal>attr_id</literal>.
+ * @...: A NULL-terminated list of attribute IDs and values.
  *
  * Notifies Purple that our account's status has changed.
  *
@@ -123,6 +122,21 @@ void purple_protocol_got_account_status(
                                         G_GNUC_NULL_TERMINATED;
 
 /**
+ * purple_protocol_got_account_status_with_attributes: (rename-to purple_protocol_got_account_status):
+ * @account: The account the user is on.
+ * @status_id: The status ID.
+ * @attributes: (element-type utf8 gpointer): A hash table of attribute IDs and
+ *              their corresponding values.
+ *
+ * Notifies Purple that our account's status has changed.
+ *
+ * This is meant to be called from protocols.
+ *
+ * Since: 3.0.0
+ */
+void purple_protocol_got_account_status_with_attributes(PurpleAccount *account, const gchar *status_id, GHashTable *attributes);
+
+/**
  * purple_protocol_got_account_actions:
  * @account:   The account.
  *
@@ -168,11 +182,10 @@ void purple_protocol_got_user_login_time
 
 /**
  * purple_protocol_got_user_status:
- * @account:   The account the user is on.
- * @name:      The name of the buddy.
+ * @account: The account the user is on.
+ * @name: The name of the buddy.
  * @status_id: The status ID.
- * @...:       A NULL-terminated list of attribute IDs and values,
- *             beginning with the value for <literal>attr_id</literal>.
+ * @...: A NULL-terminated list of attribute IDs and values.
  *
  * Notifies Purple that a buddy's status has been activated.
  *
@@ -183,6 +196,22 @@ void purple_protocol_got_user_status(Pur
                                      G_GNUC_NULL_TERMINATED;
 
 /**
+ * purple_protocol_got_user_status_with_attributes: (rename-to purple_protocol_got_user_status):
+ * @account: The account the user is on.
+ * @name: The name of the buddy.
+ * @status_id: The status ID.
+ * @attributes: (element-type utf8 gpointer): A hash table of attribute IDs and
+ *              their corresponding values.
+ *
+ * Notifies Purple that a buddy's status has been activated.
+ *
+ * This is meant to be called from protocols.
+ *
+ * Since: 3.0.0
+ */
+void purple_protocol_got_user_status_with_attributes(PurpleAccount *account, const gchar *name, const gchar *status_id, GHashTable *attributes);
+
+/**
  * purple_protocol_got_user_status_deactive:
  * @account:   The account the user is on.
  * @name:      The name of the buddy.
# HG changeset patch
# Node ID fd158ec55359
# Parent  9135941d2404
diff --git a/libpurple/protocols.c b/libpurple/protocols.c
--- a/libpurple/protocols.c
+++ b/libpurple/protocols.c
@@ -100,24 +100,39 @@ purple_protocol_got_account_login_time(P
 }
 
 void
-purple_protocol_got_account_status(PurpleAccount *account, const char *status_id, ...)
+purple_protocol_got_account_status_with_attributes(PurpleAccount *account,
+                                                   const gchar *status_id,
+                                                   GHashTable *attributes)
 {
 	PurplePresence *presence;
 	PurpleStatus *status;
-	va_list args;
 
-	g_return_if_fail(account   != NULL);
+	g_return_if_fail(account != NULL);
 	g_return_if_fail(status_id != NULL);
 	g_return_if_fail(purple_account_is_connected(account));
 
 	presence = purple_account_get_presence(account);
-	status   = purple_presence_get_status(presence, status_id);
+	status = purple_presence_get_status(presence, status_id);
 
 	g_return_if_fail(status != NULL);
 
+	purple_status_set_active_with_attrs_dict(status, TRUE, attributes);
+}
+
+void
+purple_protocol_got_account_status(PurpleAccount *account, const char *status_id, ...)
+{
+	GHashTable *attributes = NULL;
+	va_list args;
+
 	va_start(args, status_id);
-	purple_status_set_active_with_attrs(status, TRUE, args);
+	attributes = purple_attrs_from_vargs(args);
 	va_end(args);
+
+	purple_protocol_got_account_status_with_attributes(account, status_id,
+	                                                   attributes);
+
+	g_hash_table_destroy(attributes);
 }
 
 void
@@ -183,42 +198,43 @@ purple_protocol_got_user_login_time(Purp
 }
 
 void
-purple_protocol_got_user_status(PurpleAccount *account, const char *name,
-		const char *status_id, ...)
+purple_protocol_got_user_status_with_attributes(PurpleAccount *account,
+                                                const gchar *name,
+                                                const gchar *status_id,
+                                                GHashTable *attributes)
 {
 	GSList *list, *l;
 	PurpleBuddy *buddy;
 	PurplePresence *presence;
 	PurpleStatus *status;
 	PurpleStatus *old_status;
-	va_list args;
 
 	g_return_if_fail(account   != NULL);
 	g_return_if_fail(name      != NULL);
 	g_return_if_fail(status_id != NULL);
 	g_return_if_fail(purple_account_is_connected(account) || purple_account_is_connecting(account));
 
-	if((list = purple_blist_find_buddies(account, name)) == NULL)
+	if((list = purple_blist_find_buddies(account, name)) == NULL) {
 		return;
+	}
 
 	for(l = list; l != NULL; l = l->next) {
 		buddy = l->data;
 
 		presence = purple_buddy_get_presence(buddy);
-		status   = purple_presence_get_status(presence, status_id);
+		status = purple_presence_get_status(presence, status_id);
 
-		if(NULL == status)
+		if(NULL == status) {
 			/*
 			 * TODO: This should never happen, right?  We should call
 			 *       g_warning() or something.
 			 */
 			continue;
+		}
 
 		old_status = purple_presence_get_active_status(presence);
 
-		va_start(args, status_id);
-		purple_status_set_active_with_attrs(status, TRUE, args);
-		va_end(args);
+		purple_status_set_active_with_attrs_dict(status, TRUE, attributes);
 
 		purple_buddy_update_status(buddy, old_status);
 	}
@@ -233,6 +249,23 @@ purple_protocol_got_user_status(PurpleAc
 	}
 }
 
+void
+purple_protocol_got_user_status(PurpleAccount *account, const gchar *name,
+                                const gchar *status_id, ...)
+{
+	GHashTable *attributes = NULL;
+	va_list args;
+
+	va_start(args, status_id);
+	attributes = purple_attrs_from_vargs(args);
+	va_end(args);
+
+	purple_protocol_got_user_status_with_attributes(account, name, status_id,
+	                                                attributes);
+
+	g_hash_table_destroy(attributes);
+}
+
 void purple_protocol_got_user_status_deactive(PurpleAccount *account, const char *name,
 					const char *status_id)
 {
