# HG changeset patch
# Node ID fac8b3c1a1d1
# Parent  e0f4a672f85d
diff --git a/libpurple/accounts.h b/libpurple/accounts.h
--- a/libpurple/accounts.h
+++ b/libpurple/accounts.h
@@ -27,6 +27,7 @@
 #define PURPLE_ACCOUNTS_H
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 #include "status.h"
 
 G_BEGIN_DECLS
@@ -91,7 +92,10 @@ void purple_accounts_uninit(void);
  * purple_accounts_schedule_save:
  *
  * Schedules saving of accounts
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_accounts_schedule_save(void);
 
 G_END_DECLS
diff --git a/libpurple/action.h b/libpurple/action.h
--- a/libpurple/action.h
+++ b/libpurple/action.h
@@ -29,9 +29,14 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_PROTOCOL_ACTION (purple_protocol_action_get_type())
+
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef struct _PurpleProtocolAction PurpleProtocolAction;
 
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleProtocolActionCallback)(PurpleProtocolAction *action);
 
 /**
@@ -41,6 +46,7 @@ typedef void (*PurpleProtocolActionCallb
  * place this is used is by protocols to tell the core the list of available
  * right-click actions for a buddy list row.
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef struct _PurpleActionMenu PurpleActionMenu;
 
 #include "connection.h"
@@ -80,7 +86,10 @@ G_BEGIN_DECLS
  * Creates a new PurpleActionMenu.
  *
  * Returns: (transfer full): The PurpleActionMenu.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleActionMenu *purple_action_menu_new(const gchar *label, GCallback callback, gpointer data, GList *children);
 
 /**
@@ -88,7 +97,10 @@ PurpleActionMenu *purple_action_menu_new
  * @act: The PurpleActionMenu to free.
  *
  * Frees a PurpleActionMenu
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_action_menu_free(PurpleActionMenu *act);
 
 /**
@@ -98,7 +110,10 @@ void purple_action_menu_free(PurpleActio
  * Returns the label of the PurpleActionMenu.
  *
  * Returns: The label string.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_action_menu_get_label(const PurpleActionMenu *act);
 
 /**
@@ -108,7 +123,10 @@ const gchar *purple_action_menu_get_labe
  * Returns the callback of the PurpleActionMenu.
  *
  * Returns: (transfer none): The callback function.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GCallback purple_action_menu_get_callback(const PurpleActionMenu *act);
 
 /**
@@ -118,7 +136,10 @@ GCallback purple_action_menu_get_callbac
  * Returns the data stored in the PurpleActionMenu.
  *
  * Returns: The data.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer purple_action_menu_get_data(const PurpleActionMenu *act);
 
 /**
@@ -128,7 +149,10 @@ gpointer purple_action_menu_get_data(con
  * Returns the children of the PurpleActionMenu.
  *
  * Returns: (element-type PurpleActionMenu) (transfer none): The menu children.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList* purple_action_menu_get_children(const PurpleActionMenu *act);
 
 /**
@@ -137,7 +161,10 @@ GList* purple_action_menu_get_children(c
  * @label: The label for the menu action.
  *
  * Set the label to the PurpleActionMenu.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_action_menu_set_label(PurpleActionMenu *act, const gchar *label);
 
 /**
@@ -146,7 +173,10 @@ void purple_action_menu_set_label(Purple
  * @callback: (scope notified):  The callback.
  *
  * Set the callback that will be used by the PurpleActionMenu.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_action_menu_set_callback(PurpleActionMenu *act, GCallback callback);
 
 /**
@@ -155,7 +185,10 @@ void purple_action_menu_set_callback(Pur
  * @data:  The data used by this PurpleActionMenu
  *
  * Set the label to the PurpleActionMenu.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_action_menu_set_data(PurpleActionMenu *act, gpointer data);
 
 /**
@@ -164,7 +197,10 @@ void purple_action_menu_set_data(PurpleA
  * @children: (element-type PurpleActionMenu) (transfer full): The menu children
  *
  * Set the children of the PurpleActionMenu.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_action_menu_set_children(PurpleActionMenu *act, GList *children);
 
 /******************************************************************************
@@ -175,7 +211,10 @@ void purple_action_menu_set_children(Pur
  * purple_protocol_action_get_type:
  *
  * Returns: The #GType for the #PurpleProtocolAction boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_protocol_action_get_type(void);
 
 /**
@@ -188,7 +227,10 @@ GType purple_protocol_action_get_type(vo
  * a list in the get_actions function of the protocol.
  *
  * Returns: (transfer full): The new #PurpleProtocolAction.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleProtocolAction *purple_protocol_action_new(const gchar *label, PurpleProtocolActionCallback callback);
 
 /**
@@ -198,7 +240,10 @@ PurpleProtocolAction *purple_protocol_ac
  * Creates a newly allocated copy of @action.
  *
  * Returns: (transfer full): A copy of @action.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleProtocolAction *purple_protocol_action_copy(PurpleProtocolAction *action);
 
 /**
@@ -206,7 +251,10 @@ PurpleProtocolAction *purple_protocol_ac
  * @action: The PurpleProtocolAction to free.
  *
  * Frees a PurpleProtocolAction
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_action_free(PurpleProtocolAction *action);
 
 
diff --git a/libpurple/blistnode.h b/libpurple/blistnode.h
--- a/libpurple/blistnode.h
+++ b/libpurple/blistnode.h
@@ -155,7 +155,10 @@ PurpleBlistNode *purple_blist_node_get_s
  * Returns a node's settings
  *
  * Returns: (transfer none): The hash table with the node's settings.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GHashTable *purple_blist_node_get_settings(PurpleBlistNode *node);
 
 /**
@@ -166,7 +169,10 @@ GHashTable *purple_blist_node_get_settin
  * Checks whether a named setting exists for a node in the buddy list
  *
  * Returns: TRUE if a value exists, or FALSE if there is no setting
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_blist_node_has_setting(PurpleBlistNode *node, const char *key);
 
 /**
diff --git a/libpurple/buddy.h b/libpurple/buddy.h
--- a/libpurple/buddy.h
+++ b/libpurple/buddy.h
@@ -100,7 +100,10 @@ G_BEGIN_DECLS
  * purple_buddy_get_type:
  *
  * Returns: The #GType for the #PurpleBuddy object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_buddy_get_type(void);
 
 /**
@@ -174,7 +177,10 @@ PurpleAccount *purple_buddy_get_account(
  * @name:  The name.
  *
  * Sets a buddy's name
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_buddy_set_name(PurpleBuddy *buddy, const char *name);
 
 /**
@@ -242,7 +248,10 @@ PurplePresence *purple_buddy_get_presenc
  * Updates a buddy's status.
  *
  * This should only be called from within Purple.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_buddy_update_status(PurpleBuddy *buddy, PurpleStatus *old_status);
 
 /**
@@ -281,7 +290,10 @@ const char *purple_buddy_get_alias_only(
  * @alias:  The server alias to be set.
  *
  * Sets the server alias for a buddy.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_buddy_set_server_alias(PurpleBuddy *buddy, const char *alias);
 
 /**
@@ -325,7 +337,10 @@ const char *purple_buddy_get_alias(Purpl
  * @alias:  The local alias for the buddy
  *
  * Sets the local alias for the buddy.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_buddy_set_local_alias(PurpleBuddy *buddy, const char *alias);
 
 /**
diff --git a/libpurple/buddyicon.h b/libpurple/buddyicon.h
--- a/libpurple/buddyicon.h
+++ b/libpurple/buddyicon.h
@@ -103,7 +103,10 @@ G_BEGIN_DECLS
  * purple_buddy_icon_get_type:
  *
  * Returns: The #GType for the #PurpleBuddyIcon boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_buddy_icon_get_type(void);
 
 /**
@@ -493,7 +496,10 @@ void purple_buddy_icons_uninit(void);
  * purple_buddy_icon_spec_get_type:
  *
  * Returns: The #GType for the #PurpleBuddyIconSpec boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_buddy_icon_spec_get_type(void);
 
 /**
@@ -510,7 +516,10 @@ GType purple_buddy_icon_spec_get_type(vo
  * Creates a new #PurpleBuddyIconSpec instance.
  *
  * Returns:  A new buddy icon spec.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBuddyIconSpec *purple_buddy_icon_spec_new(char *format, int min_width,
 		int min_height, int max_width, int max_height, size_t max_filesize,
 		PurpleBuddyIconScaleFlags scale_rules);
@@ -535,7 +544,10 @@ void purple_buddy_icon_spec_free(PurpleB
  *                   constrained by the spec.
  *
  * Gets display size for a buddy icon
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_buddy_icon_spec_get_scaled_size(PurpleBuddyIconSpec *spec,
 		int *width, int *height);
 
diff --git a/libpurple/buddylist.h b/libpurple/buddylist.h
--- a/libpurple/buddylist.h
+++ b/libpurple/buddylist.h
@@ -55,7 +55,10 @@ typedef struct _PurpleBuddyList PurpleBu
  * Please note, prpls shouldn't save default group name depending on current
  * locale. So, this function is mostly for libpurple2 compatibility. And for
  * improperly written prpls.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *
 _purple_blist_get_localized_default_group_name(void);
 
@@ -169,7 +172,10 @@ G_BEGIN_DECLS
  * purple_buddy_list_get_type:
  *
  * Returns: The #GType for the #PurpleBuddyList object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleBuddyList, purple_buddy_list, PURPLE, BUDDY_LIST,
                          GObject)
 
@@ -244,7 +250,10 @@ void purple_blist_set_visible(gboolean s
  * Updates the buddies hash table when a buddy has been renamed. This only
  * updates the cache, the caller is responsible for the actual renaming of
  * the buddy after updating the cache.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_update_buddies_cache(PurpleBuddy *buddy, const char *new_name);
 
 /**
@@ -255,7 +264,10 @@ void purple_blist_update_buddies_cache(P
  * Updates the groups hash table when a group has been renamed. This only
  * updates the cache, the caller is responsible for the actual renaming of
  * the group after updating the cache.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_update_groups_cache(PurpleGroup *group, const char *new_name);
 
 /**
@@ -361,7 +373,10 @@ void purple_blist_remove_group(PurpleGro
  * Finds the buddy struct given a name and an account
  *
  * Returns: (transfer none): The buddy or %NULL if the buddy does not exist.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBuddy *purple_blist_find_buddy(PurpleAccount *account, const char *name);
 
 /**
@@ -374,7 +389,10 @@ PurpleBuddy *purple_blist_find_buddy(Pur
  *
  * Returns: (transfer none): The buddy or %NULL if the buddy does not exist in
  *          the group.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBuddy *purple_blist_find_buddy_in_group(PurpleAccount *account, const char *name,
 		PurpleGroup *group);
 
@@ -387,7 +405,10 @@ PurpleBuddy *purple_blist_find_buddy_in_
  *
  * Returns: (element-type PurpleBuddy) (transfer container): %NULL if the buddy
  *          doesn't exist, or a GSList of PurpleBuddy structs.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GSList *purple_blist_find_buddies(PurpleAccount *account, const char *name);
 
 /**
@@ -397,7 +418,10 @@ GSList *purple_blist_find_buddies(Purple
  * Finds a group by name
  *
  * Returns: (transfer none): The group or %NULL if the group does not exist.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleGroup *purple_blist_find_group(const char *name);
 
 /**
@@ -406,7 +430,10 @@ PurpleGroup *purple_blist_find_group(con
  * Finds or creates default group.
  *
  * Returns: (transfer none): The default group.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleGroup *purple_blist_get_default_group(void);
 
 /**
@@ -613,7 +640,10 @@ void purple_blist_init(void);
  * Loads the buddy list.
  *
  * You shouldn't call this. purple_core_init() will do it for you.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_boot(void);
 
 /**
diff --git a/libpurple/chat.h b/libpurple/chat.h
--- a/libpurple/chat.h
+++ b/libpurple/chat.h
@@ -39,6 +39,7 @@ typedef struct _PurpleChatClass PurpleCh
 #include "blistnode.h"
 #include "group.h"
 #include "purpleaccount.h"
+#include "purpleversion.h"
 
 /**
  * PurpleChat:
@@ -65,7 +66,10 @@ G_BEGIN_DECLS
  * purple_chat_get_type:
  *
  * Returns: The #GType for the #PurpleChat object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_chat_get_type(void);
 
 /**
@@ -99,7 +103,10 @@ const char *purple_chat_get_name(PurpleC
  * Returns the name of the chat
  *
  * Returns:       The first component value.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_chat_get_name_only(PurpleChat *chat);
 
 /**
@@ -108,7 +115,10 @@ const char *purple_chat_get_name_only(Pu
  * @alias:  The alias
  *
  * Sets the alias for a blist chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_set_alias(PurpleChat *chat, const char *alias);
 
 /**
diff --git a/libpurple/circularbuffer.h b/libpurple/circularbuffer.h
--- a/libpurple/circularbuffer.h
+++ b/libpurple/circularbuffer.h
@@ -27,6 +27,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_CIRCULAR_BUFFER (purple_circular_buffer_get_type())
@@ -58,7 +60,10 @@ struct _PurpleCircularBufferClass {
  * actual buffer until data is appended to it.
  *
  * Returns: The new PurpleCircularBuffer.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleCircularBuffer *purple_circular_buffer_new(gsize growsize);
 
 /**
@@ -69,7 +74,10 @@ PurpleCircularBuffer *purple_circular_bu
  *
  * Append data to the PurpleCircularBuffer.  This will grow the internal
  * buffer to fit the added data, if needed.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_circular_buffer_append(PurpleCircularBuffer *buffer, gconstpointer src, gsize len);
 
 /**
@@ -84,7 +92,10 @@ void purple_circular_buffer_append(Purpl
  * more data is available to read.
  *
  * Returns: the number of bytes that can be read from the PurpleCircularBuffer
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gsize purple_circular_buffer_get_max_read(PurpleCircularBuffer *buffer);
 
 /**
@@ -96,7 +107,10 @@ gsize purple_circular_buffer_get_max_rea
  *
  * Returns: TRUE if we successfully marked the bytes as having been read, FALSE
  *         otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_circular_buffer_mark_read(PurpleCircularBuffer *buffer, gsize len);
 
 /**
@@ -106,7 +120,10 @@ gboolean purple_circular_buffer_mark_rea
  *
  * Increases the buffer size by a multiple of grow size, so that it can hold at
  * least 'len' bytes.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_circular_buffer_grow(PurpleCircularBuffer *buffer, gsize len);
 
 /**
@@ -117,7 +134,10 @@ void purple_circular_buffer_grow(PurpleC
  * needed.
  *
  * Returns: The grow size of the buffer.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gsize purple_circular_buffer_get_grow_size(PurpleCircularBuffer *buffer);
 
 /**
@@ -127,7 +147,10 @@ gsize purple_circular_buffer_get_grow_si
  * Returns the number of bytes of this buffer that contain unread data.
  *
  * Returns: The number of bytes that contain unread data.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gsize purple_circular_buffer_get_used(PurpleCircularBuffer *buffer);
 
 /**
@@ -140,7 +163,10 @@ gsize purple_circular_buffer_get_used(Pu
  * call purple_circular_buffer_mark_read() to mark the retrieved data as read.
  *
  * Returns: The output pointer for the buffer.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_circular_buffer_get_output(PurpleCircularBuffer *buffer);
 
 /**
@@ -148,7 +174,10 @@ const gchar *purple_circular_buffer_get_
  * @buffer: The PurpleCircularBuffer to reset.
  *
  * Resets the buffer input and output pointers to the start of the buffer.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_circular_buffer_reset(PurpleCircularBuffer *buffer);
 
 G_END_DECLS
diff --git a/libpurple/connection.h b/libpurple/connection.h
--- a/libpurple/connection.h
+++ b/libpurple/connection.h
@@ -34,6 +34,8 @@
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_CONNECTION  purple_connection_get_type()
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleConnection, purple_connection, PURPLE,
                          CONNECTION, GObject)
 
@@ -328,7 +330,10 @@ PurpleAccount *purple_connection_get_acc
  * Returns the protocol managing a connection.
  *
  * Returns: (transfer none): The protocol.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleProtocol *purple_connection_get_protocol(PurpleConnection *gc);
 
 /**
@@ -523,7 +528,10 @@ GList *purple_connections_get_all(void);
  * Checks if at least one account is online.
  *
  * Returns: %TRUE if at least one account is online.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_connections_is_online(void);
 
 /**************************************************************************/
@@ -534,7 +542,10 @@ gboolean purple_connections_is_online(vo
  * purple_connection_ui_ops_get_type:
  *
  * Returns: The #GType for the #PurpleConnectionUiOps boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_connection_ui_ops_get_type(void);
 
 /**
diff --git a/libpurple/contact.h b/libpurple/contact.h
--- a/libpurple/contact.h
+++ b/libpurple/contact.h
@@ -39,6 +39,7 @@ typedef struct _PurpleMetaContactClass P
 #include "countingnode.h"
 #include "group.h"
 #include "purpleaccount.h"
+#include "purpleversion.h"
 
 /**
  * PurpleMetaContact:
@@ -72,7 +73,10 @@ G_BEGIN_DECLS
  * purple_meta_contact_get_type:
  *
  * Returns: The #GType for the #PurpleMetaContact object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_meta_contact_get_type(void);
 
 /**
@@ -81,7 +85,10 @@ GType purple_meta_contact_get_type(void)
  * Creates a new contact
  *
  * Returns:       A new contact struct
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleMetaContact *purple_meta_contact_new(void);
 
 /**
@@ -91,7 +98,10 @@ PurpleMetaContact *purple_meta_contact_n
  * Gets the PurpleGroup from a PurpleMetaContact
  *
  * Returns: (transfer none): The group.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleGroup *purple_meta_contact_get_group(const PurpleMetaContact *contact);
 
 /**
@@ -101,7 +111,10 @@ PurpleGroup *purple_meta_contact_get_gro
  * Returns the highest priority buddy for a given contact.
  *
  * Returns: (transfer none): The highest priority buddy.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBuddy *purple_meta_contact_get_priority_buddy(PurpleMetaContact *contact);
 
 /**
@@ -110,7 +123,10 @@ PurpleBuddy *purple_meta_contact_get_pri
  * @alias:    The alias
  *
  * Sets the alias for a contact.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_meta_contact_set_alias(PurpleMetaContact *contact, const char *alias);
 
 /**
@@ -120,7 +136,10 @@ void purple_meta_contact_set_alias(Purpl
  * Gets the alias for a contact.
  *
  * Returns:  The alias, or NULL if it is not set.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_meta_contact_get_alias(PurpleMetaContact *contact);
 
 /**
@@ -131,7 +150,10 @@ const char *purple_meta_contact_get_alia
  * Determines whether an account owns any buddies in a given contact
  *
  * Returns: TRUE if there are any buddies from account in the contact, or FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_meta_contact_on_account(PurpleMetaContact *contact, PurpleAccount *account);
 
 /**
@@ -140,7 +162,10 @@ gboolean purple_meta_contact_on_account(
  *
  * Invalidates the priority buddy so that the next call to
  * purple_meta_contact_get_priority_buddy recomputes it.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_meta_contact_invalidate_priority_buddy(PurpleMetaContact *contact);
 
 /**
@@ -151,7 +176,10 @@ void purple_meta_contact_invalidate_prio
  * Merges two contacts
  *
  * All of the buddies from source will be moved to target
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_meta_contact_merge(PurpleMetaContact *source, PurpleBlistNode *node);
 
 
diff --git a/libpurple/conversations.h b/libpurple/conversations.h
--- a/libpurple/conversations.h
+++ b/libpurple/conversations.h
@@ -27,6 +27,7 @@
 #define PURPLE_CONVERSATIONS_H
 
 #include "purpleconversation.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -48,7 +49,10 @@ void purple_conversations_set_ui_ops(Pur
  * Gets the default conversation UI operations structure.
  *
  * Returns:  The UI conversation operations structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversationUiOps *purple_conversations_get_ui_ops(void);
 
 /**
diff --git a/libpurple/countingnode.h b/libpurple/countingnode.h
--- a/libpurple/countingnode.h
+++ b/libpurple/countingnode.h
@@ -39,6 +39,7 @@
 #define PURPLE_IS_COUNTING_NODE_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_COUNTING_NODE))
 #define PURPLE_COUNTING_NODE_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_COUNTING_NODE, PurpleCountingNodeClass))
 
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef struct _PurpleCountingNode PurpleCountingNode;
 typedef struct _PurpleCountingNodeClass PurpleCountingNodeClass;
 
diff --git a/libpurple/eventloop.h b/libpurple/eventloop.h
--- a/libpurple/eventloop.h
+++ b/libpurple/eventloop.h
@@ -29,6 +29,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 /**
  * PurpleInputCondition:
  * @PURPLE_INPUT_READ:  A read condition.
@@ -93,7 +95,10 @@ guint purple_input_add(int fd, PurpleInp
  * systems pipe() is used.
  *
  * Returns: 0 on success, -1 on error.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int
 purple_input_pipe(int pipefd[2]);
 
diff --git a/libpurple/group.h b/libpurple/group.h
--- a/libpurple/group.h
+++ b/libpurple/group.h
@@ -41,6 +41,7 @@ typedef struct _PurpleGroupClass PurpleG
 #include "blistnode.h"
 #include "buddyicon.h"
 #include "purpleaccount.h"
+#include "purpleversion.h"
 #include "status.h"
 
 /**************************************************************************/
@@ -79,7 +80,10 @@ G_BEGIN_DECLS
  * purple_group_get_type:
  *
  * Returns: The #GType for the #PurpleGroup object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_group_get_type(void);
 
 /**
@@ -123,7 +127,10 @@ gboolean purple_group_on_account(PurpleG
  * @name:  The name of the group.
  *
  * Sets the name of a group.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_group_set_name(PurpleGroup *group, const char *name);
 
 /**
diff --git a/libpurple/image-store.h b/libpurple/image-store.h
--- a/libpurple/image-store.h
+++ b/libpurple/image-store.h
@@ -39,6 +39,7 @@
  */
 
 #include "image.h"
+#include "purpleversion.h"
 
 /**
  * PURPLE_IMAGE_STORE_PROTOCOL:
@@ -62,7 +63,10 @@ G_BEGIN_DECLS
  * use #purple_image_store_add_weak.
  *
  * Returns: the unique identifier for the @image.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint
 purple_image_store_add(PurpleImage *image);
 
@@ -76,7 +80,10 @@ purple_image_store_add(PurpleImage *imag
  * If the @image is already in the store, it will return its current id.
  *
  * Returns: the unique identifier for the @image.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint
 purple_image_store_add_weak(PurpleImage *image);
 
@@ -93,7 +100,10 @@ purple_image_store_add_weak(PurpleImage 
  * management, implement it on your own.
  *
  * Returns: the unique identifier for the @image.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint
 purple_image_store_add_temporary(PurpleImage *image);
 
@@ -105,7 +115,10 @@ purple_image_store_add_temporary(PurpleI
  *
  * Returns: (transfer none): the image referenced by @id, or %NULL if it
  *          doesn't exists.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleImage *
 purple_image_store_get(guint id);
 
@@ -121,7 +134,10 @@ purple_image_store_get(guint id);
  *
  * Returns: (transfer none): the image referenced by @uri, or %NULL if it
  *          doesn't point to any valid image.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleImage *
 purple_image_store_get_from_uri(const gchar *uri);
 
@@ -134,7 +150,10 @@ purple_image_store_get_from_uri(const gc
  *
  * Returns: (transfer full): the URI for the @image. Should be #g_free'd when
  * you done using it.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gchar *
 purple_image_store_get_uri(PurpleImage *image);
 
@@ -142,7 +161,10 @@ purple_image_store_get_uri(PurpleImage *
  * _purple_image_store_init: (skip)
  *
  * Initializes the image store subsystem.
+ *
+ * Since: 3.0.0
  */
+G_GNUC_INTERNAL
 void
 _purple_image_store_init(void);
 
@@ -150,7 +172,10 @@ void
  * _purple_image_store_uninit: (skip)
  *
  * Uninitializes the image store subsystem.
+ *
+ * Since: 3.0.0
  */
+G_GNUC_INTERNAL
 void
 _purple_image_store_uninit(void);
 
diff --git a/libpurple/image.h b/libpurple/image.h
--- a/libpurple/image.h
+++ b/libpurple/image.h
@@ -28,6 +28,8 @@
 
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_IMAGE  purple_image_get_type()
 
 struct _PurpleImageClass {
@@ -52,8 +54,10 @@ G_BEGIN_DECLS
  * This class also provides certain file-related features, like: friendly
  * filenames (not necessarily real filename for displaying); remote images
  * (which data is not yet loaded) or guessing file format from its header.
+ *
+ * Since: 3.0.0
  */
-
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleImage, purple_image, PURPLE, IMAGE, GObject)
 
 /**
@@ -63,7 +67,10 @@ G_DECLARE_DERIVABLE_TYPE(PurpleImage, pu
  * Loads a raw image data as a new #PurpleImage object.
  *
  * Returns: the new #PurpleImage.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleImage *purple_image_new_from_bytes(GBytes *bytes);
 
 /**
@@ -77,7 +84,10 @@ PurpleImage *purple_image_new_from_bytes
  * you access its data.
  *
  * Returns: the new #PurpleImage.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleImage *purple_image_new_from_file(const gchar *path, GError **error);
 
 /**
@@ -91,7 +101,10 @@ PurpleImage *purple_image_new_from_file(
  * to g_memdup2() it first.
  *
  * Returns: the new #PurpleImage.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleImage *purple_image_new_from_data(const guint8 *data, gsize length);
 
 /**
@@ -105,7 +118,10 @@ PurpleImage *purple_image_new_from_data(
  * to g_memdup2() it first.
  *
  * Returns: the new #PurpleImage.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleImage *purple_image_new_take_data(guint8 *data, gsize length);
 
 /**
@@ -116,7 +132,10 @@ PurpleImage *purple_image_new_take_data(
  * Saves an @image to the disk.
  *
  * Returns: %TRUE if succeeded, %FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_image_save(PurpleImage *image, const gchar *path);
 
 /**
@@ -126,7 +145,10 @@ gboolean purple_image_save(PurpleImage *
  * Returns a new reference to the #GBytes that contains the image data.
  *
  * Returns: (transfer full): A #GBytes containing the image data.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GBytes *purple_image_get_contents(PurpleImage *image);
 
 
@@ -138,7 +160,10 @@ GBytes *purple_image_get_contents(Purple
  * really backed by an existing file. In the other case it returns %NULL.
  *
  * Returns: the physical path of the @image, or %NULL.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_image_get_path(PurpleImage *image);
 
 /**
@@ -148,7 +173,10 @@ const gchar *purple_image_get_path(Purpl
  * Returns the size of @image's data.
  *
  * Returns: the size of data, or 0 in case of failure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gsize purple_image_get_data_size(PurpleImage *image);
 
 /**
@@ -158,7 +186,10 @@ gsize purple_image_get_data_size(PurpleI
  * Returns the pointer to the buffer containing image data.
  *
  * Returns: (transfer none): the @image data.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gconstpointer purple_image_get_data(PurpleImage *image);
 
 /**
@@ -168,7 +199,10 @@ gconstpointer purple_image_get_data(Purp
  * Guesses the @image format based on its contents.
  *
  * Returns: (transfer none): the file extension suitable for @image format.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_image_get_extension(PurpleImage *image);
 
 /**
@@ -178,7 +212,10 @@ const gchar *purple_image_get_extension(
  * Guesses the @image mime-type based on its contents.
  *
  * Returns: (transfer none): the mime-type suitable for @image format.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_image_get_mimetype(PurpleImage *image);
 
 /**
@@ -190,7 +227,10 @@ const gchar *purple_image_get_mimetype(P
  * is SHA-1, because it may change in the future.
  *
  * Returns: (transfer none): the generated file name.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_image_generate_filename(PurpleImage *image);
 
 /**
@@ -204,7 +244,10 @@ const gchar *purple_image_generate_filen
  *
  * The provided @filename may either be a full path, or contain
  * filesystem-unfriendly characters, because it will be reformatted.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_image_set_friendly_filename(PurpleImage *image, const gchar *filename);
 
 /**
@@ -219,7 +262,10 @@ void purple_image_set_friendly_filename(
  * #purple_image_generate_filename.
  *
  * Returns: (transfer none): the friendly filename.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_image_get_friendly_filename(PurpleImage *image);
 
 G_END_DECLS
diff --git a/libpurple/media.h b/libpurple/media.h
--- a/libpurple/media.h
+++ b/libpurple/media.h
@@ -116,7 +116,10 @@ PurpleAccount *purple_media_get_account(
  * Gets the protocol data from the media session.
  *
  * Returns: The protocol data retrieved.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer purple_media_get_protocol_data(PurpleMedia *media);
 
 /**
@@ -125,7 +128,10 @@ gpointer purple_media_get_protocol_data(
  * @protocol_data: The data to set on the media session.
  *
  * Sets the protocol data on the media session.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_media_set_protocol_data(PurpleMedia *media, gpointer protocol_data);
 
 /**
diff --git a/libpurple/media/enum-types.h b/libpurple/media/enum-types.h
--- a/libpurple/media/enum-types.h
+++ b/libpurple/media/enum-types.h
@@ -28,6 +28,8 @@
 
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 /**
@@ -279,7 +281,10 @@ GType purple_media_session_type_get_type
  * Gets the type of the state enum
  *
  * Returns: The state enum's GType
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_media_state_get_type(void);
 
 G_END_DECLS
diff --git a/libpurple/notify.h b/libpurple/notify.h
--- a/libpurple/notify.h
+++ b/libpurple/notify.h
@@ -466,14 +466,20 @@ void *purple_notify_userinfo(PurpleConne
  * purple_notify_search_button_get_type:
  *
  * Returns: The #GType for #PurpleNotifiySearchButton boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_notify_search_button_get_type(void);
 
 /**
  * purple_notify_user_info_get_type:
  *
  * Returns: The #GType for the #PurpleNotifyUserInfo boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_notify_user_info_get_type(void);
 
 /**
@@ -538,7 +544,10 @@ char *purple_notify_user_info_get_text_w
  *
  * Add a label/value pair to a #PurpleNotifyUserInfo object.
  * #PurpleNotifyUserInfo keeps track of the order in which pairs are added.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notify_user_info_add_pair_html(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
 
 /**
@@ -575,7 +584,10 @@ void purple_notify_user_info_add_pair_pl
  *
  * Like purple_notify_user_info_add_pair_html(), but the pair is inserted
  * at the beginning of the list.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notify_user_info_prepend_pair_html(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
 
 /**
@@ -734,7 +746,10 @@ void purple_notify_user_info_entry_set_v
  * Get the type of a PurpleNotifyUserInfoEntry
  *
  * Returns:  The PurpleNotifyUserInfoEntryType
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleNotifyUserInfoEntryType purple_notify_user_info_entry_get_entry_type(
 		PurpleNotifyUserInfoEntry *user_info_entry);
 
@@ -744,7 +759,10 @@ PurpleNotifyUserInfoEntryType purple_not
  * @type:             The PurpleNotifyUserInfoEntryType
  *
  * Set the type of a PurpleNotifyUserInfoEntry
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notify_user_info_entry_set_entry_type(
 		PurpleNotifyUserInfoEntry *user_info_entry, PurpleNotifyUserInfoEntryType type);
 
@@ -770,7 +788,10 @@ void *purple_notify_uri(void *handle, co
  * Checks, if passed UI handle is valid.
  *
  * Returns: TRUE, if handle is valid, FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean
 purple_notify_is_valid_ui_handle(void *ui_handle, PurpleNotifyType *type);
 
@@ -847,7 +868,10 @@ void purple_notify_close_with_handle(voi
  * purple_notify_ui_ops_get_type:
  *
  * Returns: The #GType for the #PurpleNotifyUiOps boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_notify_ui_ops_get_type(void);
 
 /**
diff --git a/libpurple/plugins.h b/libpurple/plugins.h
--- a/libpurple/plugins.h
+++ b/libpurple/plugins.h
@@ -47,6 +47,7 @@ typedef GPluginPlugin PurplePlugin;
 typedef GPluginPluginInterface PurplePluginInterface;
 
 #include "purpleplugininfo.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -103,7 +104,10 @@ gboolean purple_plugin_is_loaded(PurpleP
  * is to avoid managing the reference counts everywhere in our codebase
  * where we use the plugin info. The plugin info instance is guaranteed to
  * exist as long as the plugin exists.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePluginInfo *purple_plugin_get_info(PurplePlugin *plugin);
 
 /**
@@ -128,7 +132,10 @@ void purple_plugin_disable(PurplePlugin 
  * plugins, loaders etc.
  *
  * Returns: %TRUE if the plugin is an internal plugin, %FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_plugin_is_internal(PurplePlugin *plugin);
 
 /**
@@ -139,7 +146,10 @@ gboolean purple_plugin_is_internal(Purpl
  *
  * Returns: (element-type PurplePlugin) (transfer none): The list of a plugins that depend on the specified
  *                           plugin.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GSList *purple_plugin_get_dependent_plugins(PurplePlugin *plugin);
 
 /**************************************************************************/
@@ -154,7 +164,10 @@ GSList *purple_plugin_get_dependent_plug
  * Returns: (element-type PurplePlugin) (transfer full): A list of all plugins.
  * 	       The list is owned by the caller, and must be
  *         g_list_free()d to avoid leaking the nodes.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_plugins_find_all(void);
 
 /**
@@ -181,7 +194,10 @@ void purple_plugins_add_search_path(cons
  * that are to be auto-loaded.
  *
  * See purple_plugins_add_search_path().
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_plugins_refresh(void);
 
 /**
@@ -191,7 +207,10 @@ void purple_plugins_refresh(void);
  * Finds a plugin with the specified plugin ID.
  *
  * Returns: (transfer none): The plugin if found, or %NULL if not found.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePlugin *purple_plugins_find_plugin(const gchar *id);
 
 /**
@@ -201,7 +220,10 @@ PurplePlugin *purple_plugins_find_plugin
  * Finds a plugin with the specified filename (filename with a path).
  *
  * Returns: (transfer none): The plugin if found, or %NULL if not found.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePlugin *purple_plugins_find_by_filename(const char *filename);
 
 /**
diff --git a/libpurple/prefs.h b/libpurple/prefs.h
--- a/libpurple/prefs.h
+++ b/libpurple/prefs.h
@@ -290,7 +290,10 @@ gboolean purple_prefs_exists(const char 
  * Get pref type
  *
  * Returns: The type of the pref
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePrefType purple_prefs_get_pref_type(const char *name);
 
 /**
diff --git a/libpurple/protocols.h b/libpurple/protocols.h
--- a/libpurple/protocols.h
+++ b/libpurple/protocols.h
@@ -54,7 +54,10 @@ G_BEGIN_DECLS
  * Notifies Purple that a buddy's idle state and time have changed.
  *
  * This is meant to be called from protocols.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_got_user_idle(PurpleAccount *account, const char *name,
                                    gboolean idle, time_t idle_time);
 
@@ -68,7 +71,10 @@ void purple_protocol_got_user_idle(Purpl
  * Notifies Purple that a buddy's status has been activated.
  *
  * This is meant to be called from protocols.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_got_user_status(PurpleAccount *account, const char *name,
                                      const char *status_id, ...)
                                      G_GNUC_NULL_TERMINATED;
@@ -99,7 +105,10 @@ void purple_protocol_got_user_status_wit
  * Notifies libpurple that a buddy's status has been deactivated
  *
  * This is meant to be called from protocols.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_got_user_status_deactive(PurpleAccount *account,
                                               const char *name,
                                               const char *status_id);
@@ -112,7 +121,10 @@ void purple_protocol_got_user_status_dea
  *                   (in the case of independent statuses).
  *
  * Informs the server that our account's status changed.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_change_account_status(PurpleAccount *account,
                                            PurpleStatus *old_status,
                                            PurpleStatus *new_status);
@@ -125,7 +137,10 @@ void purple_protocol_change_account_stat
  * Retrieves the list of stock status types from a protocol.
  *
  * Returns: (transfer full) (element-type PurpleStatus): List of statuses
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_get_statuses(PurpleAccount *account,
                                     PurplePresence *presence);
 
@@ -137,7 +152,10 @@ GList *purple_protocol_get_statuses(Purp
  * Determines if the contact supports the given media session type.
  *
  * Returns: The media caps the contact supports.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleMediaCaps purple_protocol_get_media_caps(PurpleAccount *account,
                                                const char *who);
 
@@ -151,7 +169,10 @@ PurpleMediaCaps purple_protocol_get_medi
  *
  * Returns: TRUE if the call succeeded else FALSE. (Doesn't imply the media
  *          session or stream will be successfully created)
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_initiate_media(PurpleAccount *account,
                                         const char *who,
                                         PurpleMediaSessionType type);
@@ -164,7 +185,10 @@ gboolean purple_protocol_initiate_media(
  * Signals that the protocol received capabilities for the given contact.
  *
  * This function is intended to be used only by protocols.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_got_media_caps(PurpleAccount *account, const char *who);
 
 G_END_DECLS
diff --git a/libpurple/proxy.h b/libpurple/proxy.h
--- a/libpurple/proxy.h
+++ b/libpurple/proxy.h
@@ -32,6 +32,7 @@
 #include "eventloop.h"
 #include "purpleaccount.h"
 #include "purpleproxyinfo.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -97,7 +98,10 @@ PurpleProxyInfo *purple_proxy_get_setup(
  * Returns: (transfer full): NULL if there was an error with the
  *         account's (or system) proxy settings, or a reference to
  *         a #GProxyResolver on success.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GProxyResolver *purple_proxy_get_proxy_resolver(PurpleAccount *account,
 		GError **error);
 
diff --git a/libpurple/purpleaccount.h b/libpurple/purpleaccount.h
--- a/libpurple/purpleaccount.h
+++ b/libpurple/purpleaccount.h
@@ -53,7 +53,7 @@ G_BEGIN_DECLS
  * account. User interfaces typically allow users to create these in a dialog
  * or wizard.
  */
-
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleAccount, purple_account, PURPLE, ACCOUNT,
                      PurpleContactInfo)
 
@@ -617,7 +617,10 @@ gboolean purple_account_supports_offline
  *          of the current error, or %NULL if there is no current error.  This
  *          pointer is guaranteed to remain valid until the @ref
  *          account-error-changed signal is emitted for @account.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const PurpleConnectionErrorInfo *purple_account_get_error(PurpleAccount *account);
 
 /**
diff --git a/libpurple/purpleaccountoption.h b/libpurple/purpleaccountoption.h
--- a/libpurple/purpleaccountoption.h
+++ b/libpurple/purpleaccountoption.h
@@ -175,7 +175,10 @@ void purple_account_option_set_default_s
  * Sets the masking for an account option. Setting this to %TRUE acts
  * as a hint to the UI that the option's value should be obscured from
  * view, like a password.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_option_string_set_masked(PurpleAccountOption *option, gboolean masked);
 
 /**
@@ -187,7 +190,10 @@ void purple_account_option_string_set_ma
  *
  * The list passed will be owned by the account option, and the
  * strings inside will be freed automatically.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_option_string_set_hints(PurpleAccountOption *option, GSList *hints);
 
 /**
@@ -223,7 +229,10 @@ void purple_account_option_add_list_item
  * Returns the specified account option's type.
  *
  * Returns: The account option's type.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePrefType purple_account_option_get_pref_type(const PurpleAccountOption *option);
 
 /**
@@ -297,7 +306,10 @@ const gchar *purple_account_option_get_d
  * as a '*' (for example).
  *
  * Returns: %TRUE if the option's value should be obscured.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_account_option_string_get_masked(const PurpleAccountOption *option);
 
 /**
@@ -307,7 +319,10 @@ gboolean purple_account_option_string_ge
  * Returns the list of hints for an account option.
  *
  * Returns: (element-type utf8) (transfer none): A list of hints.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const GSList *purple_account_option_string_get_hints(const PurpleAccountOption *option);
 
 /**
diff --git a/libpurple/purpleaccountpresence.h b/libpurple/purpleaccountpresence.h
--- a/libpurple/purpleaccountpresence.h
+++ b/libpurple/purpleaccountpresence.h
@@ -37,9 +37,13 @@ G_BEGIN_DECLS
  *
  * A #PurpleAccountPresence represent the #PurplePresence for a specific
  * #PurpleAccount.
+ *
+ * Since: 3.0.0
  */
 
 #define PURPLE_TYPE_ACCOUNT_PRESENCE (purple_account_presence_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleAccountPresence, purple_account_presence, PURPLE,
                      ACCOUNT_PRESENCE, PurplePresence)
 
@@ -63,7 +67,10 @@ PurpleAccountPresence *purple_account_pr
  * Returns an account presence's account.
  *
  * Returns: (transfer none): The presence's account.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_account_presence_get_account(PurpleAccountPresence *presence);
 
 G_END_DECLS
diff --git a/libpurple/purpleaccountusersplit.h b/libpurple/purpleaccountusersplit.h
--- a/libpurple/purpleaccountusersplit.h
+++ b/libpurple/purpleaccountusersplit.h
@@ -45,6 +45,7 @@ typedef struct _PurpleAccountUserSplit	P
 
 G_BEGIN_DECLS
 
+PURPLE_AVAILABLE_IN_3_0
 GType purple_account_user_split_get_type(void);
 
 /**
@@ -139,7 +140,10 @@ void purple_account_user_split_set_rever
  * in configuration dialog.
  *
  * Returns: %TRUE, if the split is constant.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_account_user_split_is_constant(PurpleAccountUserSplit *split);
 
 /**
@@ -148,7 +152,10 @@ gboolean purple_account_user_split_is_co
  * @constant: %TRUE, if the split is a constant part.
  *
  * Sets the constant parameter of account split.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_user_split_set_constant(PurpleAccountUserSplit *split, gboolean constant);
 
 G_END_DECLS
diff --git a/libpurple/purpleattachment.h b/libpurple/purpleattachment.h
--- a/libpurple/purpleattachment.h
+++ b/libpurple/purpleattachment.h
@@ -38,8 +38,11 @@ G_BEGIN_DECLS
  * PurpleAttachment:
  *
  * #PurpleAttachment represents a file attached to a #PurpleMessage.
+ *
+ * Since: 3.0.0
  */
 
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleAttachment, purple_attachment, PURPLE, ATTACHMENT, GObject)
 
 /**
diff --git a/libpurple/purplebuddypresence.h b/libpurple/purplebuddypresence.h
--- a/libpurple/purplebuddypresence.h
+++ b/libpurple/purplebuddypresence.h
@@ -37,9 +37,13 @@ G_BEGIN_DECLS
  *
  * A #PurpleBuddyPresence represent the #PurplePresence for a specific
  * #PurpleBuddy.
+ *
+ * Since: 3.0.0
  */
 
 #define PURPLE_TYPE_BUDDY_PRESENCE (purple_buddy_presence_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleBuddyPresence, purple_buddy_presence, PURPLE,
                      BUDDY_PRESENCE, PurplePresence)
 
@@ -63,7 +67,10 @@ PurpleBuddyPresence *purple_buddy_presen
  * Returns the buddy presence's buddy.
  *
  * Returns: (transfer none): The presence's buddy.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBuddy *purple_buddy_presence_get_buddy(PurpleBuddyPresence *presence);
 
 /**
@@ -76,7 +83,10 @@ PurpleBuddy *purple_buddy_presence_get_b
  * Returns: -1 if @buddy_presence1 is more available than @buddy_presence2.
  *           0 if @buddy_presence1 is equal to @buddy_presence2.
  *           1 if @buddy_presence1 is less available than @buddy_presence2.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_buddy_presence_compare(PurpleBuddyPresence *buddy_presence1,
                                    PurpleBuddyPresence *buddy_presence2);
 
diff --git a/libpurple/purplechatconversation.h b/libpurple/purplechatconversation.h
--- a/libpurple/purplechatconversation.h
+++ b/libpurple/purplechatconversation.h
@@ -40,6 +40,7 @@ typedef struct _PurpleChatConversationCl
 #include "purplechatuser.h"
 #include "purpleconversation.h"
 #include "purpleimconversation.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -68,7 +69,10 @@ struct _PurpleChatConversationClass {
  * purple_chat_conversation_get_type:
  *
  * Returns: The #GType for the ChatConversation object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_chat_conversation_get_type(void);
 
 /**
@@ -80,7 +84,10 @@ GType purple_chat_conversation_get_type(
  * Creates a new chat conversation.
  *
  * Returns: The new conversation.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_chat_conversation_new(PurpleAccount *account, const gchar *name);
 
 /**
@@ -93,7 +100,10 @@ PurpleConversation *purple_chat_conversa
  * Returns: (element-type PurpleChatUser) (transfer container):
  *          The list of users. Use g_list_free() when done
  *          using the list.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_chat_conversation_get_users(PurpleChatConversation *chat);
 
 /**
@@ -103,7 +113,10 @@ GList *purple_chat_conversation_get_user
  * Returns count of users in the chat room.
  *
  * Returns: The count of users in the chat room.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint purple_chat_conversation_get_users_count(PurpleChatConversation *chat);
 
 /**
@@ -113,7 +126,10 @@ guint purple_chat_conversation_get_users
  * @topic: The topic.
  *
  * Sets the chat room's topic.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_set_topic(PurpleChatConversation *chat, const gchar *who, const gchar *topic);
 
 /**
@@ -123,7 +139,10 @@ void purple_chat_conversation_set_topic(
  * Returns the chat room's topic.
  *
  * Returns: The chat's topic.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_conversation_get_topic(PurpleChatConversation *chat);
 
 /**
@@ -133,7 +152,10 @@ const gchar *purple_chat_conversation_ge
  * Returns who set the chat room's topic.
  *
  * Returns: Who set the topic.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_conversation_get_topic_who(PurpleChatConversation *chat);
 
 /**
@@ -142,7 +164,10 @@ const gchar *purple_chat_conversation_ge
  * @id: The ID.
  *
  * Sets the chat room's ID.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_set_id(PurpleChatConversation *chat, gint id);
 
 /**
@@ -152,7 +177,10 @@ void purple_chat_conversation_set_id(Pur
  * Gets the chat room's ID.
  *
  * Returns: The ID.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_chat_conversation_get_id(PurpleChatConversation *chat);
 
 /**
@@ -164,7 +192,10 @@ gint purple_chat_conversation_get_id(Pur
  * @new_arrival: Decides whether or not to show a join notice.
  *
  * Adds a user to a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_add_user(PurpleChatConversation *chat, const gchar *user, const gchar *extra_msg, PurpleChatUserFlags flags, gboolean new_arrival);
 
 /**
@@ -186,7 +217,10 @@ void purple_chat_conversation_add_user(P
  *
  * The data is copied from @users, @extra_msgs, and @flags, so it is up to
  * the caller to free this list after calling this function.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_add_users(PurpleChatConversation *chat, GList *users, GList *extra_msgs, GList *flags, gboolean new_arrivals);
 
 /**
@@ -196,7 +230,10 @@ void purple_chat_conversation_add_users(
  * @new_user: The new username.
  *
  * Renames a user in a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_rename_user(PurpleChatConversation *chat, const gchar *old_user, const gchar *new_user);
 
 /**
@@ -208,7 +245,10 @@ void purple_chat_conversation_rename_use
  * Removes a user from a chat, optionally with a reason.
  *
  * It is up to the developer to free this list after calling this function.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_remove_user(PurpleChatConversation *chat, const gchar *user, const gchar *reason);
 
 /**
@@ -218,7 +258,10 @@ void purple_chat_conversation_remove_use
  * @reason: The optional reason given for the removal. Can be %NULL.
  *
  * Removes a list of users from a chat, optionally with a single reason.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_remove_users(PurpleChatConversation *chat, GList *users, const gchar *reason);
 
 /**
@@ -229,7 +272,10 @@ void purple_chat_conversation_remove_use
  * Checks if a user is in a chat
  *
  * Returns: %TRUE if the user is in the chat, %FALSE if not
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_chat_conversation_has_user(PurpleChatConversation *chat, const gchar *user);
 
 /**
@@ -237,7 +283,10 @@ gboolean purple_chat_conversation_has_us
  * @chat: The chat.
  *
  * Clears all users from a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_clear_users(PurpleChatConversation *chat);
 
 /**
@@ -246,7 +295,10 @@ void purple_chat_conversation_clear_user
  * @nick: The nick.
  *
  * Sets your nickname (used for highlighting) for a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_set_nick(PurpleChatConversation *chat, const gchar *nick);
 
 /**
@@ -256,7 +308,10 @@ void purple_chat_conversation_set_nick(P
  * Gets your nickname (used for highlighting) for a chat.
  *
  * Returns: The nick.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_conversation_get_nick(PurpleChatConversation *chat);
 
 /**
@@ -265,7 +320,10 @@ const gchar *purple_chat_conversation_ge
  *
  * Lets the core know we left a chat, without destroying it.
  * Called from purple_serv_got_chat_left().
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_leave(PurpleChatConversation *chat);
 
 /**
@@ -277,7 +335,10 @@ void purple_chat_conversation_leave(Purp
  *
  * Returns: (transfer none): The #PurpleChatUser with the name referred by
  *          @name.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleChatUser *purple_chat_conversation_find_user(PurpleChatConversation *chat, const gchar *name);
 
 /**
@@ -291,7 +352,10 @@ PurpleChatUser *purple_chat_conversation
  * Invite a user to a chat.
  * The user will be prompted to enter the user's name or a message if one is
  * not given.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_invite_user(PurpleChatConversation *chat, const gchar *user, const gchar *message, gboolean confirm);
 
 /**
@@ -301,7 +365,10 @@ void purple_chat_conversation_invite_use
  * Gets whether we're no longer in this chat, and just left the window open.
  *
  * Returns: %TRUE if we left the chat already, %FALSE if we're still there.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_chat_conversation_has_left(PurpleChatConversation *chat);
 
 G_END_DECLS
diff --git a/libpurple/purplechatuser.h b/libpurple/purplechatuser.h
--- a/libpurple/purplechatuser.h
+++ b/libpurple/purplechatuser.h
@@ -79,7 +79,10 @@ G_BEGIN_DECLS
  * Creates a new chat user
  *
  * Returns: The new chat user
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleChatUser *purple_chat_user_new(PurpleChatConversation *chat,
                                      const gchar *name,
                                      const gchar *alias,
@@ -131,7 +134,10 @@ const gchar *purple_chat_user_get_alias(
  * Get the name of a chat user.
  *
  * Returns: The name of the chat user.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_user_get_name(PurpleChatUser *chat_user);
 
 /**
@@ -140,7 +146,10 @@ const gchar *purple_chat_user_get_name(P
  * @flags: The new flags.
  *
  * Set the flags of a chat user.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_user_set_flags(PurpleChatUser *chat_user,
                                 PurpleChatUserFlags flags);
 
@@ -179,7 +188,10 @@ gboolean purple_chat_user_is_buddy(Purpl
  * first, 0 if sorted equally, and 1 if @a should be sorted after @b.
  *
  * Returns: The sorting order of @a and @b.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_chat_user_compare(PurpleChatUser *a, PurpleChatUser *b);
 
 G_END_DECLS
diff --git a/libpurple/purpleconnectionerrorinfo.h b/libpurple/purpleconnectionerrorinfo.h
--- a/libpurple/purpleconnectionerrorinfo.h
+++ b/libpurple/purpleconnectionerrorinfo.h
@@ -125,6 +125,8 @@ typedef struct
 
 
 #define PURPLE_TYPE_CONNECTION_ERROR_INFO (purple_connection_error_info_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 GType purple_connection_error_info_get_type(void);
 
 /**
diff --git a/libpurple/purplecontactinfo.h b/libpurple/purplecontactinfo.h
--- a/libpurple/purplecontactinfo.h
+++ b/libpurple/purplecontactinfo.h
@@ -34,6 +34,8 @@
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_CONTACT_INFO (purple_contact_info_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleContactInfo, purple_contact_info, PURPLE,
                          CONTACT_INFO, GObject)
 
@@ -80,6 +82,8 @@ struct _PurpleContactInfoClass {
  * The information about a contact. This information is used everywhere you
  * need to refer to a user. Be it a chat, an direct message, a file transfer,
  * etc.
+ *
+ * Since: 3.0.0
  */
 
 /**
diff --git a/libpurple/purpleconversation.h b/libpurple/purpleconversation.h
--- a/libpurple/purpleconversation.h
+++ b/libpurple/purpleconversation.h
@@ -241,7 +241,10 @@ PurpleAccount *purple_conversation_get_a
  * Returns the specified conversation's purple_connection.
  *
  * Returns: (transfer none): The conversation's purple_connection.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConnection *purple_conversation_get_connection(PurpleConversation *conv);
 
 /**
@@ -300,7 +303,10 @@ const char *purple_conversation_get_name
  * @msg:  The message to write.
  *
  * Writes to a chat or an IM.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_write_message(PurpleConversation *conv, PurpleMessage *msg);
 
 /**
@@ -309,8 +315,11 @@ void purple_conversation_write_message(P
  * @message: The message to write.
  * @flags:   The message flags (you don't need to set %PURPLE_MESSAGE_SYSTEM.
  *
- * Wites a system message to a chat or an IM.
+ * Writes a system message to a chat or an IM.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_write_system_message(PurpleConversation *conv, const gchar *message, PurpleMessageFlags flags);
 
 /**
@@ -320,7 +329,10 @@ void purple_conversation_write_system_me
  *
  * Sends a message to this conversation. This function calls
  * purple_conversation_send_with_flags() with no additional flags.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_send(PurpleConversation *conv, const gchar *message);
 
 /**
@@ -331,7 +343,10 @@ void purple_conversation_send(PurpleConv
  *           PURPLE_MESSAGE_SEND.
  *
  * Sends a message to this conversation with specified flags.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_send_with_flags(PurpleConversation *conv, const gchar *message, PurpleMessageFlags flags);
 
 /**
@@ -383,7 +398,10 @@ void purple_conversation_update(PurpleCo
  * hasn't explicitly and knowingly caused a message to be sent.
  * The confirmation ensures that the user isn't sending a
  * message by mistake.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_send_confirm(PurpleConversation *conv, const gchar *message);
 
 /**
@@ -412,7 +430,10 @@ GList * purple_conversation_get_extended
  * the error another way (purple_notify_error, most likely)
  *
  * Returns:        TRUE if the error was presented, else FALSE
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_present_error(const gchar *who, PurpleAccount *account, const gchar *what);
 
 /**
diff --git a/libpurple/purpleconversationuiops.h b/libpurple/purpleconversationuiops.h
--- a/libpurple/purpleconversationuiops.h
+++ b/libpurple/purpleconversationuiops.h
@@ -123,7 +123,10 @@ G_BEGIN_DECLS
  * purple_conversation_ui_ops_get_type:
  *
  * Returns: The #GType for the #PurpleConversationUiOps boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_conversation_ui_ops_get_type(void);
 
 G_END_DECLS
diff --git a/libpurple/purplegdkpixbuf.h b/libpurple/purplegdkpixbuf.h
--- a/libpurple/purplegdkpixbuf.h
+++ b/libpurple/purplegdkpixbuf.h
@@ -32,6 +32,7 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
 #include "image.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -40,7 +41,10 @@ G_BEGIN_DECLS
  * @pixbuf:  The buddy icon to transform
  *
  * Rounds the corners of a GdkPixbuf in place.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_gdk_pixbuf_make_round(GdkPixbuf *pixbuf);
 
 /**
@@ -51,7 +55,10 @@ void purple_gdk_pixbuf_make_round(GdkPix
  * alpha at any of the edge pixels.
  *
  * Returns: TRUE if the pixbuf is opaque around the edges, FALSE otherwise
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_gdk_pixbuf_is_opaque(GdkPixbuf *pixbuf);
 
 /**
@@ -63,7 +70,10 @@ gboolean purple_gdk_pixbuf_is_opaque(Gdk
  *
  * Returns: (transfer full): A GdkPixbuf created from the image data, or NULL if
  *         there was an error parsing the data.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GdkPixbuf *purple_gdk_pixbuf_from_data(const guchar *buf, gsize count);
 
 /**
@@ -73,7 +83,10 @@ GdkPixbuf *purple_gdk_pixbuf_from_data(c
  * Create a GdkPixbuf from a PurpleImage.
  *
  * Returns: (transfer full): a GdkPixbuf created from the @image.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GdkPixbuf *
 purple_gdk_pixbuf_from_image(PurpleImage *image);
 
@@ -98,7 +111,10 @@ purple_gdk_pixbuf_from_image(PurpleImage
  *
  * Returns: (transfer full): The GdkPixbuf if successful.  Otherwise NULL is returned and
  *         a warning is logged.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GdkPixbuf *purple_gdk_pixbuf_new_from_file(const char *filename);
 
 /**
@@ -124,7 +140,10 @@ GdkPixbuf *purple_gdk_pixbuf_new_from_fi
  *
  * Returns: (transfer full): The GdkPixbuf if successful.  Otherwise NULL is returned and
  *         a warning is logged.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GdkPixbuf *purple_gdk_pixbuf_new_from_file_at_size(const char *filename, int width, int height);
 
 G_END_DECLS
diff --git a/libpurple/purplegio.h b/libpurple/purplegio.h
--- a/libpurple/purplegio.h
+++ b/libpurple/purplegio.h
@@ -30,6 +30,7 @@
 #include <gio/gio.h>
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -43,7 +44,10 @@ G_BEGIN_DECLS
  * asynchronously waits for the operations to finish before closing the
  * arguments. Ensure the Gio callbacks can safely handle this being done
  * asynchronously.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_gio_graceful_close(GIOStream *stream, GInputStream *input, GOutputStream *output);
 
 /**
@@ -57,7 +61,10 @@ void purple_gio_graceful_close(GIOStream
  * Returns: (transfer full): A new #GSocketClient with the appropriate
  * GProxyResolver, based on the #PurpleAccount settings and
  * TLS Certificate handling, or NULL if an error occurred.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GSocketClient *purple_gio_socket_client_new(PurpleAccount *account, GError **error);
 
 /**
@@ -72,7 +79,10 @@ GSocketClient *purple_gio_socket_client_
  * range in the settings, than a port will be chosen from that range.
  *
  * Returns: The port number, or 0 in case of failure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint16 purple_socket_listener_add_any_inet_port(GSocketListener *listener, GObject *source_object, GError **error);
 
 G_END_DECLS
diff --git a/libpurple/purpleimconversation.h b/libpurple/purpleimconversation.h
--- a/libpurple/purpleimconversation.h
+++ b/libpurple/purpleimconversation.h
@@ -57,6 +57,7 @@ typedef struct _PurpleIMConversationClas
 
 #include "purpleaccount.h"
 #include "purpleconversation.h"
+#include "purpleversion.h"
 
 /**
  * PurpleIMConversation:
@@ -82,7 +83,10 @@ G_BEGIN_DECLS
  * purple_im_conversation_get_type:
  *
  * Returns: The #GType for the IMConversation object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_im_conversation_get_type(void);
 
 /**
@@ -94,7 +98,10 @@ GType purple_im_conversation_get_type(vo
  * Creates a new IM conversation.
  *
  * Returns: The new conversation.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_im_conversation_new(PurpleAccount *account, const gchar *name);
 
 /**
@@ -103,7 +110,10 @@ PurpleConversation *purple_im_conversati
  * @state: The typing state.
  *
  * Sets the IM's typing state.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_im_conversation_set_typing_state(PurpleIMConversation *im, PurpleIMTypingState state);
 
 /**
@@ -113,7 +123,10 @@ void purple_im_conversation_set_typing_s
  * Returns the IM's typing state.
  *
  * Returns: The IM's typing state.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleIMTypingState purple_im_conversation_get_typing_state(PurpleIMConversation *im);
 
 /**
@@ -123,7 +136,10 @@ PurpleIMTypingState purple_im_conversati
  *           PURPLE_IM_NOT_TYPING.
  *
  * Starts the IM's typing timeout.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_im_conversation_start_typing_timeout(PurpleIMConversation *im, int timeout);
 
 /**
@@ -131,7 +147,10 @@ void purple_im_conversation_start_typing
  * @im: The IM.
  *
  * Stops the IM's typing timeout.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_im_conversation_stop_typing_timeout(PurpleIMConversation *im);
 
 /**
@@ -141,7 +160,10 @@ void purple_im_conversation_stop_typing_
  * Returns the IM's typing timeout.
  *
  * Returns: The timeout.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint purple_im_conversation_get_typing_timeout(PurpleIMConversation *im);
 
 /**
@@ -155,7 +177,10 @@ guint purple_im_conversation_get_typing_
  * Few protocols need this (maybe only MSN).  If the user is still
  * typing after this quiet-period, then another #PURPLE_IM_TYPING message
  * will be sent.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_im_conversation_set_type_again(PurpleIMConversation *im, guint val);
 
 /**
@@ -166,7 +191,10 @@ void purple_im_conversation_set_type_aga
  *
  * Returns: The time in seconds since the epoch.  Or 0 if no additional
  *         PURPLE_IM_TYPING message should be sent.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 time_t purple_im_conversation_get_type_again(PurpleIMConversation *im);
 
 /**
@@ -174,7 +202,10 @@ time_t purple_im_conversation_get_type_a
  * @im:      The IM.
  *
  * Starts the IM's type again timeout.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_im_conversation_start_send_typed_timeout(PurpleIMConversation *im);
 
 /**
@@ -182,7 +213,10 @@ void purple_im_conversation_start_send_t
  * @im: The IM.
  *
  * Stops the IM's type again timeout.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_im_conversation_stop_send_typed_timeout(PurpleIMConversation *im);
 
 /**
@@ -192,7 +226,10 @@ void purple_im_conversation_stop_send_ty
  * Returns the IM's type again timeout interval.
  *
  * Returns: The type again timeout interval.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint purple_im_conversation_get_send_typed_timeout(PurpleIMConversation *im);
 
 /**
@@ -200,7 +237,10 @@ guint purple_im_conversation_get_send_ty
  * @im: The IM.
  *
  * Updates the visual typing notification for an IM conversation.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_im_conversation_update_typing(PurpleIMConversation *im);
 
 G_END_DECLS
diff --git a/libpurple/purplekeyvaluepair.h b/libpurple/purplekeyvaluepair.h
--- a/libpurple/purplekeyvaluepair.h
+++ b/libpurple/purplekeyvaluepair.h
@@ -62,7 +62,10 @@ struct _PurpleKeyValuePair {
  * The standard %_GET_TYPE function for #PurpleKeyValuePair.
  *
  * Returns: The #GType for #PurpleKeyValuePair.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_key_value_pair_get_type(void);
 
 /**
@@ -117,7 +120,10 @@ void purple_key_value_pair_free(PurpleKe
  * has no way to know how to allocate a new copy of the value.
  *
  * Returns: (transfer full): A new copy of @kvp.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleKeyValuePair *purple_key_value_pair_copy(PurpleKeyValuePair *kvp);
 
 G_END_DECLS
diff --git a/libpurple/purplemessage.h b/libpurple/purplemessage.h
--- a/libpurple/purplemessage.h
+++ b/libpurple/purplemessage.h
@@ -106,8 +106,10 @@ typedef enum /*< prefix=PURPLE_MESSAGE_C
  * PurpleMessage:
  *
  * #PurpleMessage represents any message passed between users in libpurple.
+ *
+ * Since: 3.0.0
  */
-
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleMessage, purple_message, PURPLE, MESSAGE, GObject)
 
 /**
@@ -380,7 +382,10 @@ GDateTime *purple_message_get_timestamp(
  * Formats the timestamp of @message and returns it.
  *
  * Returns: The formatted timestamp.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gchar *purple_message_format_timestamp(PurpleMessage *message, const gchar *format);
 
 /**
diff --git a/libpurple/purplenoopcredentialprovider.h b/libpurple/purplenoopcredentialprovider.h
--- a/libpurple/purplenoopcredentialprovider.h
+++ b/libpurple/purplenoopcredentialprovider.h
@@ -56,7 +56,10 @@ G_DECLARE_FINAL_TYPE(PurpleNoopCredentia
  * for itself.
  *
  * Returns: (transfer full): The new #PurpleNoopCredentialProvider instance.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleCredentialProvider *purple_noop_credential_provider_new(void);
 
 G_END_DECLS
diff --git a/libpurple/purpleoptions.h b/libpurple/purpleoptions.h
--- a/libpurple/purpleoptions.h
+++ b/libpurple/purpleoptions.h
@@ -29,6 +29,8 @@
 
 #include <glib.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 /**
@@ -41,7 +43,10 @@ G_BEGIN_DECLS
  *
  * Returns: (transfer full): a #GOptionGroup for the commandline arguments
  *          recognized by LibPurple.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GOptionGroup *purple_get_option_group(void);
 
 G_END_DECLS
diff --git a/libpurple/purplepath.h b/libpurple/purplepath.h
--- a/libpurple/purplepath.h
+++ b/libpurple/purplepath.h
@@ -25,6 +25,8 @@
 
 #include <glib.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 /**
@@ -45,7 +47,10 @@ const gchar *purple_home_dir(void);
  * sub-directory of DIR argument passed to -c option.
  *
  * Returns: The purple cache directory.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_cache_dir(void);
 
 /**
@@ -57,7 +62,10 @@ const gchar *purple_cache_dir(void);
  * sub-directory of DIR argument passed to -c option.
  *
  * Returns: The purple configuration directory.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_config_dir(void);
 
 /**
@@ -69,7 +77,10 @@ const gchar *purple_config_dir(void);
  * sub-directory of DIR argument passed to -c option.
  *
  * Returns: The purple data directory.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_data_dir(void);
 
 /**
diff --git a/libpurple/purpleplugininfo.h b/libpurple/purpleplugininfo.h
--- a/libpurple/purpleplugininfo.h
+++ b/libpurple/purpleplugininfo.h
@@ -72,6 +72,7 @@ struct _PurplePluginInfoClass {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum /*< flags >*/
 {
 	PURPLE_PLUGIN_INFO_FLAGS_INTERNAL  = 1 << 1,
diff --git a/libpurple/purplepresence.h b/libpurple/purplepresence.h
--- a/libpurple/purplepresence.h
+++ b/libpurple/purplepresence.h
@@ -108,6 +108,8 @@ struct _PurplePresenceClass {
 };
 
 #define PURPLE_TYPE_PRESENCE purple_presence_get_type()
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurplePresence, purple_presence, PURPLE, PRESENCE,
                          GObject)
 
@@ -293,10 +295,7 @@ GDateTime *purple_presence_get_login_tim
  * Returns: -1 if @presence1 is more available than @presence2.
  *           0 if @presence1 is equal to @presence2.
  *           1 if @presence1 is less available than @presence2.
- *
- * Since: 3.0.0
  */
-PURPLE_AVAILABLE_IN_3_0
 gint purple_presence_compare(PurplePresence *presence1, PurplePresence *presence2);
 
 /**
diff --git a/libpurple/purpleprotocolclient.h b/libpurple/purpleprotocolclient.h
--- a/libpurple/purpleprotocolclient.h
+++ b/libpurple/purpleprotocolclient.h
@@ -36,6 +36,8 @@
 #include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_CLIENT (purple_protocol_client_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolClient, purple_protocol_client, PURPLE,
                     PROTOCOL_CLIENT, PurpleProtocol)
 
@@ -44,6 +46,8 @@ G_DECLARE_INTERFACE(PurpleProtocolClient
  *
  * #PurpleProtocolClient interface defines the behavior of a typical chat
  * service's client interface.
+ *
+ * Since: 3.0.0
  */
 
 /**
@@ -108,6 +112,8 @@ G_DECLARE_INTERFACE(PurpleProtocolClient
  * The protocol client interface.
  *
  * This interface provides a gateway between purple and the protocol.
+ *
+ * Since: 3.0.0
  */
 struct _PurpleProtocolClientInterface {
 	/*< private >*/
diff --git a/libpurple/purpleprotocolim.h b/libpurple/purpleprotocolim.h
--- a/libpurple/purpleprotocolim.h
+++ b/libpurple/purpleprotocolim.h
@@ -67,6 +67,8 @@ G_DECLARE_INTERFACE(PurpleProtocolIM, pu
  *
  * The protocol IM interface that needs to be implemented to send one to one
  * messages.
+ *
+ * Since: 3.0.0
  */
 struct _PurpleProtocolIMInterface {
 	/*< private >*/
@@ -96,7 +98,10 @@ G_BEGIN_DECLS
  *
  * Returns: >= 0 on success, or < 0 on error.  If 0 is returned the message
  *          should not be output locally.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_protocol_im_send(PurpleProtocolIM *im,
                              PurpleConnection *connection,
                              PurpleConversation *conversation,
@@ -120,7 +125,10 @@ gint purple_protocol_im_send(PurpleProto
  *          need to be sent.  If this is 5, for example, then Purple will wait
  *          five seconds, and if the Purple user is still typing then Purple
  *          will send another #PURPLE_IM_TYPING message.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint purple_protocol_im_send_typing(PurpleProtocolIM *im,
                                      PurpleConnection *connection,
                                      const gchar *name,
diff --git a/libpurple/purpleprotocolmedia.h b/libpurple/purpleprotocolmedia.h
--- a/libpurple/purpleprotocolmedia.h
+++ b/libpurple/purpleprotocolmedia.h
@@ -36,6 +36,8 @@
 #include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_MEDIA (purple_protocol_media_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolMedia, purple_protocol_media, PURPLE,
                     PROTOCOL_MEDIA, PurpleProtocol)
 
@@ -46,6 +48,8 @@ G_BEGIN_DECLS
  *
  * #PurpleProtocolMedia describes the multimedia api that is available for
  * protocols.
+ *
+ * Since: 3.0.0
  */
 
 /**
@@ -70,6 +74,8 @@ G_BEGIN_DECLS
  * The protocol media interface.
  *
  * This interface provides callbacks for media sessions on the protocol.
+ *
+ * Since: 3.0.0
  */
 struct _PurpleProtocolMediaInterface {
 	/*< private >*/
diff --git a/libpurple/purpleprotocolroomlist.h b/libpurple/purpleprotocolroomlist.h
--- a/libpurple/purpleprotocolroomlist.h
+++ b/libpurple/purpleprotocolroomlist.h
@@ -43,6 +43,8 @@ G_BEGIN_DECLS
  *
  * #PurpleProtocolRoomlist is an interface to abstract how to handle rooms
  * lists at the protocol level.
+ *
+ * Since: 3.0.0
  */
 
 PURPLE_AVAILABLE_IN_3_0
diff --git a/libpurple/purpleprotocolserver.h b/libpurple/purpleprotocolserver.h
--- a/libpurple/purpleprotocolserver.h
+++ b/libpurple/purpleprotocolserver.h
@@ -86,6 +86,8 @@ G_BEGIN_DECLS
  * The protocol server interface.
  *
  * This interface provides a gateway between purple and the protocol's server.
+ *
+ * Since: 3.0.0
  */
 struct _PurpleProtocolServerInterface {
 	/*< private >*/
diff --git a/libpurple/purpleproxyinfo.h b/libpurple/purpleproxyinfo.h
--- a/libpurple/purpleproxyinfo.h
+++ b/libpurple/purpleproxyinfo.h
@@ -71,7 +71,10 @@ PurpleProxyInfo *purple_proxy_info_new(v
  * @proxy_type: The new type.
  *
  * Sets the type of @info.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_proxy_info_set_proxy_type(PurpleProxyInfo *info, PurpleProxyType proxy_type);
 
 /**
@@ -81,7 +84,10 @@ void purple_proxy_info_set_proxy_type(Pu
  * Gets the type of the proxy.
  *
  * Returns: The type of the proxy.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleProxyType purple_proxy_info_get_proxy_type(PurpleProxyInfo *info);
 
 /**
diff --git a/libpurple/purplesavedpresence.h b/libpurple/purplesavedpresence.h
--- a/libpurple/purplesavedpresence.h
+++ b/libpurple/purplesavedpresence.h
@@ -36,6 +36,8 @@
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_SAVED_PRESENCE purple_saved_presence_get_type()
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleSavedPresence, purple_saved_presence, PURPLE,
                      SAVED_PRESENCE, GObject)
 
diff --git a/libpurple/purplewhiteboard.h b/libpurple/purplewhiteboard.h
--- a/libpurple/purplewhiteboard.h
+++ b/libpurple/purplewhiteboard.h
@@ -38,6 +38,8 @@ typedef struct _PurpleWhiteboard PurpleW
  * PurpleWhiteboard:
  *
  * A abstract whiteboard object.
+ *
+ * Since: 3.0.0
  */
 
 G_BEGIN_DECLS
@@ -49,6 +51,8 @@ G_BEGIN_DECLS
  *
  * Right now this is empty but it will be filled out with the function from
  * PurpleWhiteboardOps in a future review request.
+ *
+ * Since: 3.0.0
  */
 struct _PurpleWhiteboardClass {
 	/*< private >*/
@@ -63,7 +67,10 @@ struct _PurpleWhiteboardClass {
  * The standard _get_type function for #PurpleWhiteboard.
  *
  * Returns: The #GType for the #PurpleWhiteboard object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleWhiteboard, purple_whiteboard, PURPLE,
                          WHITEBOARD, GObject)
 
@@ -73,7 +80,10 @@ G_DECLARE_DERIVABLE_TYPE(PurpleWhiteboar
  * @ops: The #PurpleWhiteboardOps to set.
  *
  * Sets the protocol operations for @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_set_protocol_ops(PurpleWhiteboard *whiteboard, PurpleWhiteboardOps *ops);
 
 /**
@@ -85,7 +95,10 @@ void purple_whiteboard_set_protocol_ops(
  * Creates a new whiteboard.
  *
  * Returns: (transfer full): The new #PurpleWhiteboard instance.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleWhiteboard *purple_whiteboard_new(PurpleAccount *account, const gchar *id, gint state);
 
 /**
@@ -95,7 +108,10 @@ PurpleWhiteboard *purple_whiteboard_new(
  * Gets the #PurpleAccount that @whiteboard is tied to.
  *
  * Returns: (transfer none): The #PurpleAccount for @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_whiteboard_get_account(PurpleWhiteboard *whiteboard);
 
 /**
@@ -117,7 +133,10 @@ const gchar *purple_whiteboard_get_id(Pu
  * @state: The state
  *
  * Set the state of @whiteboard to @state.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_set_state(PurpleWhiteboard *whiteboard, gint state);
 
 /**
@@ -127,7 +146,10 @@ void purple_whiteboard_set_state(PurpleW
  * Gets the state of @whiteboard.
  *
  * Returns: The state of the @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_whiteboard_get_state(PurpleWhiteboard *whiteboard);
 
 /**
@@ -258,7 +280,10 @@ void purple_whiteboard_set_brush(PurpleW
  * Gets the drawing list.
  *
  * Returns: (transfer none) (element-type gint): The drawing list.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_whiteboard_get_draw_list(PurpleWhiteboard *whiteboard);
 
 /**
@@ -267,7 +292,10 @@ GList *purple_whiteboard_get_draw_list(P
  * @draw_list: (element-type gint): The drawing list.
  *
  * Sets the drawing list.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_set_draw_list(PurpleWhiteboard *whiteboard, GList* draw_list);
 
 /**
@@ -276,7 +304,10 @@ void purple_whiteboard_set_draw_list(Pur
  * @proto_data: The protocol data to set for the whiteboard.
  *
  * Sets the protocol data for @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_set_protocol_data(PurpleWhiteboard *whiteboard, gpointer proto_data);
 
 /**
@@ -286,7 +317,10 @@ void purple_whiteboard_set_protocol_data
  * Gets the protocol data for a whiteboard.
  *
  * Returns: The protocol data for the whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer purple_whiteboard_get_protocol_data(PurpleWhiteboard *whiteboard);
 
 /**
diff --git a/libpurple/purplewhiteboarduiops.h b/libpurple/purplewhiteboarduiops.h
--- a/libpurple/purplewhiteboarduiops.h
+++ b/libpurple/purplewhiteboarduiops.h
@@ -34,6 +34,7 @@
 typedef struct _PurpleWhiteboardUiOps PurpleWhiteboardUiOps;
 
 #include "purplewhiteboard.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -66,6 +67,7 @@ struct _PurpleWhiteboardUiOps
 	gpointer reserved[4];
 };
 
+PURPLE_AVAILABLE_IN_3_0
 GType purple_whiteboard_ui_ops_get_type(void);
 
 /**
@@ -81,7 +83,10 @@ void purple_whiteboard_set_ui_ops(Purple
  * @whiteboard: A #PurpleWhiteboard instance.
  *
  * Creates a user interface for @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_ui_ops_create(PurpleWhiteboard *whiteboard);
 
 /**
@@ -89,7 +94,10 @@ void purple_whiteboard_ui_ops_create(Pur
  * @whiteboard: A #PurpleWhiteboard instance.
  *
  * Destroys the user interface for @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_ui_ops_destroy(PurpleWhiteboard *whiteboard);
 
 /**
@@ -99,7 +107,10 @@ void purple_whiteboard_ui_ops_destroy(Pu
  * @height: The new height.
  *
  * Sets the user interface dimensions for @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_ui_ops_set_dimensions(PurpleWhiteboard *whiteboard, gint width, gint height);
 
 /**
@@ -109,7 +120,10 @@ void purple_whiteboard_ui_ops_set_dimens
  * @color: The color to use.
  *
  * Sets the size and color of the active brush for @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_ui_ops_set_brush(PurpleWhiteboard *whiteboard, gint size, gint color);
 
 /**
@@ -121,7 +135,10 @@ void purple_whiteboard_ui_ops_set_brush(
  * @size: The size of the point.
  *
  * Draws a point on @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_ui_ops_draw_point(PurpleWhiteboard *whiteboard, gint x, gint y, gint color, gint size);
 
 /**
@@ -135,7 +152,10 @@ void purple_whiteboard_ui_ops_draw_point
  * @size: The size of the line.
  *
  * Draws a line on @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_ui_ops_draw_line(PurpleWhiteboard *whiteboard, gint x1, gint y1, gint x2, gint y2, gint color, gint size);
 
 /**
@@ -143,7 +163,10 @@ void purple_whiteboard_ui_ops_draw_line(
  * @whiteboard: A #PurpleWhiteboard instance.
  *
  * Clears all the contents of @whiteboard.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_whiteboard_ui_ops_clear(PurpleWhiteboard *whiteboard);
 
 G_END_DECLS
diff --git a/libpurple/request-datasheet.h b/libpurple/request-datasheet.h
--- a/libpurple/request-datasheet.h
+++ b/libpurple/request-datasheet.h
@@ -29,6 +29,8 @@
 
 #include <glib.h>
 
+#include "purpleversion.h"
+
 /**
  * PurpleRequestDatasheet:
  *
@@ -71,6 +73,7 @@ G_BEGIN_DECLS
  *
  * Returns: (transfer full): The new datasheet.
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestDatasheet *
 purple_request_datasheet_new(void);
 
@@ -80,6 +83,7 @@ purple_request_datasheet_new(void);
  *
  * Destroys datasheet with all its contents.
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_free(PurpleRequestDatasheet *sheet);
 
@@ -92,7 +96,10 @@ purple_request_datasheet_free(PurpleRequ
  * Adds a column to the datasheet.
  *
  * You cannot add a column if datasheet contains any data.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_add_column(PurpleRequestDatasheet *sheet,
 	PurpleRequestDatasheetColumnType type, const gchar *title);
@@ -104,7 +111,10 @@ purple_request_datasheet_add_column(Purp
  * Returns the column count of datasheet.
  *
  * Returns: The column count.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint
 purple_request_datasheet_get_column_count(PurpleRequestDatasheet *sheet);
 
@@ -116,7 +126,10 @@ purple_request_datasheet_get_column_coun
  * Returns the column type for a datasheet.
  *
  * Returns: The column type.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestDatasheetColumnType
 purple_request_datasheet_get_column_type(PurpleRequestDatasheet *sheet,
 	guint col_no);
@@ -129,7 +142,10 @@ purple_request_datasheet_get_column_type
  * Returns the column title for a datasheet.
  *
  * Returns: The column title.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *
 purple_request_datasheet_get_column_title(PurpleRequestDatasheet *sheet,
 	guint col_no);
@@ -143,7 +159,10 @@ purple_request_datasheet_get_column_titl
  * You shouldn't modify datasheet's data while iterating through it.
  *
  * Returns: (element-type PurpleRequestDatasheetRecord) (transfer none): The list of records.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const GList *
 purple_request_datasheet_get_records(PurpleRequestDatasheet *sheet);
 
@@ -155,7 +174,10 @@ purple_request_datasheet_get_records(Pur
  * Adds an action to the datasheet.
  *
  * Action object is owned by the datasheet since this call.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_add_action(PurpleRequestDatasheet *sheet,
 	PurpleRequestDatasheetAction *action);
@@ -167,7 +189,10 @@ purple_request_datasheet_add_action(Purp
  * Returns the list of actions in a datasheet.
  *
  * Returns: (element-type PurpleRequestDatasheetAction) (transfer none): The list of actions.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const GList *
 purple_request_datasheet_get_actions(PurpleRequestDatasheet *sheet);
 
@@ -182,7 +207,10 @@ purple_request_datasheet_get_actions(Pur
  * Creates new datasheet action.
  *
  * Returns: (transfer full): The new action.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestDatasheetAction *
 purple_request_datasheet_action_new(void);
 
@@ -191,7 +219,10 @@ purple_request_datasheet_action_new(void
  * @act: The action.
  *
  * Destroys the datasheet action.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_action_free(PurpleRequestDatasheetAction *act);
 
@@ -201,7 +232,10 @@ purple_request_datasheet_action_free(Pur
  * @label: The label.
  *
  * Sets the localized label for the action.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_action_set_label(PurpleRequestDatasheetAction *act,
 	const gchar *label);
@@ -213,7 +247,10 @@ purple_request_datasheet_action_set_labe
  * Gets the label of action.
  *
  * Returns: The localized label text.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar*
 purple_request_datasheet_action_get_label(PurpleRequestDatasheetAction *act);
 
@@ -224,7 +261,10 @@ purple_request_datasheet_action_get_labe
  * @user_data: The data to be passed to the callback function.
  *
  * Sets the callback for the action.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_action_set_cb(PurpleRequestDatasheetAction *act,
 	PurpleRequestDatasheetActionCb cb, gpointer user_data);
@@ -235,7 +275,10 @@ purple_request_datasheet_action_set_cb(P
  * @rec: The user selected record.
  *
  * Calls the callback of the action.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_action_call(PurpleRequestDatasheetAction *act,
 	PurpleRequestDatasheetRecord *rec);
@@ -250,7 +293,10 @@ purple_request_datasheet_action_call(Pur
  *
  * If there is no callback set, default is used: the action is enabled, if any
  * record is active.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_action_set_sens_cb(
 	PurpleRequestDatasheetAction *act,
@@ -264,7 +310,10 @@ purple_request_datasheet_action_set_sens
  * Checks, if the action is enabled for the active record.
  *
  * Returns: %TRUE, if the action is enabled, %FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean
 purple_request_datasheet_action_is_sensitive(PurpleRequestDatasheetAction *act,
 	PurpleRequestDatasheetRecord *rec);
@@ -281,7 +330,10 @@ purple_request_datasheet_action_is_sensi
  * Returns the key of a record.
  *
  * Returns: The key.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer
 purple_request_datasheet_record_get_key(
 	const PurpleRequestDatasheetRecord *rec);
@@ -293,7 +345,10 @@ purple_request_datasheet_record_get_key(
  * Returns the datasheet of a record.
  *
  * Returns: (transfer none): The datasheet.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestDatasheet *
 purple_request_datasheet_record_get_datasheet(
 	PurpleRequestDatasheetRecord *rec);
@@ -306,7 +361,10 @@ purple_request_datasheet_record_get_data
  * Looks up for a record in datasheet.
  *
  * Returns: (transfer none): The record if found, %NULL otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestDatasheetRecord *
 purple_request_datasheet_record_find(PurpleRequestDatasheet *sheet,
 	gpointer key);
@@ -321,7 +379,10 @@ purple_request_datasheet_record_find(Pur
  * If the specified key already exists in datasheet, old record is returned.
  *
  * Returns: (transfer full): The record.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestDatasheetRecord *
 purple_request_datasheet_record_add(PurpleRequestDatasheet *sheet,
 	gpointer key);
@@ -332,7 +393,10 @@ purple_request_datasheet_record_add(Purp
  * @key:   The key.
  *
  * Removes a record from a datasheet.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_record_remove(PurpleRequestDatasheet *sheet,
 	gpointer key);
@@ -342,7 +406,10 @@ purple_request_datasheet_record_remove(P
  * @sheet: The datasheet.
  *
  * Removes all records from a datasheet.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_record_remove_all(PurpleRequestDatasheet *sheet);
 
@@ -354,7 +421,10 @@ purple_request_datasheet_record_remove_a
  * purple_request_datasheet_record_add.
  *
  * See purple_request_datasheet_record_add().
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_record_mark_all_for_rem(PurpleRequestDatasheet *sheet);
 
@@ -365,7 +435,10 @@ purple_request_datasheet_record_mark_all
  * Removes all marked records.
  *
  * See purple_request_datasheet_record_mark_all_for_rem().
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_record_remove_marked(PurpleRequestDatasheet *sheet);
 
@@ -376,7 +449,10 @@ purple_request_datasheet_record_remove_m
  * @data:   The data.
  *
  * Sets data for a string column of specified record.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_record_set_string_data(
 	PurpleRequestDatasheetRecord *rec, guint col_no, const gchar *data);
@@ -388,7 +464,10 @@ purple_request_datasheet_record_set_stri
  * @stock_id: The stock identifier of a image.
  *
  * Sets data for a image column of specified record.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_datasheet_record_set_image_data(
 	PurpleRequestDatasheetRecord *rec, guint col_no, const gchar *stock_id);
@@ -401,7 +480,10 @@ purple_request_datasheet_record_set_imag
  * Returns data for a string column of specified record.
  *
  * Returns: The data.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *
 purple_request_datasheet_record_get_string_data(
 	const PurpleRequestDatasheetRecord *rec, guint col_no);
@@ -414,7 +496,10 @@ purple_request_datasheet_record_get_stri
  * Returns data for an image column of specified record.
  *
  * Returns: The stock id of an image.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *
 purple_request_datasheet_record_get_image_data(
 	const PurpleRequestDatasheetRecord *rec, guint col_no);
diff --git a/libpurple/request.h b/libpurple/request.h
--- a/libpurple/request.h
+++ b/libpurple/request.h
@@ -45,6 +45,7 @@ typedef struct _PurpleRequestUiOps Purpl
 
 #include "purpleaccount.h"
 #include "purpleconversation.h"
+#include "purpleversion.h"
 #include "request/purplerequestpage.h"
 #include "request/purplerequestgroup.h"
 #include "request/purplerequestfield.h"
@@ -227,7 +228,10 @@ G_BEGIN_DECLS
  * the UI to display the request.
  *
  * Returns: (transfer full): The new parameters set.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestCommonParameters *
 purple_request_cpar_new(void);
 
@@ -238,7 +242,10 @@ purple_request_cpar_new(void);
  * Creates new parameters set initially bound with the #PurpleConnection.
  *
  * Returns: (transfer full): The new parameters set.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestCommonParameters *
 purple_request_cpar_from_connection(PurpleConnection *gc);
 
@@ -249,7 +256,10 @@ purple_request_cpar_from_connection(Purp
  * Creates new parameters set initially bound with the #PurpleAccount.
  *
  * Returns: (transfer full): The new parameters set.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestCommonParameters *
 purple_request_cpar_from_account(PurpleAccount *account);
 
@@ -260,7 +270,10 @@ purple_request_cpar_from_account(PurpleA
  * Creates new parameters set initially bound with the #PurpleConversation.
  *
  * Returns: (transfer full): The new parameters set.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestCommonParameters *
 purple_request_cpar_from_conversation(PurpleConversation *conv);
 
@@ -269,7 +282,10 @@ purple_request_cpar_from_conversation(Pu
  * @cpar: The object to ref.
  *
  * Increases the reference count on the parameters set.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_ref(PurpleRequestCommonParameters *cpar);
 
@@ -280,7 +296,10 @@ purple_request_cpar_ref(PurpleRequestCom
  * Decreases the reference count on the parameters set.
  *
  * The object will be destroyed when this reaches 0.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_unref(PurpleRequestCommonParameters *cpar);
 
@@ -290,7 +309,10 @@ purple_request_cpar_unref(PurpleRequestC
  * @account: The #PurpleAccount to associate.
  *
  * Sets the #PurpleAccount associated with the request, or %NULL, if none is.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_account(PurpleRequestCommonParameters *cpar,
 	PurpleAccount *account);
@@ -303,7 +325,10 @@ purple_request_cpar_set_account(PurpleRe
  *
  * Returns: (transfer none): The associated #PurpleAccount, or %NULL if none is
  *          set.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *
 purple_request_cpar_get_account(PurpleRequestCommonParameters *cpar);
 
@@ -314,7 +339,10 @@ purple_request_cpar_get_account(PurpleRe
  *
  * Sets the #PurpleConversation associated with the request, or %NULL, if
  * none is.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_conversation(PurpleRequestCommonParameters *cpar,
 	PurpleConversation *conv);
@@ -327,7 +355,10 @@ purple_request_cpar_set_conversation(Pur
  *
  * Returns: (transfer none): The associated #PurpleConversation, or %NULL if
  *          none is set.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *
 purple_request_cpar_get_conversation(PurpleRequestCommonParameters *cpar);
 
@@ -337,7 +368,10 @@ purple_request_cpar_get_conversation(Pur
  * @icon_type: The icon type.
  *
  * Sets the icon associated with the request.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_icon(PurpleRequestCommonParameters *cpar,
 	PurpleRequestIconType icon_type);
@@ -349,7 +383,10 @@ purple_request_cpar_set_icon(PurpleReque
  * Gets the icon associated with the request.
  *
  * Returns: icon_type The icon type.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestIconType
 purple_request_cpar_get_icon(PurpleRequestCommonParameters *cpar);
 
@@ -360,7 +397,10 @@ purple_request_cpar_get_icon(PurpleReque
  * @icon_size: The icon image size.
  *
  * Sets the custom icon associated with the request.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_custom_icon(PurpleRequestCommonParameters *cpar,
 	gconstpointer icon_data, gsize icon_size);
@@ -374,7 +414,10 @@ purple_request_cpar_set_custom_icon(Purp
  * Gets the custom icon associated with the request.
  *
  * Returns: The icon image contents.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gconstpointer
 purple_request_cpar_get_custom_icon(PurpleRequestCommonParameters *cpar,
 	gsize *icon_size);
@@ -387,7 +430,10 @@ purple_request_cpar_get_custom_icon(Purp
  *                redefined in the future.
  *
  * Switches the request text to be HTML or not.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_html(PurpleRequestCommonParameters *cpar,
 	gboolean enabled);
@@ -399,7 +445,10 @@ purple_request_cpar_set_html(PurpleReque
  * Checks, if the text passed to the request is HTML.
  *
  * Returns: %TRUE, if the text is HTML, %FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean
 purple_request_cpar_is_html(PurpleRequestCommonParameters *cpar);
 
@@ -409,7 +458,10 @@ purple_request_cpar_is_html(PurpleReques
  * @compact: TRUE for compact, FALSE otherwise.
  *
  * Sets dialog display mode to compact or default.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_compact(PurpleRequestCommonParameters *cpar,
 	gboolean compact);
@@ -421,7 +473,10 @@ purple_request_cpar_set_compact(PurpleRe
  * Gets dialog display mode.
  *
  * Returns: TRUE for compact, FALSE for default.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean
 purple_request_cpar_is_compact(PurpleRequestCommonParameters *cpar);
 
@@ -432,7 +487,10 @@ purple_request_cpar_is_compact(PurpleReq
  * @user_data: The data to be passed to the callback.
  *
  * Sets the callback for the Help button.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_help_cb(PurpleRequestCommonParameters *cpar,
 	PurpleRequestHelpCb cb, gpointer user_data);
@@ -446,7 +504,10 @@ purple_request_cpar_set_help_cb(PurpleRe
  * Gets the callback for the Help button.
  *
  * Returns: (transfer none): The callback.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestHelpCb
 purple_request_cpar_get_help_cb(PurpleRequestCommonParameters *cpar,
 	gpointer *user_data);
@@ -462,7 +523,10 @@ purple_request_cpar_get_help_cb(PurpleRe
  *        Should be terminated with the NULL label.
  *
  * Sets extra actions for the PurpleRequestPage dialog.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_extra_actions(PurpleRequestCommonParameters *cpar, ...);
 
@@ -474,7 +538,10 @@ purple_request_cpar_set_extra_actions(Pu
  *
  * Returns: (element-type PurpleKeyValuePair) (transfer none): A list of actions (pairs of arguments, as in
  *          setter).
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GSList *
 purple_request_cpar_get_extra_actions(PurpleRequestCommonParameters *cpar);
 
@@ -485,7 +552,10 @@ purple_request_cpar_get_extra_actions(Pu
  *
  * Sets the same parent window for this dialog, as the parent of specified
  * Notify API or Request API dialog UI handle.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_cpar_set_parent_from(PurpleRequestCommonParameters *cpar,
 	gpointer ui_handle);
@@ -497,7 +567,10 @@ purple_request_cpar_set_parent_from(Purp
  * Gets the parent "donor" for this dialog.
  *
  * Returns: The donors UI handle.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer
 purple_request_cpar_get_parent_from(PurpleRequestCommonParameters *cpar);
 
@@ -725,7 +798,10 @@ purple_request_action_varg(void *handle,
  * Displays a "please wait" dialog.
  *
  * Returns: A UI-specific handle.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void *
 purple_request_wait(void *handle, const char *title, const char *primary,
 	const char *secondary, gboolean with_progress,
@@ -738,7 +814,10 @@ purple_request_wait(void *handle, const 
  *
  * Notifies the "please wait" dialog that some progress has been made, but you
  * don't know how much.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_wait_pulse(void *ui_handle);
 
@@ -749,7 +828,10 @@ purple_request_wait_pulse(void *ui_handl
  *                  inclusive).
  *
  * Notifies the "please wait" dialog about progress has been made.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_wait_progress(void *ui_handle, gfloat fraction);
 
@@ -798,7 +880,10 @@ purple_request_fields(void *handle, cons
  * Checks, if passed UI handle is valid.
  *
  * Returns: TRUE, if handle is valid, FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean
 purple_request_is_valid_ui_handle(void *ui_handle, PurpleRequestType *type);
 
@@ -809,7 +894,10 @@ purple_request_is_valid_ui_handle(void *
  * @notify_data: The data to be passed to the callback function.
  *
  * Adds a function called when notification dialog is closed.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void
 purple_request_add_close_notify(void *ui_handle, GDestroyNotify notify,
 	gpointer notify_data);
@@ -974,7 +1062,10 @@ purple_request_folder(void *handle, cons
  * The standard _get_type function for #PurpleRequestUiOps.
  *
  * Returns: The #GType for the #PurpleRequestUiOps boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_request_ui_ops_get_type(void);
 
 /**
diff --git a/libpurple/request/purplerequestfield.h b/libpurple/request/purplerequestfield.h
--- a/libpurple/request/purplerequestfield.h
+++ b/libpurple/request/purplerequestfield.h
@@ -121,7 +121,10 @@ void purple_request_field_set_type_hint(
  *
  * This is optionally used by the UIs to provide a tooltip for
  * the field.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_request_field_set_tooltip(PurpleRequestField *field, const char *tooltip);
 
 /**
@@ -190,7 +193,10 @@ const char *purple_request_field_get_typ
  * Returns the field's tooltip.
  *
  * Returns: The field's tooltip.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_request_field_get_tooltip(PurpleRequestField *field);
 
 /**
@@ -214,7 +220,10 @@ gboolean purple_request_field_is_require
  * notify on [property@RequestField:filled].
  *
  * Returns: TRUE if the field has value, or FALSE.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_field_is_filled(PurpleRequestField *field);
 
 /**
@@ -226,7 +235,10 @@ gboolean purple_request_field_is_filled(
  * @destroy_data: A cleanup function for @user_data.
  *
  * Set an additional validator for a field.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_request_field_set_validator(PurpleRequestField *field, PurpleRequestFieldValidator validator, gpointer user_data, GDestroyNotify destroy_data);
 
 /**
@@ -244,7 +256,10 @@ void purple_request_field_set_validator(
  * Note: Required, but unfilled, fields are invalid.
  *
  * Returns: TRUE, if the field is valid, FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_field_is_valid(PurpleRequestField *field, gchar **errmsg);
 
 /**
@@ -253,7 +268,10 @@ gboolean purple_request_field_is_valid(P
  * @sensitive: TRUE if the field should be sensitive for user input.
  *
  * Sets field editable.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_request_field_set_sensitive(PurpleRequestField *field, gboolean sensitive);
 
 /**
@@ -263,7 +281,10 @@ void purple_request_field_set_sensitive(
  * Checks, if field is editable.
  *
  * Returns: TRUE, if the field is sensitive for user input.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_field_is_sensitive(PurpleRequestField *field);
 
 G_END_DECLS
diff --git a/libpurple/request/purplerequestfieldchoice.h b/libpurple/request/purplerequestfieldchoice.h
--- a/libpurple/request/purplerequestfieldchoice.h
+++ b/libpurple/request/purplerequestfieldchoice.h
@@ -83,6 +83,7 @@ void purple_request_field_choice_add(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_request_field_choice_add_full(PurpleRequestFieldChoice *field, const char *label, gpointer data, GDestroyNotify destroy);
 
 /**
@@ -130,7 +131,10 @@ gpointer purple_request_field_choice_get
  * Returns a list of elements in a choice field.
  *
  * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of pairs of {label, value}.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_request_field_choice_get_elements(PurpleRequestFieldChoice *field);
 
 G_END_DECLS
diff --git a/libpurple/request/purplerequestfielddatasheet.h b/libpurple/request/purplerequestfielddatasheet.h
--- a/libpurple/request/purplerequestfielddatasheet.h
+++ b/libpurple/request/purplerequestfielddatasheet.h
@@ -58,7 +58,10 @@ G_DECLARE_FINAL_TYPE(PurpleRequestFieldD
  * Creates a datasheet item field.
  *
  * Returns: (transfer full): The new field.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestField *purple_request_field_datasheet_new(const char *id, const gchar *text, PurpleRequestDatasheet *sheet);
 
 /**
@@ -68,7 +71,10 @@ PurpleRequestField *purple_request_field
  * Returns a datasheet for a field.
  *
  * Returns: (transfer none): The datasheet object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet(PurpleRequestFieldDatasheet *field);
 
 G_END_DECLS
diff --git a/libpurple/request/purplerequestfieldint.h b/libpurple/request/purplerequestfieldint.h
--- a/libpurple/request/purplerequestfieldint.h
+++ b/libpurple/request/purplerequestfieldint.h
@@ -77,7 +77,10 @@ void purple_request_field_int_set_defaul
  * @lower_bound: The lower bound.
  *
  * Sets the lower bound in an integer field.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_request_field_int_set_lower_bound(PurpleRequestFieldInt *field, int lower_bound);
 
 /**
@@ -86,7 +89,10 @@ void purple_request_field_int_set_lower_
  * @upper_bound: The upper bound.
  *
  * Sets the upper bound in an integer field.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_request_field_int_set_upper_bound(PurpleRequestFieldInt *field, int upper_bound);
 
 /**
@@ -115,7 +121,10 @@ int purple_request_field_int_get_default
  * Returns the lower bound in an integer field.
  *
  * Returns: The lower bound.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_request_field_int_get_lower_bound(PurpleRequestFieldInt *field);
 
 /**
@@ -125,7 +134,10 @@ int purple_request_field_int_get_lower_b
  * Returns the upper bound in an integer field.
  *
  * Returns: The upper bound.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_request_field_int_get_upper_bound(PurpleRequestFieldInt *field);
 
 /**
diff --git a/libpurple/request/purplerequestfieldlist.h b/libpurple/request/purplerequestfieldlist.h
--- a/libpurple/request/purplerequestfieldlist.h
+++ b/libpurple/request/purplerequestfieldlist.h
@@ -171,6 +171,7 @@ GList *purple_request_field_list_get_ite
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_field_list_has_icons(PurpleRequestFieldList *field);
 
 G_END_DECLS
diff --git a/libpurple/request/purplerequestfieldstring.h b/libpurple/request/purplerequestfieldstring.h
--- a/libpurple/request/purplerequestfieldstring.h
+++ b/libpurple/request/purplerequestfieldstring.h
@@ -140,7 +140,10 @@ gboolean purple_request_field_string_is_
  * See [method@Purple.RequestField.set_validator].
  *
  * Returns: TRUE, if field contains valid email address.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_field_email_validator(PurpleRequestField *field, char **errmsg, gpointer user_data);
 
 /**
@@ -155,7 +158,10 @@ gboolean purple_request_field_email_vali
  * See [method@Purple.RequestField.set_validator].
  *
  * Returns: TRUE, if field contains only alphanumeric characters.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_field_alphanumeric_validator(PurpleRequestField *field, char **errmsg, gpointer allowed_characters);
 
 G_END_DECLS
diff --git a/libpurple/roomlist.h b/libpurple/roomlist.h
--- a/libpurple/roomlist.h
+++ b/libpurple/roomlist.h
@@ -107,7 +107,10 @@ G_BEGIN_DECLS
  * The standard _get_type function for #PurpleRoomlist.
  *
  * Returns: The #GType for the Room List object.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRoomlist, purple_roomlist, PURPLE, ROOMLIST, GObject)
 
 /**
@@ -140,7 +143,10 @@ PurpleRoomlist *purple_roomlist_new(Purp
  * created.
  *
  * Returns: (transfer none): The PurpleAccount tied to this room list.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_roomlist_get_account(PurpleRoomlist *list);
 
 /**
@@ -235,7 +241,10 @@ void purple_roomlist_join_room(PurpleRoo
  * The standard _get_type function for #PurpleRoomlistUiOps.
  *
  * Returns: The #GType for the #PurpleRoomlistUiOps boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_roomlist_ui_ops_get_type(void);
 
 /**
diff --git a/libpurple/savedstatuses.h b/libpurple/savedstatuses.h
--- a/libpurple/savedstatuses.h
+++ b/libpurple/savedstatuses.h
@@ -62,6 +62,7 @@ typedef struct _PurpleSavedStatus     Pu
 typedef struct _PurpleSavedStatusSub  PurpleSavedStatusSub;
 
 #include "status.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -113,7 +114,10 @@ void purple_savedstatus_set_title(Purple
  * @type:    The type of saved status.
  *
  * Set the type for the given saved status.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_savedstatus_set_primitive_type(PurpleSavedStatus *status,
 							   PurpleStatusPrimitive type);
 
@@ -342,7 +346,10 @@ const char *purple_savedstatus_get_title
  * Return the type of a given saved status.
  *
  * Returns: The primitive type.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleStatusPrimitive purple_savedstatus_get_primitive_type(const PurpleSavedStatus *saved_status);
 
 /**
@@ -411,7 +418,10 @@ PurpleSavedStatusSub *purple_savedstatus
  * Get the status type of a given substatus.
  *
  * Returns: The status type.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const PurpleStatusType *purple_savedstatus_substatus_get_status_type(
 		const PurpleSavedStatusSub *substatus);
 
diff --git a/libpurple/server.h b/libpurple/server.h
--- a/libpurple/server.h
+++ b/libpurple/server.h
@@ -33,6 +33,7 @@
 #include "protocols.h"
 #include "purpleimconversation.h"
 #include "purplemessage.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -51,8 +52,11 @@ G_BEGIN_DECLS
  *         example, then Purple will wait five seconds, and if the Purple
  *         user is still typing then Purple will send another PURPLE_IM_TYPING
  *         message.
+ *
+ * Since: 3.0.0
  */
 /* TODO Could probably move this into the conversation API. */
+PURPLE_AVAILABLE_IN_3_0
 unsigned int purple_serv_send_typing(PurpleConnection *gc, const char *name, PurpleIMTypingState state);
 
 /**
@@ -62,7 +66,10 @@ unsigned int purple_serv_send_typing(Pur
  * @dest:   Destiny group.
  *
  * Move a buddy from one group to another on server.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_move_buddy(PurpleBuddy *buddy, PurpleGroup *orig, PurpleGroup *dest);
 
 /**
@@ -73,7 +80,10 @@ void purple_serv_move_buddy(PurpleBuddy 
  * Sends the message to the user through the required protocol.
  *
  * Returns: The error value returned from the protocol interface function.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int  purple_serv_send_im(PurpleConnection *gc, PurpleMessage *msg);
 
 /******************************************************************************
@@ -88,7 +98,10 @@ int  purple_serv_send_im(PurpleConnectio
  * @name:   The name of the remote user to send the invitation to.
  *
  * Invite a user to join a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_chat_invite(PurpleConnection *gc, int id, const char *message, const char *name);
 
 /**
@@ -97,7 +110,10 @@ void purple_serv_chat_invite(PurpleConne
  * @id:     The id of the chat to leave.
  *
  * Called when the user requests leaving a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_chat_leave(PurpleConnection *gc, int id);
 
 /**
@@ -118,7 +134,10 @@ void purple_serv_chat_leave(PurpleConnec
  *
  * Returns:  A positive number or 0 in case of success, a
  *           negative error number in case of failure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int  purple_serv_chat_send(PurpleConnection *gc, int id, PurpleMessage *msg);
 
 /******************************************************************************
@@ -130,7 +149,10 @@ int  purple_serv_chat_send(PurpleConnect
  * @buddy:  The Buddy.
  *
  * Save/store buddy's alias on server list/roster
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_alias_buddy(PurpleBuddy *buddy);
 
 /**
@@ -141,7 +163,9 @@ void purple_serv_alias_buddy(PurpleBuddy
  *
  * Protocol should call this function when it retrieves an alias form the server.
  *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_got_alias(PurpleConnection *gc, const char *who, const char *alias);
 
 /**
@@ -173,7 +197,10 @@ void purple_serv_got_private_alias(Purpl
  * purple_serv_got_typing_stopped instead.
  *
  * @todo Could probably move this into the conversation API.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_got_typing(PurpleConnection *gc, const char *name, int timeout,
 					 PurpleIMTypingState state);
 
@@ -185,7 +212,10 @@ void purple_serv_got_typing(PurpleConnec
  * Called from a protocol when it has received a type stopped.
  *
  * @todo Could probably move this into the conversation API.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_got_typing_stopped(PurpleConnection *gc, const char *name);
 
 /**
@@ -197,7 +227,10 @@ void purple_serv_got_typing_stopped(Purp
  * @mtime:  The timestamp of the message.
  *
  * This function is called by the protocol when it receives an IM message.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_got_im(PurpleConnection *gc, const char *who, const char *msg,
 				 PurpleMessageFlags flags, time_t mtime);
 
@@ -206,7 +239,10 @@ void purple_serv_got_im(PurpleConnection
  * @gc:   The #PurpleConnection
  * @data: The hash function should be g_str_hash() and the equal
  *             function should be g_str_equal().
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_join_chat(PurpleConnection *gc, GHashTable *data);
 
 /**
@@ -214,7 +250,10 @@ void purple_serv_join_chat(PurpleConnect
  * @gc: The #PurpleConnection 
  * @data: The hash function should be g_str_hash() and the equal
  *             function should be g_str_equal().
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_reject_chat(PurpleConnection *gc, GHashTable *data);
 
 /**
@@ -228,7 +267,10 @@ void purple_serv_reject_chat(PurpleConne
  *                function should be g_str_equal().
  *
  * Called by a protocol when an account is invited into a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_got_chat_invite(PurpleConnection *gc, const char *name,
 						  const char *who, const char *message,
 						  GHashTable *data);
@@ -242,9 +284,13 @@ void purple_serv_got_chat_invite(PurpleC
  * Called by a protocol when an account has joined a chat.
  *
  * Returns: (transfer none): The resulting conversation.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_serv_got_joined_chat(PurpleConnection *gc,
 									   int id, const char *name);
+
 /**
  * purple_serv_got_join_chat_failed:
  * @gc:      The connection on which chat joining failed
@@ -263,7 +309,10 @@ void purple_serv_got_join_chat_failed(Pu
  * @id: The id of the chat, as assigned by the protocol.
  *
  * Called by a protocol when an account has left a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_got_chat_left(PurpleConnection *g, int id);
 
 /**
@@ -276,7 +325,10 @@ void purple_serv_got_chat_left(PurpleCon
  * @mtime:   The time when the message was received.
  *
  * Called by a protocol when a message has been received in a chat.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_got_chat_in(PurpleConnection *g, int id, const char *who,
 					  PurpleMessageFlags flags, const char *message, time_t mtime);
 
@@ -287,7 +339,10 @@ void purple_serv_got_chat_in(PurpleConne
  * @file:   The filename to send.
  *
  * Send a filename to a given contact.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_serv_send_file(PurpleConnection *gc, const char *who, const char *file);
 
 G_END_DECLS
diff --git a/libpurple/signals.h b/libpurple/signals.h
--- a/libpurple/signals.h
+++ b/libpurple/signals.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 /**
  * PurpleSignalMarshalFunc:
  * @cb: The #GCallback to call.
@@ -338,7 +340,10 @@ void purple_marshal_VOID__POINTER_POINTE
  *
  * A purple marshaller function for use with signals with a pointer and
  * two unsigned integer arguments.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_marshal_VOID__POINTER_UINT_UINT(
 		GCallback cb, va_list args, void *data, void **return_val);
 
diff --git a/libpurple/status.h b/libpurple/status.h
--- a/libpurple/status.h
+++ b/libpurple/status.h
@@ -167,7 +167,10 @@ PurpleStatusPrimitive purple_primitive_g
  * The standard _get_type function for #PurpleStatusType.
  *
  * Returns: The #GType for #PurpleStatusType.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_status_type_get_type(void);
 
 /**
@@ -417,7 +420,10 @@ const PurpleStatusType *purple_status_ty
  * The standard _get_type function for #PurpleStatusAttribute.
  *
  * Returns: The #GType for the #PurpleStatusAttribute boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_status_attribute_get_type(void);
 
 /**
@@ -429,7 +435,10 @@ GType purple_status_attribute_get_type(v
  * Creates a new status attribute.
  *
  * Returns: A new status attribute.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleStatusAttribute *purple_status_attribute_new(const char *id, const char *name,
 									 GValue *value_type);
 
@@ -438,7 +447,10 @@ PurpleStatusAttribute *purple_status_att
  * @attr: The status attribute to destroy.
  *
  * Destroys a status attribute.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_status_attribute_destroy(PurpleStatusAttribute *attr);
 
 /**
@@ -448,7 +460,10 @@ void purple_status_attribute_destroy(Pur
  * Returns the ID of a status attribute.
  *
  * Returns: The status attribute's ID.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_status_attribute_get_id(const PurpleStatusAttribute *attr);
 
 /**
@@ -458,7 +473,10 @@ const char *purple_status_attribute_get_
  * Returns the name of a status attribute.
  *
  * Returns: The status attribute's name.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_status_attribute_get_name(const PurpleStatusAttribute *attr);
 
 /**
@@ -468,7 +486,10 @@ const char *purple_status_attribute_get_
  * Returns the value of a status attribute.
  *
  * Returns: The status attribute's value.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GValue *purple_status_attribute_get_value(const PurpleStatusAttribute *attr);
 
 /**************************************************************************/
@@ -532,7 +553,10 @@ void purple_status_set_active_with_attri
  * Returns the status's type.
  *
  * Returns: The status's type.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleStatusType *purple_status_get_status_type(PurpleStatus *status);
 
 /**
@@ -701,7 +725,10 @@ gint purple_status_compare(PurpleStatus 
  * Get the handle for the status subsystem.
  *
  * Returns: the handle to the status subsystem
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void *purple_statuses_get_handle(void);
 
 /**
diff --git a/libpurple/util.h b/libpurple/util.h
--- a/libpurple/util.h
+++ b/libpurple/util.h
@@ -74,7 +74,10 @@ void purple_util_uninit(void);
  *  See purple_util_write_data_to_file()
  *
  * Returns: TRUE if the file was written successfully.  FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean
 purple_util_write_data_to_cache_file(const char *filename, const char *data, gssize size);
 
@@ -91,7 +94,10 @@ purple_util_write_data_to_cache_file(con
  *  See purple_util_write_data_to_file()
  *
  * Returns: TRUE if the file was written successfully.  FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean
 purple_util_write_data_to_config_file(const char *filename, const char *data, gssize size);
 
@@ -108,7 +114,10 @@ purple_util_write_data_to_config_file(co
  *  See purple_util_write_data_to_file()
  *
  * Returns: TRUE if the file was written successfully.  FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean
 purple_util_write_data_to_data_file(const char *filename, const char *data, gssize size);
 
@@ -126,7 +135,10 @@ purple_util_write_data_to_data_file(cons
  *
  * Returns: An PurpleXmlNode tree of the contents of the given file.  Or NULL, if
  *         the file does not exist or there was an error reading the file.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *
 purple_util_read_xml_from_cache_file(const char *filename, const char *description);
 
@@ -144,7 +156,10 @@ purple_util_read_xml_from_cache_file(con
  *
  * Returns: An PurpleXmlNode tree of the contents of the given file.  Or NULL, if
  *         the file does not exist or there was an error reading the file.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *
 purple_util_read_xml_from_config_file(const char *filename, const char *description);
 
@@ -162,7 +177,10 @@ purple_util_read_xml_from_config_file(co
  *
  * Returns: An PurpleXmlNode tree of the contents of the given file.  Or NULL, if
  *         the file does not exist or there was an error reading the file.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *
 purple_util_read_xml_from_data_file(const char *filename, const char *description);
 
@@ -254,7 +272,10 @@ const char *purple_normalize(PurpleAccou
  * Checks, if a string is valid.
  *
  * Returns: TRUE, if string is valid, otherwise FALSE.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_validate(PurpleProtocol *protocol, const char *str);
 
 /**
@@ -330,7 +351,10 @@ char *purple_str_seconds_to_string(guint
  * Fills a NUL-terminated string with zeros and frees it.
  *
  * It should be used to free sensitive data, like passwords.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_str_wipe(gchar *str);
 
 /**
@@ -485,7 +509,10 @@ GValue *purple_value_dup(GValue *value);
  * @value:  The GValue to free.
  *
  * Frees a GValue.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_value_free(GValue *value);
 
 G_END_DECLS
diff --git a/libpurple/xfer.h b/libpurple/xfer.h
--- a/libpurple/xfer.h
+++ b/libpurple/xfer.h
@@ -201,7 +201,10 @@ void purple_xfer_request_denied(PurpleXf
  * Returns the socket file descriptor.
  *
  * Returns: The socket file descriptor.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_xfer_get_fd(PurpleXfer *xfer);
 
 /**
@@ -211,7 +214,10 @@ int purple_xfer_get_fd(PurpleXfer *xfer)
  * Returns the Watcher for the transfer.
  *
  * Returns: The watcher.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_xfer_get_watcher(PurpleXfer *xfer);
 
 /**
@@ -221,7 +227,10 @@ int purple_xfer_get_watcher(PurpleXfer *
  * Returns the type of file transfer.
  *
  * Returns: The type of the file transfer.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXferType purple_xfer_get_xfer_type(PurpleXfer *xfer);
 
 /**
@@ -240,7 +249,10 @@ PurpleAccount *purple_xfer_get_account(P
  * @who:  The name of the remote user.
  *
  * Sets the name of the remote user.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xfer_set_remote_user(PurpleXfer *xfer, const char *who);
 
 /**
@@ -285,7 +297,10 @@ gboolean purple_xfer_get_visible(PurpleX
  * Returns true if the file transfer was cancelled.
  *
  * Returns: Whether or not the transfer was cancelled.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_xfer_is_cancelled(PurpleXfer *xfer);
 
 /**
@@ -416,7 +431,10 @@ gint64 purple_xfer_get_end_time(PurpleXf
  * @fd:        The file descriptor.
  *
  * Sets the socket file descriptor.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xfer_set_fd(PurpleXfer *xfer, int fd);
 
 /**
@@ -425,7 +443,10 @@ void purple_xfer_set_fd(PurpleXfer *xfer
  * @watcher:   The watcher.
  *
  * Sets the watcher for the file transfer.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xfer_set_watcher(PurpleXfer *xfer, int watcher);
 
 /**
@@ -443,7 +464,10 @@ void purple_xfer_set_completed(PurpleXfe
  * @status:    The current status.
  *
  * Sets the current status for the file transfer.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xfer_set_status(PurpleXfer *xfer, PurpleXferStatus status);
 
 /**
@@ -476,7 +500,10 @@ void purple_xfer_set_message(PurpleXfer 
  * Returns the message for the file transfer.
  *
  * Returns: The message.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_xfer_get_message(PurpleXfer *xfer);
 
 /**
@@ -512,7 +539,10 @@ void purple_xfer_set_size(PurpleXfer *xf
  * @local_port:    The local port.
  *
  * Sets the local port of the file transfer.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xfer_set_local_port(PurpleXfer *xfer, guint16 local_port);
 
 /**
@@ -683,7 +713,10 @@ void purple_xfer_ui_ready(PurpleXfer *xf
  * Allows the protocol to signal it's ready to send/receive data (depending on
  * the direction of the file transfer. Used when the protocol provides read/write
  * ops and cannot/does not provide a raw fd to the core.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xfer_protocol_ready(PurpleXfer *xfer);
 
 /**
@@ -742,7 +775,10 @@ void purple_xfer_prepare_thumbnail(Purpl
  * The standard _get_type function for #GType's.
  *
  * Returns: The #GType for the #PurpleXferUiOps boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_xfer_ui_ops_get_type(void);
 
 /**
@@ -838,7 +874,10 @@ struct _PurpleProtocolXferInterface {
  * Checks whether or not we can transfer a file to @who.
  *
  * Returns: TRUE on success, FALSE otherwise.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_xfer_can_receive(PurpleProtocolXfer *prplxfer, PurpleConnection *connection, const gchar *who);
 
 /**
@@ -849,7 +888,10 @@ gboolean purple_protocol_xfer_can_receiv
  * @filename: The name of the file to send.
  *
  * Sends @filename to @who.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_xfer_send_file(PurpleProtocolXfer *prplxfer, PurpleConnection *connection, const gchar *who, const gchar *filename);
 
 /**
@@ -861,7 +903,10 @@ void purple_protocol_xfer_send_file(Purp
  * Creates a new #PurpleXfer to @who.
  *
  * Returns: (transfer full): A new #PurpleXfer instance.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXfer *purple_protocol_xfer_new_xfer(PurpleProtocolXfer *prplxfer, PurpleConnection *connection, const gchar *who);
 
 G_END_DECLS
diff --git a/libpurple/xmlnode.h b/libpurple/xmlnode.h
--- a/libpurple/xmlnode.h
+++ b/libpurple/xmlnode.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_XMLNODE  (purple_xmlnode_get_type())
 
 /**
@@ -89,7 +91,10 @@ G_BEGIN_DECLS
  * The standard _get_type function for registered #GType's.
  *
  * Returns: The #GType for the #PurpleXmlNode boxed structure.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_xmlnode_get_type(void);
 
 /**
@@ -99,7 +104,10 @@ GType purple_xmlnode_get_type(void);
  * Creates a new PurpleXmlNode.
  *
  * Returns: The new node.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_new(const char *name);
 
 /**
@@ -110,7 +118,10 @@ PurpleXmlNode *purple_xmlnode_new(const 
  * Creates a new PurpleXmlNode child.
  *
  * Returns: The new child node.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_new_child(PurpleXmlNode *parent, const char *name);
 
 /**
@@ -119,7 +130,10 @@ PurpleXmlNode *purple_xmlnode_new_child(
  * @child:  The child node to insert into parent.
  *
  * Inserts a node into a node as a child.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_insert_child(PurpleXmlNode *parent, PurpleXmlNode *child);
 
 /**
@@ -130,7 +144,10 @@ void purple_xmlnode_insert_child(PurpleX
  * Gets a child node named name.
  *
  * Returns: The child or NULL.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_get_child(const PurpleXmlNode *parent, const char *name);
 
 /**
@@ -142,7 +159,10 @@ PurpleXmlNode *purple_xmlnode_get_child(
  * Gets a child node named name in a namespace.
  *
  * Returns: The child or NULL.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_get_child_with_namespace(const PurpleXmlNode *parent, const char *name, const char *xmlns);
 
 /**
@@ -152,7 +172,10 @@ PurpleXmlNode *purple_xmlnode_get_child_
  * Gets the next node with the same name as node.
  *
  * Returns: The twin of node or NULL.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_get_next_twin(PurpleXmlNode *node);
 
 /**
@@ -163,7 +186,10 @@ PurpleXmlNode *purple_xmlnode_get_next_t
  *               null-terminated you can pass in -1.
  *
  * Inserts data into a node.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_insert_data(PurpleXmlNode *node, const char *data, gssize size);
 
 /**
@@ -174,7 +200,10 @@ void purple_xmlnode_insert_data(PurpleXm
  *
  * Returns: The data from the node or NULL. This data is in raw escaped format.
  *         You must g_free this string when finished using it.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 char *purple_xmlnode_get_data(const PurpleXmlNode *node);
 
 /**
@@ -185,7 +214,10 @@ char *purple_xmlnode_get_data(const Purp
  *
  * Returns: The data from the node, in unescaped form.   You must g_free
  *         this string when finished using it.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 char *purple_xmlnode_get_data_unescaped(const PurpleXmlNode *node);
 
 /**
@@ -195,7 +227,10 @@ char *purple_xmlnode_get_data_unescaped(
  * @value: The value of the attribute.
  *
  * Sets an attribute for a node.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_set_attrib(PurpleXmlNode *node, const char *attr, const char *value);
 
 /**
@@ -207,7 +242,10 @@ void purple_xmlnode_set_attrib(PurpleXml
  * @value:  The value of the attribute
  *
  * Sets a namespaced attribute for a node
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_set_attrib_full(PurpleXmlNode *node, const char *attr, const char *xmlns,
 		const char *prefix, const char *value);
 
@@ -219,7 +257,10 @@ void purple_xmlnode_set_attrib_full(Purp
  * Gets an attribute from a node.
  *
  * Returns: The value of the attribute.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_xmlnode_get_attrib(const PurpleXmlNode *node, const char *attr);
 
 /**
@@ -231,7 +272,10 @@ const char *purple_xmlnode_get_attrib(co
  * Gets a namespaced attribute from a node
  *
  * Returns: The value of the attribute/
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_xmlnode_get_attrib_with_namespace(const PurpleXmlNode *node, const char *attr, const char *xmlns);
 
 /**
@@ -240,7 +284,10 @@ const char *purple_xmlnode_get_attrib_wi
  * @attr: The attribute to remove.
  *
  * Removes an attribute from a node.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_remove_attrib(PurpleXmlNode *node, const char *attr);
 
 /**
@@ -250,7 +297,10 @@ void purple_xmlnode_remove_attrib(Purple
  * @xmlns: The namespace of the attribute to remove
  *
  * Removes a namespaced attribute from a node
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_remove_attrib_with_namespace(PurpleXmlNode *node, const char *attr, const char *xmlns);
 
 /**
@@ -259,7 +309,10 @@ void purple_xmlnode_remove_attrib_with_n
  * @xmlns: The namespace of the node
  *
  * Sets the namespace of a node
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_set_namespace(PurpleXmlNode *node, const char *xmlns);
 
 /**
@@ -269,7 +322,10 @@ void purple_xmlnode_set_namespace(Purple
  * Returns the namespace of a node
  *
  * Returns: The namespace of this node
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_xmlnode_get_namespace(const PurpleXmlNode *node);
 
 /**
@@ -292,7 +348,10 @@ const char *purple_xmlnode_get_namespace
  * though the namespace for 'element' is "http://example.org/ns1".
  *
  * Returns: The default namespace of this node
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_xmlnode_get_default_namespace(const PurpleXmlNode *node);
 
 /**
@@ -303,7 +362,10 @@ const char *purple_xmlnode_get_default_n
  * Returns the defined namespace for a prefix.
  *
  * Returns: The namespace for this prefix.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_xmlnode_get_prefix_namespace(const PurpleXmlNode *node, const char *prefix);
 
 /**
@@ -312,7 +374,10 @@ const char *purple_xmlnode_get_prefix_na
  * @prefix: The prefix of the node
  *
  * Sets the prefix of a node
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_set_prefix(PurpleXmlNode *node, const char *prefix);
 
 /**
@@ -322,7 +387,10 @@ void purple_xmlnode_set_prefix(PurpleXml
  * Returns the prefix of a node
  *
  * Returns: The prefix of this node
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_xmlnode_get_prefix(const PurpleXmlNode *node);
 
 /**
@@ -336,7 +404,10 @@ const char *purple_xmlnode_get_prefix(co
  * (prefixed attributes may still exist), and that this usage may
  * break some applications (SOAP / XPath apparently often rely on
  * the prefixes having the same name.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_strip_prefixes(PurpleXmlNode *node);
 
 /**
@@ -346,7 +417,10 @@ void purple_xmlnode_strip_prefixes(Purpl
  * Gets the parent node.
  *
  * Returns: The parent or NULL.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_get_parent(const PurpleXmlNode *child);
 
 /**
@@ -358,7 +432,10 @@ PurpleXmlNode *purple_xmlnode_get_parent
  *
  * Returns: The node represented as a string.  You must
  *         g_free this string when finished using it.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 char *purple_xmlnode_to_str(const PurpleXmlNode *node, int *len);
 
 /**
@@ -371,7 +448,10 @@ char *purple_xmlnode_to_str(const Purple
  * Returns: The node as human readable string including
  *         tab and new line characters.  You must
  *         g_free this string when finished using it.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 char *purple_xmlnode_to_formatted_str(const PurpleXmlNode *node, int *len);
 
 /**
@@ -385,7 +465,10 @@ char *purple_xmlnode_to_formatted_str(co
  * into a tree of nodes, and return the PurpleXmlNode of the root.
  *
  * Returns: The new node.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_from_str(const char *str, gssize size);
 
 /**
@@ -395,7 +478,10 @@ PurpleXmlNode *purple_xmlnode_from_str(c
  * Creates a new node from the source node.
  *
  * Returns: A new copy of the src node.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_copy(const PurpleXmlNode *src);
 
 /**
@@ -403,7 +489,10 @@ PurpleXmlNode *purple_xmlnode_copy(const
  * @node: The node to free.
  *
  * Frees a node and all of its children.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xmlnode_free(PurpleXmlNode *node);
 
 /**
@@ -420,7 +509,10 @@ void purple_xmlnode_free(PurpleXmlNode *
  * into a tree of nodes, and return the PurpleXmlNode of the root.
  *
  * Returns: The new node or NULL if an error occurred.
+ *
+ * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleXmlNode *purple_xmlnode_from_file(const char *dir, const char *filename,
 		const char *description, const char *process);
 
