# HG changeset patch
# Node ID 7349d70e5358
# Parent  63de4915950b
diff --git a/libpurple/blistnode.h b/libpurple/blistnode.h
--- a/libpurple/blistnode.h
+++ b/libpurple/blistnode.h
@@ -29,6 +29,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_BLIST_NODE             (purple_blist_node_get_type())
 #define PURPLE_BLIST_NODE(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_BLIST_NODE, PurpleBlistNode))
 #define PURPLE_BLIST_NODE_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_BLIST_NODE, PurpleBlistNodeClass))
@@ -250,6 +252,7 @@ void purple_blist_node_remove_setting(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_node_set_transient(PurpleBlistNode *node, gboolean transient);
 
 /**
@@ -262,6 +265,7 @@ void purple_blist_node_set_transient(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_blist_node_is_transient(PurpleBlistNode *node);
 
 /**
diff --git a/libpurple/buddy.h b/libpurple/buddy.h
--- a/libpurple/buddy.h
+++ b/libpurple/buddy.h
@@ -44,6 +44,7 @@ typedef struct _PurpleBuddyClass PurpleB
 #include "media.h"
 #include "purpleaccount.h"
 #include "purplepresence.h"
+#include "purpleversion.h"
 #include "status.h"
 
 /**
@@ -130,6 +131,7 @@ PurpleBuddy *purple_buddy_new(PurpleAcco
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_buddy_get_id(PurpleBuddy *buddy);
 
 /**
diff --git a/libpurple/buddyicon.h b/libpurple/buddyicon.h
--- a/libpurple/buddyicon.h
+++ b/libpurple/buddyicon.h
@@ -50,6 +50,7 @@ typedef struct _PurpleBuddyIconSpec Purp
 #include "image.h"
 #include "protocols.h"
 #include "purpleaccount.h"
+#include "purpleversion.h"
 #include "util.h"
 
 /**
@@ -177,6 +178,7 @@ purple_buddy_icon_set_data(PurpleBuddyIc
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_buddy_icon_save_to_filename(PurpleBuddyIcon *icon, const gchar *filename, GError **error);
 
 /**
@@ -233,6 +235,7 @@ gconstpointer purple_buddy_icon_get_data
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GInputStream *purple_buddy_icon_get_stream(PurpleBuddyIcon *icon);
 
 /**
@@ -520,6 +523,7 @@ PurpleBuddyIconSpec *purple_buddy_icon_s
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_buddy_icon_spec_free(PurpleBuddyIconSpec *spec);
 
 /**
diff --git a/libpurple/buddylist.h b/libpurple/buddylist.h
--- a/libpurple/buddylist.h
+++ b/libpurple/buddylist.h
@@ -30,6 +30,7 @@
 
 #include "buddy.h"
 #include "purpleaccount.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_BUDDY_LIST (purple_buddy_list_get_type())
 typedef struct _PurpleBuddyList PurpleBuddyList;
@@ -67,6 +68,7 @@ const gchar *
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleBlistWalkFunc)(PurpleBlistNode *node, gpointer data);
 
 /**************************************************************************/
@@ -180,6 +182,7 @@ G_DECLARE_DERIVABLE_TYPE(PurpleBuddyList
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBuddyList *purple_blist_get_default(void);
 
 /**
@@ -191,6 +194,7 @@ PurpleBuddyList *purple_blist_get_defaul
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBlistNode *purple_blist_get_default_root(void);
 
 /**
@@ -447,6 +451,7 @@ void purple_blist_remove_account(PurpleA
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_walk(PurpleBlistWalkFunc group_func, PurpleBlistWalkFunc chat_func, PurpleBlistWalkFunc meta_contact_func, PurpleBlistWalkFunc contact_func, gpointer data);
 
 /**
@@ -458,6 +463,7 @@ void purple_blist_walk(PurpleBlistWalkFu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_blist_get_default_group_name(void);
 
 /****************************************************************************************/
@@ -521,6 +527,7 @@ void purple_blist_request_add_group(void
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_new_node(PurpleBuddyList *list, PurpleBlistNode *node);
 
 /**
@@ -532,6 +539,7 @@ void purple_blist_new_node(PurpleBuddyLi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_update_node(PurpleBuddyList *list, PurpleBlistNode *node);
 
 /**
@@ -546,6 +554,7 @@ void purple_blist_update_node(PurpleBudd
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_save_node(PurpleBuddyList *list, PurpleBlistNode *node);
 
 /**
@@ -561,6 +570,7 @@ void purple_blist_save_node(PurpleBuddyL
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_save_account(PurpleBuddyList *list, PurpleAccount *account);
 
 /**************************************************************************/
@@ -578,6 +588,7 @@ void purple_blist_save_account(PurpleBud
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_blist_set_ui(GType type);
 
 /**
diff --git a/libpurple/connection.h b/libpurple/connection.h
--- a/libpurple/connection.h
+++ b/libpurple/connection.h
@@ -29,6 +29,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_CONNECTION  purple_connection_get_type()
@@ -99,7 +101,9 @@ typedef enum {
  *
  * Since: 3.0.0
  */
-#define PURPLE_CONNECTION_ERROR (g_quark_from_static_string("purple-connection-error"))
+#define PURPLE_CONNECTION_ERROR \
+	g_quark_from_static_string("purple-connection-error") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 #include "purpleaccount.h"
 #include "purpleconnectionerrorinfo.h"
@@ -195,6 +199,7 @@ void
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_connection_connect(PurpleConnection *connection, GError **error);
 
 /**
@@ -214,6 +219,7 @@ gboolean purple_connection_connect(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_connection_disconnect(PurpleConnection *connection, GError **error);
 
 /**
@@ -238,6 +244,7 @@ void purple_connection_set_state(PurpleC
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_connection_set_flags(PurpleConnection *gc, PurpleConnectionFlags flags);
 
 /**
@@ -278,6 +285,7 @@ PurpleConnectionState purple_connection_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConnectionFlags purple_connection_get_flags(PurpleConnection *gc);
 
 /**
@@ -300,6 +308,7 @@ PurpleConnectionFlags purple_connection_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_connection_get_id(PurpleConnection *connection);
 
 /**
@@ -347,6 +356,7 @@ const char *purple_connection_get_passwo
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_connection_set_password(PurpleConnection *connection, const char *password);
 
 /**
@@ -360,6 +370,7 @@ void purple_connection_set_password(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GSList *purple_connection_get_active_chats(PurpleConnection *gc);
 
 /**
@@ -408,6 +419,7 @@ purple_connection_error(PurpleConnection
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConnectionErrorInfo *
 purple_connection_get_error_info(PurpleConnection *gc);
 
@@ -427,6 +439,7 @@ purple_connection_get_error_info(PurpleC
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_connection_g_error(PurpleConnection *pc, const GError *error);
 
 /**
@@ -442,6 +455,7 @@ void purple_connection_g_error(PurpleCon
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_connection_take_error(PurpleConnection *pc, GError *error);
 
 /**
@@ -478,6 +492,7 @@ purple_connection_error_is_fatal (Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_connection_update_last_received(PurpleConnection *gc);
 
 /**************************************************************************/
diff --git a/libpurple/core.h b/libpurple/core.h
--- a/libpurple/core.h
+++ b/libpurple/core.h
@@ -30,6 +30,7 @@
 #include <glib-object.h>
 
 #include "purpleui.h"
+#include "purpleversion.h"
 
 typedef struct PurpleCore PurpleCore;
 
@@ -87,6 +88,7 @@ PurpleCore *purple_get_core(void);
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer purple_core_get_settings_backend(void);
 
 /**
diff --git a/libpurple/countingnode.h b/libpurple/countingnode.h
--- a/libpurple/countingnode.h
+++ b/libpurple/countingnode.h
@@ -30,6 +30,7 @@
 #include <glib-object.h>
 
 #include "blistnode.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_COUNTING_NODE             (purple_counting_node_get_type())
 #define PURPLE_COUNTING_NODE(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_COUNTING_NODE, PurpleCountingNode))
@@ -82,6 +83,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GType purple_counting_node_get_type(void);
 
 /**
@@ -94,6 +96,7 @@ GType purple_counting_node_get_type(void
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_counting_node_get_total_size(PurpleCountingNode *counter);
 
 /**
@@ -107,6 +110,7 @@ int purple_counting_node_get_total_size(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_counting_node_get_current_size(PurpleCountingNode *counter);
 
 /**
@@ -119,6 +123,7 @@ int purple_counting_node_get_current_siz
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_counting_node_get_online_count(PurpleCountingNode *counter);
 
 /**
@@ -132,6 +137,7 @@ int purple_counting_node_get_online_coun
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_counting_node_change_total_size(PurpleCountingNode *counter, int delta);
 
 /**
@@ -145,6 +151,7 @@ void purple_counting_node_change_total_s
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_counting_node_change_current_size(PurpleCountingNode *counter, int delta);
 
 /**
@@ -158,6 +165,7 @@ void purple_counting_node_change_current
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_counting_node_change_online_count(PurpleCountingNode *counter, int delta);
 
 /**
@@ -169,6 +177,7 @@ void purple_counting_node_change_online_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_counting_node_set_total_size(PurpleCountingNode *counter, int totalsize);
 
 /**
@@ -181,6 +190,7 @@ void purple_counting_node_set_total_size
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_counting_node_set_current_size(PurpleCountingNode *counter, int currentsize);
 
 /**
@@ -192,6 +202,7 @@ void purple_counting_node_set_current_si
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_counting_node_set_online_count(PurpleCountingNode *counter, int onlinecount);
 
 G_END_DECLS
diff --git a/libpurple/idle.h b/libpurple/idle.h
--- a/libpurple/idle.h
+++ b/libpurple/idle.h
@@ -30,6 +30,7 @@
 #include <glib-object.h>
 
 #include "purpleidleui.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -67,6 +68,7 @@ void purple_idle_set(time_t time);
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_idle_set_ui(PurpleIdleUi *ui);
 
 /**
@@ -79,6 +81,7 @@ void purple_idle_set_ui(PurpleIdleUi *ui
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleIdleUi *purple_idle_get_ui(void);
 
 /**
diff --git a/libpurple/media-gst.h b/libpurple/media-gst.h
--- a/libpurple/media-gst.h
+++ b/libpurple/media-gst.h
@@ -28,6 +28,7 @@
 
 #include "media.h"
 #include "mediamanager.h"
+#include "purpleversion.h"
 
 #include <gst/gst.h>
 
@@ -153,8 +154,8 @@ GstElement *purple_media_manager_get_ele
  *
  * Since: 3.0.0
  */
-GList *purple_media_manager_enumerate_elements(PurpleMediaManager *manager,
-		PurpleMediaElementType type);
+PURPLE_AVAILABLE_IN_3_0
+GList *purple_media_manager_enumerate_elements(PurpleMediaManager *manager, PurpleMediaElementType type);
 
 /**
  * purple_media_manager_get_element_info:
diff --git a/libpurple/network.h b/libpurple/network.h
--- a/libpurple/network.h
+++ b/libpurple/network.h
@@ -29,6 +29,8 @@
 #include <glib.h>
 #include <gio/gio.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 /**************************************************************************/
@@ -69,6 +71,7 @@ const char *purple_network_get_public_ip
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_network_discover_my_ip(void);
 
 /**
diff --git a/libpurple/notify.h b/libpurple/notify.h
--- a/libpurple/notify.h
+++ b/libpurple/notify.h
@@ -30,6 +30,8 @@
 #include <glib-object.h>
 #include <glib.h>
 
+#include "purpleversion.h"
+
 typedef struct _PurpleNotifyUserInfoEntry	PurpleNotifyUserInfoEntry;
 
 #define  PURPLE_TYPE_NOTIFY_USER_INFO  (purple_notify_user_info_get_type())
@@ -343,6 +345,7 @@ PurpleNotifySearchColumn *purple_notify_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_notify_searchresult_column_get_title(const PurpleNotifySearchColumn *column);
 
 /**
@@ -354,6 +357,7 @@ const char *purple_notify_searchresult_c
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notify_searchresult_column_set_visible(PurpleNotifySearchColumn *column, gboolean visible);
 
 /**
@@ -366,6 +370,7 @@ void purple_notify_searchresult_column_s
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_notify_searchresult_column_is_visible(const PurpleNotifySearchColumn *column);
 
 /**
@@ -590,6 +595,7 @@ void purple_notify_user_info_prepend_pai
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notify_user_info_prepend_pair_plaintext(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
 
 /**
@@ -634,6 +640,7 @@ PurpleNotifyUserInfoEntry *purple_notify
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notify_user_info_entry_destroy(PurpleNotifyUserInfoEntry *user_info_entry);
 
 /**
diff --git a/libpurple/protocols.h b/libpurple/protocols.h
--- a/libpurple/protocols.h
+++ b/libpurple/protocols.h
@@ -32,6 +32,7 @@
 
 #include "media.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 #include "status.h"
 
 G_BEGIN_DECLS
@@ -86,6 +87,7 @@ void purple_protocol_got_user_status(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_got_user_status_with_attributes(PurpleAccount *account, const gchar *name, const gchar *status_id, GHashTable *attributes);
 
 /**
diff --git a/libpurple/purpleaccount.h b/libpurple/purpleaccount.h
--- a/libpurple/purpleaccount.h
+++ b/libpurple/purpleaccount.h
@@ -41,6 +41,7 @@ typedef struct _PurpleAccount PurpleAcco
 #include "purplecontactinfo.h"
 #include "purpleprotocol.h"
 #include "purpleproxyinfo.h"
+#include "purpleversion.h"
 #include "status.h"
 
 G_BEGIN_DECLS
@@ -93,6 +94,7 @@ void purple_account_disconnect(PurpleAcc
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_account_is_disconnecting(PurpleAccount *account);
 
 /**
@@ -259,6 +261,7 @@ void purple_account_set_status(PurpleAcc
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_set_status_attrs(PurpleAccount *account, const char *status_id, gboolean active, GHashTable *attrs);
 
 /**
@@ -362,6 +365,7 @@ const char *purple_account_get_protocol_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleProtocol *purple_account_get_protocol(PurpleAccount *account);
 
 /**
@@ -629,6 +633,7 @@ const PurpleConnectionErrorInfo *purple_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_set_error(PurpleAccount *account, PurpleConnectionErrorInfo *info);
 
 /**
@@ -642,6 +647,7 @@ void purple_account_set_error(PurpleAcco
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_set_require_password(PurpleAccount *account, gboolean require_password);
 
 /**
@@ -654,6 +660,7 @@ void purple_account_set_require_password
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_account_get_require_password(PurpleAccount *account);
 
 /**
@@ -674,6 +681,7 @@ gboolean purple_account_get_require_pass
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_freeze_notify_settings(PurpleAccount *account);
 
 /**
@@ -686,6 +694,7 @@ void purple_account_freeze_notify_settin
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_thaw_notify_settings(PurpleAccount *account);
 
 G_END_DECLS
diff --git a/libpurple/purpleaccountmanager.h b/libpurple/purpleaccountmanager.h
--- a/libpurple/purpleaccountmanager.h
+++ b/libpurple/purpleaccountmanager.h
@@ -27,10 +27,13 @@
 #include <glib-object.h>
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_ACCOUNT_MANAGER (purple_account_manager_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleAccountManager, purple_account_manager, PURPLE, ACCOUNT_MANAGER, GObject)
 
 /**
@@ -42,6 +45,7 @@ G_DECLARE_FINAL_TYPE(PurpleAccountManage
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleAccountManagerForeachFunc)(PurpleAccount *account, gpointer data);
 
 /**
@@ -61,6 +65,7 @@ typedef void (*PurpleAccountManagerForea
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccountManager *purple_account_manager_get_default(void);
 
 /**
@@ -72,6 +77,7 @@ PurpleAccountManager *purple_account_man
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_account_manager_get_default_as_model(void);
 
 /**
@@ -83,6 +89,7 @@ GListModel *purple_account_manager_get_d
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_manager_add(PurpleAccountManager *manager, PurpleAccount *account);
 
 /**
@@ -94,6 +101,7 @@ void purple_account_manager_add(PurpleAc
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_manager_remove(PurpleAccountManager *manager, PurpleAccount *account);
 
 /**
@@ -106,6 +114,7 @@ void purple_account_manager_remove(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_manager_reorder(PurpleAccountManager *manager, PurpleAccount *account, guint new_index);
 
 /**
@@ -119,6 +128,7 @@ void purple_account_manager_reorder(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_account_manager_get_enabled(PurpleAccountManager *manager);
 
 /**
@@ -132,6 +142,7 @@ GList *purple_account_manager_get_enable
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_account_manager_get_disabled(PurpleAccountManager *manager);
 
 /**
@@ -145,6 +156,7 @@ GList *purple_account_manager_get_disabl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_account_manager_get_connected(PurpleAccountManager *manager);
 
 /**
@@ -158,6 +170,7 @@ GList *purple_account_manager_get_connec
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_account_manager_find_by_id(PurpleAccountManager *manager, const gchar *id);
 
 /**
@@ -173,6 +186,7 @@ PurpleAccount *purple_account_manager_fi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_account_manager_find(PurpleAccountManager *manager, const gchar *username, const gchar *protocol_id);
 
 /**
@@ -188,6 +202,7 @@ PurpleAccount *purple_account_manager_fi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount * purple_account_manager_find_custom(PurpleAccountManager *manager, GEqualFunc func, gconstpointer data);
 
 /**
@@ -200,6 +215,7 @@ PurpleAccount * purple_account_manager_f
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_account_manager_foreach(PurpleAccountManager *manager, PurpleAccountManagerForeachFunc callback, gpointer data);
 
 G_END_DECLS
diff --git a/libpurple/purpleaccountoption.h b/libpurple/purpleaccountoption.h
--- a/libpurple/purpleaccountoption.h
+++ b/libpurple/purpleaccountoption.h
@@ -30,6 +30,7 @@
 #include <glib-object.h>
 
 #include "prefs.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_ACCOUNT_OPTION (purple_account_option_get_type())
 
@@ -72,6 +73,7 @@ PurpleAccountOption *purple_account_opti
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccountOption *purple_account_option_copy(PurpleAccountOption *option);
 
 /**
diff --git a/libpurple/purpleaccountpresence.h b/libpurple/purpleaccountpresence.h
--- a/libpurple/purpleaccountpresence.h
+++ b/libpurple/purpleaccountpresence.h
@@ -28,6 +28,7 @@
 
 #include "purpleaccount.h"
 #include "purplepresence.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -52,6 +53,7 @@ G_DECLARE_FINAL_TYPE(PurpleAccountPresen
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccountPresence *purple_account_presence_new(PurpleAccount *account);
 
 /**
diff --git a/libpurple/purpleaccountusersplit.h b/libpurple/purpleaccountusersplit.h
--- a/libpurple/purpleaccountusersplit.h
+++ b/libpurple/purpleaccountusersplit.h
@@ -29,6 +29,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_ACCOUNT_USER_SPLIT (purple_account_user_split_get_type())
 
 /**
@@ -67,6 +69,7 @@ PurpleAccountUserSplit *purple_account_u
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccountUserSplit *purple_account_user_split_copy(PurpleAccountUserSplit *split);
 
 /**
diff --git a/libpurple/purpleaddcontactrequest.h b/libpurple/purpleaddcontactrequest.h
--- a/libpurple/purpleaddcontactrequest.h
+++ b/libpurple/purpleaddcontactrequest.h
@@ -27,6 +27,7 @@
 #include <glib-object.h>
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -41,6 +42,8 @@ G_BEGIN_DECLS
  */
 
 #define PURPLE_TYPE_ADD_CONTACT_REQUEST (purple_add_contact_request_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleAddContactRequest, purple_add_contact_request,
                      PURPLE, ADD_CONTACT_REQUEST, GObject)
 
@@ -57,6 +60,7 @@ G_DECLARE_FINAL_TYPE(PurpleAddContactReq
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAddContactRequest *purple_add_contact_request_new(PurpleAccount *account, const gchar *username);
 
 /**
@@ -69,6 +73,7 @@ PurpleAddContactRequest *purple_add_cont
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_add_contact_request_get_account(PurpleAddContactRequest *request);
 
 /**
@@ -81,6 +86,7 @@ PurpleAccount *purple_add_contact_reques
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_add_contact_request_get_username(PurpleAddContactRequest *request);
 
 /**
@@ -93,6 +99,7 @@ const gchar *purple_add_contact_request_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_add_contact_request_set_alias(PurpleAddContactRequest *request, const gchar *alias);
 
 /**
@@ -105,6 +112,7 @@ void purple_add_contact_request_set_alia
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_add_contact_request_get_alias(PurpleAddContactRequest *request);
 
 /**
@@ -117,6 +125,7 @@ const gchar *purple_add_contact_request_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_add_contact_request_set_message(PurpleAddContactRequest *request, const gchar *message);
 
 /**
@@ -129,6 +138,7 @@ void purple_add_contact_request_set_mess
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_add_contact_request_get_message(PurpleAddContactRequest *request);
 
 /**
@@ -142,6 +152,7 @@ const gchar *purple_add_contact_request_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_add_contact_request_add(PurpleAddContactRequest *request);
 
 G_END_DECLS
diff --git a/libpurple/purpleattachment.h b/libpurple/purpleattachment.h
--- a/libpurple/purpleattachment.h
+++ b/libpurple/purpleattachment.h
@@ -28,6 +28,8 @@
 
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_ATTACHMENT purple_attachment_get_type()
@@ -60,6 +62,7 @@ typedef void (*PurpleAttachmentForeachFu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAttachment *purple_attachment_new(guint64 id, const gchar *content_type);
 
 /**
@@ -72,6 +75,7 @@ PurpleAttachment *purple_attachment_new(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint64 purple_attachment_get_id(PurpleAttachment *attachment);
 
 /**
@@ -86,6 +90,7 @@ guint64 purple_attachment_get_id(PurpleA
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint64 *purple_attachment_get_hash_key(PurpleAttachment *attachment);
 
 /**
@@ -97,6 +102,7 @@ guint64 *purple_attachment_get_hash_key(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_attachment_set_id(PurpleAttachment *attachment, guint64 id);
 
 /**
@@ -109,6 +115,7 @@ void purple_attachment_set_id(PurpleAtta
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_attachment_get_content_type(PurpleAttachment *attachment);
 
 /**
@@ -121,6 +128,7 @@ const gchar *purple_attachment_get_conte
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_attachment_get_local_uri(PurpleAttachment *attachment);
 
 /**
@@ -132,6 +140,7 @@ const gchar *purple_attachment_get_local
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_attachment_set_local_uri(PurpleAttachment *attachment, const gchar *local_uri);
 
 /**
@@ -144,6 +153,7 @@ void purple_attachment_set_local_uri(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_attachment_get_remote_uri(PurpleAttachment *attachment);
 
 /**
@@ -155,6 +165,7 @@ const gchar *purple_attachment_get_remot
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_attachment_set_remote_uri(PurpleAttachment *attachment, const gchar *remote_uri);
 
 /**
@@ -167,6 +178,7 @@ void purple_attachment_set_remote_uri(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint64 purple_attachment_get_size(PurpleAttachment *attachment);
 
 /**
@@ -178,6 +190,7 @@ guint64 purple_attachment_get_size(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_attachment_set_size(PurpleAttachment *attachment, guint64 size);
 
 /**
@@ -191,6 +204,7 @@ void purple_attachment_set_size(PurpleAt
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gchar *purple_attachment_get_filename(PurpleAttachment *attachment);
 
 G_END_DECLS
diff --git a/libpurple/purpleauthorizationrequest.h b/libpurple/purpleauthorizationrequest.h
--- a/libpurple/purpleauthorizationrequest.h
+++ b/libpurple/purpleauthorizationrequest.h
@@ -27,6 +27,7 @@
 #include <glib-object.h>
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -42,6 +43,7 @@ G_BEGIN_DECLS
 
 #define PURPLE_TYPE_AUTHORIZATION_REQUEST (purple_authorization_request_get_type())
 
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleAuthorizationRequest, purple_authorization_request,
                      PURPLE, AUTHORIZATION_REQUEST, GObject)
 
@@ -58,6 +60,7 @@ G_DECLARE_FINAL_TYPE(PurpleAuthorization
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAuthorizationRequest *purple_authorization_request_new(PurpleAccount *account, const gchar *username);
 
 /**
@@ -70,6 +73,7 @@ PurpleAuthorizationRequest *purple_autho
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_authorization_request_get_account(PurpleAuthorizationRequest *request);
 
 /**
@@ -82,6 +86,7 @@ PurpleAccount *purple_authorization_requ
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_authorization_request_get_username(PurpleAuthorizationRequest *request);
 
 /**
@@ -94,6 +99,7 @@ const gchar *purple_authorization_reques
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_set_alias(PurpleAuthorizationRequest *request, const gchar *alias);
 
 /**
@@ -106,6 +112,7 @@ void purple_authorization_request_set_al
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_authorization_request_get_alias(PurpleAuthorizationRequest *request);
 
 /**
@@ -118,6 +125,7 @@ const gchar *purple_authorization_reques
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_set_message(PurpleAuthorizationRequest *request, const gchar *message);
 
 /**
@@ -130,6 +138,7 @@ void purple_authorization_request_set_me
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_authorization_request_get_message(PurpleAuthorizationRequest *request);
 
 /**
@@ -142,6 +151,7 @@ const gchar *purple_authorization_reques
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_set_add(PurpleAuthorizationRequest *request, gboolean add);
 
 /**
@@ -156,6 +166,7 @@ void purple_authorization_request_set_ad
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_authorization_request_get_add(PurpleAuthorizationRequest *request);
 
 /**
@@ -170,6 +181,7 @@ gboolean purple_authorization_request_ge
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_accept(PurpleAuthorizationRequest *request);
 
 /**
@@ -185,6 +197,7 @@ void purple_authorization_request_accept
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_deny(PurpleAuthorizationRequest *request, const gchar *message);
 
 G_END_DECLS
diff --git a/libpurple/purpleavatar.h b/libpurple/purpleavatar.h
--- a/libpurple/purpleavatar.h
+++ b/libpurple/purpleavatar.h
@@ -29,10 +29,13 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
 #include "purpletags.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_AVATAR (purple_avatar_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleAvatar, purple_avatar, PURPLE, AVATAR, GObject)
 
 /**
@@ -55,6 +58,7 @@ G_DECLARE_FINAL_TYPE(PurpleAvatar, purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_avatar_new_from_filename(const char *filename, GError **error);
 
 /**
@@ -68,6 +72,7 @@ PurpleAvatar *purple_avatar_new_from_fil
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_avatar_new_from_resource(const char *resource_path, GError **error);
 
 /**
@@ -80,6 +85,7 @@ PurpleAvatar *purple_avatar_new_from_res
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_avatar_get_filename(PurpleAvatar *avatar);
 
 /**
@@ -96,6 +102,7 @@ const char *purple_avatar_get_filename(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GdkPixbuf *purple_avatar_get_pixbuf(PurpleAvatar *avatar);
 
 /**
@@ -108,6 +115,7 @@ GdkPixbuf *purple_avatar_get_pixbuf(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_avatar_get_animated(PurpleAvatar *avatar);
 
 /**
@@ -121,6 +129,7 @@ gboolean purple_avatar_get_animated(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GdkPixbufAnimation *purple_avatar_get_animation(PurpleAvatar *avatar);
 
 /**
@@ -133,6 +142,7 @@ GdkPixbufAnimation *purple_avatar_get_an
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_avatar_get_tags(PurpleAvatar *avatar);
 
 G_END_DECLS
diff --git a/libpurple/purplebuddypresence.h b/libpurple/purplebuddypresence.h
--- a/libpurple/purplebuddypresence.h
+++ b/libpurple/purplebuddypresence.h
@@ -28,6 +28,7 @@
 
 #include "buddylist.h"
 #include "purplepresence.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -52,6 +53,7 @@ G_DECLARE_FINAL_TYPE(PurpleBuddyPresence
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBuddyPresence *purple_buddy_presence_new(PurpleBuddy *buddy);
 
 /**
diff --git a/libpurple/purplechanneljoindetails.h b/libpurple/purplechanneljoindetails.h
--- a/libpurple/purplechanneljoindetails.h
+++ b/libpurple/purplechanneljoindetails.h
@@ -26,9 +26,13 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_CHANNEL_JOIN_DETAILS (purple_channel_join_details_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleChannelJoinDetails, purple_channel_join_details, PURPLE, CHANNEL_JOIN_DETAILS, GObject)
 
 /**
@@ -52,6 +56,7 @@ G_DECLARE_FINAL_TYPE(PurpleChannelJoinDe
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleChannelJoinDetails *purple_channel_join_details_new(gboolean nickname_supported, gboolean password_supported);
 
 /**
@@ -64,6 +69,7 @@ PurpleChannelJoinDetails *purple_channel
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_channel_join_details_get_name(PurpleChannelJoinDetails *details);
 
 /**
@@ -75,6 +81,7 @@ const char *purple_channel_join_details_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_channel_join_details_set_name(PurpleChannelJoinDetails *details, const char *name);
 
 /**
@@ -87,6 +94,7 @@ void purple_channel_join_details_set_nam
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_channel_join_details_get_nickname(PurpleChannelJoinDetails *details);
 
 /**
@@ -98,6 +106,7 @@ const char *purple_channel_join_details_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_channel_join_details_set_nickname(PurpleChannelJoinDetails *details, const char *nickname);
 
 /**
@@ -110,6 +119,7 @@ void purple_channel_join_details_set_nic
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_channel_join_details_get_nickname_supported(PurpleChannelJoinDetails *details);
 
 /**
@@ -122,6 +132,7 @@ gboolean purple_channel_join_details_get
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_channel_join_details_get_password(PurpleChannelJoinDetails *details);
 
 /**
@@ -133,6 +144,7 @@ const char *purple_channel_join_details_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_channel_join_details_set_password(PurpleChannelJoinDetails *details, const char *password);
 
 /**
@@ -145,6 +157,7 @@ void purple_channel_join_details_set_pas
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_channel_join_details_get_password_supported(PurpleChannelJoinDetails *details);
 
 /**
@@ -163,6 +176,7 @@ gboolean purple_channel_join_details_get
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_channel_join_details_merge(PurpleChannelJoinDetails *source, PurpleChannelJoinDetails *destination);
 
 G_END_DECLS
diff --git a/libpurple/purplechatuser.h b/libpurple/purplechatuser.h
--- a/libpurple/purplechatuser.h
+++ b/libpurple/purplechatuser.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 /**
  * PurpleChatUser:
  *
@@ -92,6 +94,7 @@ PurpleChatUser *purple_chat_user_new(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_chat_user_set_chat(PurpleChatUser *chat_user,
                                PurpleChatConversation *chat);
 
@@ -105,6 +108,7 @@ void purple_chat_user_set_chat(PurpleCha
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleChatConversation *purple_chat_user_get_chat(PurpleChatUser *chat_user);
 
 /**
@@ -117,6 +121,7 @@ PurpleChatConversation *purple_chat_user
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_user_get_alias(PurpleChatUser *chat_user);
 
 /**
@@ -149,6 +154,7 @@ void purple_chat_user_set_flags(PurpleCh
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleChatUserFlags purple_chat_user_get_flags(PurpleChatUser *chat_user);
 
 /**
@@ -161,6 +167,7 @@ PurpleChatUserFlags purple_chat_user_get
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_chat_user_is_buddy(PurpleChatUser *chat_user);
 
 /**
diff --git a/libpurple/purpleconnectionerrorinfo.h b/libpurple/purpleconnectionerrorinfo.h
--- a/libpurple/purpleconnectionerrorinfo.h
+++ b/libpurple/purpleconnectionerrorinfo.h
@@ -26,6 +26,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 /**
@@ -136,6 +138,7 @@ GType purple_connection_error_info_get_t
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConnectionErrorInfo *purple_connection_error_info_new(PurpleConnectionError type, const gchar *description);
 
 /**
@@ -148,6 +151,7 @@ PurpleConnectionErrorInfo *purple_connec
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConnectionErrorInfo *purple_connection_error_info_copy(PurpleConnectionErrorInfo *info);
 
 /**
@@ -158,6 +162,7 @@ PurpleConnectionErrorInfo *purple_connec
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_connection_error_info_free(PurpleConnectionErrorInfo *info);
 
 G_END_DECLS
diff --git a/libpurple/purplecontact.h b/libpurple/purplecontact.h
--- a/libpurple/purplecontact.h
+++ b/libpurple/purplecontact.h
@@ -29,10 +29,13 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
 #include "purplecontactinfo.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_CONTACT (purple_contact_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleContact, purple_contact, PURPLE, CONTACT,
                      PurpleContactInfo)
 
@@ -59,6 +62,7 @@ G_DECLARE_FINAL_TYPE(PurpleContact, purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContact *purple_contact_new(PurpleAccount *account, const gchar *id);
 
 /**
@@ -72,6 +76,7 @@ PurpleContact *purple_contact_new(Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_contact_get_account(PurpleContact *contact);
 
 G_END_DECLS
diff --git a/libpurple/purplecontactinfo.h b/libpurple/purplecontactinfo.h
--- a/libpurple/purplecontactinfo.h
+++ b/libpurple/purplecontactinfo.h
@@ -29,6 +29,7 @@
 #include "purpleavatar.h"
 #include "purplepresence.h"
 #include "purpletags.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -49,6 +50,7 @@ G_DECLARE_DERIVABLE_TYPE(PurpleContactIn
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum {
 	PURPLE_CONTACT_INFO_PERMISSION_UNSET = 0,
 	PURPLE_CONTACT_INFO_PERMISSION_ALLOW,
@@ -92,6 +94,7 @@ struct _PurpleContactInfoClass {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_contact_info_new(const gchar *id);
 
 /**
@@ -107,6 +110,7 @@ PurpleContactInfo *purple_contact_info_n
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_contact_info_get_id(PurpleContactInfo *info);
 
 /**
@@ -120,6 +124,7 @@ const gchar *purple_contact_info_get_id(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_id(PurpleContactInfo *info, const char *id);
 
 /**
@@ -132,6 +137,7 @@ void purple_contact_info_set_id(PurpleCo
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_contact_info_get_username(PurpleContactInfo *info);
 
 /**
@@ -146,6 +152,7 @@ const gchar *purple_contact_info_get_use
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_username(PurpleContactInfo *info, const gchar *username);
 
 /**
@@ -160,6 +167,7 @@ void purple_contact_info_set_username(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_contact_info_get_display_name(PurpleContactInfo *info);
 
 /**
@@ -174,6 +182,7 @@ const gchar *purple_contact_info_get_dis
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_display_name(PurpleContactInfo *info, const gchar *display_name);
 
 /**
@@ -186,6 +195,7 @@ void purple_contact_info_set_display_nam
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_contact_info_get_alias(PurpleContactInfo *info);
 
 /**
@@ -199,6 +209,7 @@ const gchar *purple_contact_info_get_ali
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_alias(PurpleContactInfo *info, const gchar *alias);
 
 /**
@@ -212,6 +223,7 @@ void purple_contact_info_set_alias(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_contact_info_get_color(PurpleContactInfo *info);
 
 /**
@@ -227,6 +239,7 @@ const char *purple_contact_info_get_colo
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_color(PurpleContactInfo *info, const char *color);
 
 /**
@@ -239,6 +252,7 @@ void purple_contact_info_set_color(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_contact_info_get_email(PurpleContactInfo *info);
 
 /**
@@ -250,6 +264,7 @@ const char *purple_contact_info_get_emai
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_email(PurpleContactInfo *info, const char *email);
 
 /**
@@ -262,6 +277,7 @@ void purple_contact_info_set_email(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_contact_info_get_phone_number(PurpleContactInfo *info);
 
 /**
@@ -273,6 +289,7 @@ const char *purple_contact_info_get_phon
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_phone_number(PurpleContactInfo *info, const char *phone_number);
 
 /**
@@ -285,6 +302,7 @@ void purple_contact_info_set_phone_numbe
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GTimeZone *purple_contact_info_get_time_zone(PurpleContactInfo *info);
 
 /**
@@ -296,6 +314,7 @@ GTimeZone *purple_contact_info_get_time_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_time_zone(PurpleContactInfo *info, GTimeZone *timezone);
 
 /**
@@ -308,6 +327,7 @@ void purple_contact_info_set_time_zone(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_contact_info_get_note(PurpleContactInfo *info);
 
 /**
@@ -319,6 +339,7 @@ const char *purple_contact_info_get_note
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_note(PurpleContactInfo *info, const char *note);
 
 /**
@@ -331,6 +352,7 @@ void purple_contact_info_set_note(Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_contact_info_get_avatar(PurpleContactInfo *info);
 
 /**
@@ -345,6 +367,7 @@ PurpleAvatar *purple_contact_info_get_av
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_avatar(PurpleContactInfo *info, PurpleAvatar *avatar);
 
 /**
@@ -358,6 +381,7 @@ void purple_contact_info_set_avatar(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePresence *purple_contact_info_get_presence(PurpleContactInfo *info);
 
 /**
@@ -370,6 +394,7 @@ PurplePresence *purple_contact_info_get_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_contact_info_get_tags(PurpleContactInfo *info);
 
 /**
@@ -381,6 +406,7 @@ PurpleTags *purple_contact_info_get_tags
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_person(PurpleContactInfo *info, PurplePerson *person);
 
 /**
@@ -394,6 +420,7 @@ void purple_contact_info_set_person(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePerson *purple_contact_info_get_person(PurpleContactInfo *info);
 
 /**
@@ -406,6 +433,7 @@ PurplePerson *purple_contact_info_get_pe
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfoPermission purple_contact_info_get_permission(PurpleContactInfo *info);
 
 /**
@@ -417,6 +445,7 @@ PurpleContactInfoPermission purple_conta
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_permission(PurpleContactInfo *info, PurpleContactInfoPermission permission);
 
 /**
@@ -429,6 +458,7 @@ void purple_contact_info_set_permission(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_contact_info_get_sid(PurpleContactInfo *info);
 
 /**
@@ -440,6 +470,7 @@ const char *purple_contact_info_get_sid(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_info_set_sid(PurpleContactInfo *info, const char *sid);
 
 /**
@@ -453,6 +484,7 @@ void purple_contact_info_set_sid(PurpleC
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_contact_info_get_name_for_display(PurpleContactInfo *info);
 
 /**
@@ -467,6 +499,7 @@ const char *purple_contact_info_get_name
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_contact_info_compare(PurpleContactInfo *a, PurpleContactInfo *b);
 
 /**
@@ -485,6 +518,7 @@ int purple_contact_info_compare(PurpleCo
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_contact_info_matches(PurpleContactInfo *info, const char *needle);
 
 G_END_DECLS
diff --git a/libpurple/purplecontactmanager.h b/libpurple/purplecontactmanager.h
--- a/libpurple/purplecontactmanager.h
+++ b/libpurple/purplecontactmanager.h
@@ -28,10 +28,13 @@
 
 #include "purpleaccount.h"
 #include "purplecontact.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_CONTACT_MANAGER (purple_contact_manager_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleContactManager, purple_contact_manager, PURPLE,
                      CONTACT_MANAGER, GObject)
 
@@ -55,6 +58,7 @@ G_DECLARE_FINAL_TYPE(PurpleContactManage
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactManager *purple_contact_manager_get_default(void);
 
 /**
@@ -67,6 +71,7 @@ PurpleContactManager *purple_contact_man
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_manager_add(PurpleContactManager *manager, PurpleContact *contact);
 
 /**
@@ -81,6 +86,7 @@ void purple_contact_manager_add(PurpleCo
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_contact_manager_remove(PurpleContactManager *manager, PurpleContact *contact);
 
 /**
@@ -94,6 +100,7 @@ gboolean purple_contact_manager_remove(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_contact_manager_remove_all(PurpleContactManager *manager, PurpleAccount *account);
 
 /**
@@ -108,6 +115,7 @@ gboolean purple_contact_manager_remove_a
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_contact_manager_get_all(PurpleContactManager *manager, PurpleAccount *account);
 
 /**
@@ -124,6 +132,7 @@ GListModel *purple_contact_manager_get_a
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContact *purple_contact_manager_find_with_username(PurpleContactManager *manager, PurpleAccount *account, const gchar *username);
 
 /**
@@ -139,6 +148,7 @@ PurpleContact *purple_contact_manager_fi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContact *purple_contact_manager_find_with_id(PurpleContactManager *manager, PurpleAccount *account, const gchar *id);
 
 /**
@@ -155,7 +165,7 @@ PurpleContact *purple_contact_manager_fi
  *
  * Since: 3.0.0
  */
-G_DEPRECATED
+PURPLE_DEPRECATED
 void purple_contact_manager_add_buddy(PurpleContactManager *manager, PurpleBuddy *buddy);
 
 /**
@@ -172,6 +182,7 @@ void purple_contact_manager_add_buddy(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_manager_add_person(PurpleContactManager *manager, PurplePerson *person);
 
 /**
@@ -186,6 +197,7 @@ void purple_contact_manager_add_person(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_contact_manager_remove_person(PurpleContactManager *manager, PurplePerson *person, gboolean remove_contacts);
 
 G_END_DECLS
diff --git a/libpurple/purpleconversation.h b/libpurple/purpleconversation.h
--- a/libpurple/purpleconversation.h
+++ b/libpurple/purpleconversation.h
@@ -34,6 +34,7 @@ G_DECLARE_DERIVABLE_TYPE(PurpleConversat
 #include "purplecontactinfo.h"
 #include "purpleconversationmember.h"
 #include "purplemessage.h"
+#include "purpleversion.h"
 
 /**
  * PurpleConversationUpdateType:
@@ -105,6 +106,7 @@ typedef enum
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum {
 	PurpleConversationTypeUnset,
 	PurpleConversationTypeDM,
@@ -188,6 +190,7 @@ PurpleConversationUiOps *purple_conversa
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_conversation_get_id(PurpleConversation *conversation);
 
 /**
@@ -200,6 +203,7 @@ const char *purple_conversation_get_id(P
  *
  * Since: 3.0.0.
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversationType purple_conversation_get_conversation_type(PurpleConversation *conversation);
 
 /**
@@ -214,6 +218,7 @@ PurpleConversationType purple_conversati
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_conversation_type(PurpleConversation *conversation, PurpleConversationType type);
 
 /**
@@ -420,6 +425,7 @@ gboolean purple_conversation_present_err
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_get_age_restricted(PurpleConversation *conversation);
 
 /**
@@ -432,6 +438,7 @@ gboolean purple_conversation_get_age_res
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_age_restricted(PurpleConversation *conversation, gboolean age_restricted);
 
 /**
@@ -444,6 +451,7 @@ void purple_conversation_set_age_restric
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_conversation_get_description(PurpleConversation *conversation);
 
 /**
@@ -455,6 +463,7 @@ const char *purple_conversation_get_desc
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_description(PurpleConversation *conversation, const char *description);
 
 /**
@@ -467,6 +476,7 @@ void purple_conversation_set_description
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_conversation_get_topic(PurpleConversation *conversation);
 
 /**
@@ -478,6 +488,7 @@ const char *purple_conversation_get_topi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_topic(PurpleConversation *conversation, const char *topic);
 
 /**
@@ -495,6 +506,7 @@ void purple_conversation_set_topic(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_topic_full(PurpleConversation *conversation, const char *topic, PurpleContactInfo *author, GDateTime *updated);
 
 /**
@@ -507,6 +519,7 @@ void purple_conversation_set_topic_full(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_conversation_get_topic_author(PurpleConversation *conversation);
 
 /**
@@ -518,6 +531,7 @@ PurpleContactInfo *purple_conversation_g
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_topic_author(PurpleConversation *conversation, PurpleContactInfo *author);
 
 /**
@@ -531,6 +545,7 @@ void purple_conversation_set_topic_autho
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_conversation_get_topic_updated(PurpleConversation *conversation);
 
 /**
@@ -542,6 +557,7 @@ GDateTime *purple_conversation_get_topic
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_topic_updated(PurpleConversation *conversation, GDateTime *updated);
 
 /**
@@ -554,6 +570,7 @@ void purple_conversation_set_topic_updat
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_conversation_get_user_nickname(PurpleConversation *conversation);
 
 /**
@@ -565,6 +582,7 @@ const char *purple_conversation_get_user
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_user_nickname(PurpleConversation *conversation, const char *nickname);
 
 /**
@@ -578,6 +596,7 @@ void purple_conversation_set_user_nickna
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_get_favorite(PurpleConversation *conversation);
 
 /**
@@ -589,6 +608,7 @@ gboolean purple_conversation_get_favorit
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_favorite(PurpleConversation *conversation, gboolean favorite);
 
 /**
@@ -601,6 +621,7 @@ void purple_conversation_set_favorite(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_conversation_get_created_on(PurpleConversation *conversation);
 
 /**
@@ -612,6 +633,7 @@ GDateTime *purple_conversation_get_creat
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_created_on(PurpleConversation *conversation, GDateTime *created_on);
 
 /**
@@ -624,6 +646,7 @@ void purple_conversation_set_created_on(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_conversation_get_creator(PurpleConversation *conversation);
 
 /**
@@ -635,6 +658,7 @@ PurpleContactInfo *purple_conversation_g
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_creator(PurpleConversation *conversation, PurpleContactInfo *creator);
 
 /**
@@ -650,6 +674,7 @@ void purple_conversation_set_creator(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_get_online(PurpleConversation *conversation);
 
 /**
@@ -662,6 +687,7 @@ gboolean purple_conversation_get_online(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_online(PurpleConversation *conversation, gboolean online);
 
 /**
@@ -679,6 +705,7 @@ void purple_conversation_set_online(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_get_federated(PurpleConversation *conversation);
 
 /**
@@ -691,6 +718,7 @@ gboolean purple_conversation_get_federat
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_conversation_get_tags(PurpleConversation *conversation);
 
 /**
@@ -703,6 +731,7 @@ PurpleTags *purple_conversation_get_tags
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_conversation_get_members(PurpleConversation *conversation);
 
 /**
@@ -720,6 +749,7 @@ GListModel *purple_conversation_get_memb
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_has_member(PurpleConversation *conversation, PurpleContactInfo *info, guint *position);
 
 /**
@@ -735,6 +765,7 @@ gboolean purple_conversation_has_member(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversationMember *purple_conversation_find_member(PurpleConversation *conversation, PurpleContactInfo *info);
 
 /**
@@ -765,6 +796,7 @@ PurpleConversationMember *purple_convers
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversationMember *purple_conversation_add_member(PurpleConversation *conversation, PurpleContactInfo *info, gboolean announce, const char *message);
 
 /**
@@ -787,6 +819,7 @@ PurpleConversationMember *purple_convers
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_remove_member(PurpleConversation *conversation, PurpleConversationMember *member, gboolean announce, const char *message);
 
 /**
@@ -799,6 +832,7 @@ gboolean purple_conversation_remove_memb
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_conversation_get_messages(PurpleConversation *conversation);
 
 /**
@@ -814,6 +848,7 @@ GListModel *purple_conversation_get_mess
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_conversation_get_avatar(PurpleConversation *conversation);
 
 /**
@@ -828,6 +863,7 @@ PurpleAvatar *purple_conversation_get_av
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_avatar(PurpleConversation *conversation, PurpleAvatar *avatar);
 
 G_END_DECLS
diff --git a/libpurple/purpleconversationmanager.h b/libpurple/purpleconversationmanager.h
--- a/libpurple/purpleconversationmanager.h
+++ b/libpurple/purpleconversationmanager.h
@@ -26,6 +26,7 @@
 #include <glib.h>
 
 #include "purpleconversation.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -39,6 +40,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleConversationManager, purple_conversation_manager,
                      PURPLE, CONVERSATION_MANAGER, GObject)
 
@@ -52,6 +54,7 @@ G_DECLARE_FINAL_TYPE(PurpleConversationM
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleConversationManagerForeachFunc)(PurpleConversation *conversation, gpointer data);
 
 /**
@@ -64,6 +67,7 @@ typedef void (*PurpleConversationManager
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversationManager *purple_conversation_manager_get_default(void);
 
 /**
@@ -77,6 +81,7 @@ PurpleConversationManager *purple_conver
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_manager_register(PurpleConversationManager *manager, PurpleConversation *conversation);
 
 /**
@@ -90,6 +95,7 @@ gboolean purple_conversation_manager_reg
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_manager_unregister(PurpleConversationManager *manager, PurpleConversation *conversation);
 
 /**
@@ -104,6 +110,7 @@ gboolean purple_conversation_manager_unr
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_manager_is_registered(PurpleConversationManager *manager, PurpleConversation *conversation);
 
 /**
@@ -116,6 +123,7 @@ gboolean purple_conversation_manager_is_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_manager_foreach(PurpleConversationManager *manager, PurpleConversationManagerForeachFunc func, gpointer data);
 
 /**
@@ -129,6 +137,7 @@ void purple_conversation_manager_foreach
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_conversation_manager_get_all(PurpleConversationManager *manager);
 
 /**
@@ -146,6 +155,7 @@ GList *purple_conversation_manager_get_a
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find(PurpleConversationManager *manager, PurpleAccount *account, const gchar *name);
 
 /**
@@ -161,6 +171,7 @@ PurpleConversation *purple_conversation_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find_im(PurpleConversationManager *manager, PurpleAccount *account, const gchar *name);
 
 /**
@@ -176,6 +187,7 @@ PurpleConversation *purple_conversation_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find_chat(PurpleConversationManager *manager, PurpleAccount *account, const gchar *name);
 
 /**
@@ -193,6 +205,7 @@ PurpleConversation *purple_conversation_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find_chat_by_id(PurpleConversationManager *manager, PurpleAccount *account, gint id);
 
 /**
@@ -208,6 +221,7 @@ PurpleConversation *purple_conversation_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find_with_id(PurpleConversationManager *manager, PurpleAccount *account, const char *id);
 
 G_END_DECLS
diff --git a/libpurple/purpleconversationmember.h b/libpurple/purpleconversationmember.h
--- a/libpurple/purpleconversationmember.h
+++ b/libpurple/purpleconversationmember.h
@@ -29,10 +29,13 @@
 #include "purplecontactinfo.h"
 #include "purpletags.h"
 #include "purpletyping.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_CONVERSATION_MEMBER (purple_conversation_member_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleConversationMember, purple_conversation_member,
                      PURPLE, CONVERSATION_MEMBER, GObject)
 
@@ -63,6 +66,7 @@ G_DECLARE_FINAL_TYPE(PurpleConversationM
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConversationMember *purple_conversation_member_new(PurpleContactInfo *info);
 
 /**
@@ -76,6 +80,7 @@ PurpleConversationMember *purple_convers
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_conversation_member_get_contact_info(PurpleConversationMember *conversation_member);
 
 /**
@@ -88,6 +93,7 @@ PurpleContactInfo *purple_conversation_m
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_conversation_member_get_tags(PurpleConversationMember *conversation_member);
 
 /**
@@ -100,6 +106,7 @@ PurpleTags *purple_conversation_member_g
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleTypingState purple_conversation_member_get_typing_state(PurpleConversationMember *member);
 
 /**
@@ -115,6 +122,7 @@ PurpleTypingState purple_conversation_me
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_member_set_typing_state(PurpleConversationMember *member, PurpleTypingState state, guint seconds);
 
 G_END_DECLS
diff --git a/libpurple/purplecredentialmanager.h b/libpurple/purplecredentialmanager.h
--- a/libpurple/purplecredentialmanager.h
+++ b/libpurple/purplecredentialmanager.h
@@ -28,6 +28,7 @@
 
 #include "purpleaccount.h"
 #include "purplecredentialprovider.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -38,9 +39,13 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
-#define PURPLE_CREDENTIAL_MANAGER_DOMAIN (g_quark_from_static_string("purple-credential-manager"))
+#define PURPLE_CREDENTIAL_MANAGER_DOMAIN \
+	g_quark_from_static_string("purple-credential-manager") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 #define PURPLE_TYPE_CREDENTIAL_MANAGER (purple_credential_manager_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleCredentialManager, purple_credential_manager,
                      PURPLE, CREDENTIAL_MANAGER, GObject)
 
@@ -66,6 +71,7 @@ G_DECLARE_FINAL_TYPE(PurpleCredentialMan
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleCredentialManagerForeachFunc)(PurpleCredentialProvider *provider, gpointer data);
 
 /**
@@ -77,6 +83,7 @@ typedef void (*PurpleCredentialManagerFo
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleCredentialManager *purple_credential_manager_get_default(void);
 
 /**
@@ -92,6 +99,7 @@ PurpleCredentialManager *purple_credenti
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_register(PurpleCredentialManager *manager, PurpleCredentialProvider *provider, GError **error);
 
 /**
@@ -107,6 +115,7 @@ gboolean purple_credential_manager_regis
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_unregister(PurpleCredentialManager *manager, PurpleCredentialProvider *provider, GError **error);
 
 /**
@@ -128,6 +137,7 @@ gboolean purple_credential_manager_unreg
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_set_active(PurpleCredentialManager *manager, const gchar *id, GError **error);
 
 /**
@@ -141,6 +151,7 @@ gboolean purple_credential_manager_set_a
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleCredentialProvider *purple_credential_manager_get_active(PurpleCredentialManager *manager);
 
 /**
@@ -157,6 +168,7 @@ PurpleCredentialProvider *purple_credent
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_credential_manager_read_password_async(PurpleCredentialManager *manager, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -173,6 +185,7 @@ void purple_credential_manager_read_pass
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gchar *purple_credential_manager_read_password_finish(PurpleCredentialManager *manager, GAsyncResult *result, GError **error);
 
 /**
@@ -190,6 +203,7 @@ gchar *purple_credential_manager_read_pa
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_credential_manager_write_password_async(PurpleCredentialManager *manager, PurpleAccount *account, const gchar *password, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -206,6 +220,7 @@ void purple_credential_manager_write_pas
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_write_password_finish(PurpleCredentialManager *manager, GAsyncResult *result, GError **error);
 
 /**
@@ -222,6 +237,7 @@ gboolean purple_credential_manager_write
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_credential_manager_clear_password_async(PurpleCredentialManager *manager, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -239,6 +255,7 @@ void purple_credential_manager_clear_pas
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_clear_password_finish(PurpleCredentialManager *manager, GAsyncResult *result, GError **error);
 
 /**
@@ -251,6 +268,7 @@ gboolean purple_credential_manager_clear
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_credential_manager_foreach(PurpleCredentialManager *manager, PurpleCredentialManagerForeachFunc func, gpointer data);
 
 G_END_DECLS
diff --git a/libpurple/purplecredentialprovider.h b/libpurple/purplecredentialprovider.h
--- a/libpurple/purplecredentialprovider.h
+++ b/libpurple/purplecredentialprovider.h
@@ -27,6 +27,7 @@
 #include <glib-object.h>
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 #include "request.h"
 
 G_BEGIN_DECLS
@@ -38,7 +39,9 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
-#define PURPLE_CREDENTIAL_PROVIDER_DOMAIN (g_quark_from_static_string("purple-credential-provider"))
+#define PURPLE_CREDENTIAL_PROVIDER_DOMAIN \
+	g_quark_from_static_string("purple-credential-provider") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 /**
  * PurpleCredentialProvider:
@@ -52,6 +55,8 @@ G_BEGIN_DECLS
  */
 
 #define PURPLE_TYPE_CREDENTIAL_PROVIDER (purple_credential_provider_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleCredentialProvider, purple_credential_provider,
                          PURPLE, CREDENTIAL_PROVIDER, GObject)
 
@@ -104,6 +109,7 @@ struct _PurpleCredentialProviderClass {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_credential_provider_get_id(PurpleCredentialProvider *provider);
 
 /**
@@ -116,6 +122,7 @@ const gchar *purple_credential_provider_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_credential_provider_get_name(PurpleCredentialProvider *provider);
 
 /**
@@ -129,6 +136,7 @@ const gchar *purple_credential_provider_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_credential_provider_get_description(PurpleCredentialProvider *provider);
 
 /**
@@ -144,6 +152,7 @@ const gchar *purple_credential_provider_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_provider_is_valid(PurpleCredentialProvider *provider, GError **error);
 
 /**
@@ -159,6 +168,7 @@ gboolean purple_credential_provider_is_v
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_credential_provider_read_password_async(PurpleCredentialProvider *provider, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -175,6 +185,7 @@ void purple_credential_provider_read_pas
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gchar *purple_credential_provider_read_password_finish(PurpleCredentialProvider *provider, GAsyncResult *result, GError **error);
 
 /**
@@ -191,6 +202,7 @@ gchar *purple_credential_provider_read_p
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_credential_provider_write_password_async(PurpleCredentialProvider *provider, PurpleAccount *account, const gchar *password, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -208,6 +220,7 @@ void purple_credential_provider_write_pa
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_provider_write_password_finish(PurpleCredentialProvider *provider, GAsyncResult *result, GError **error);
 
 /**
@@ -223,6 +236,7 @@ gboolean purple_credential_provider_writ
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_credential_provider_clear_password_async(PurpleCredentialProvider *provider, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -240,6 +254,7 @@ void purple_credential_provider_clear_pa
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_provider_clear_password_finish(PurpleCredentialProvider *provider, GAsyncResult *result, GError **error);
 
 /**
@@ -253,6 +268,7 @@ gboolean purple_credential_provider_clea
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GSettings *purple_credential_provider_get_settings(PurpleCredentialProvider *provider);
 
 G_END_DECLS
diff --git a/libpurple/purpledebugui.h b/libpurple/purpledebugui.h
--- a/libpurple/purpledebugui.h
+++ b/libpurple/purpledebugui.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_DEBUG_UI (purple_debug_ui_get_type())
@@ -42,6 +44,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleDebugUi, purple_debug_ui, PURPLE, DEBUG_UI, GObject)
 
 #include "debug.h"
@@ -82,6 +85,7 @@ struct _PurpleDebugUiInterface {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_debug_ui_is_enabled(PurpleDebugUi *ui, PurpleDebugLevel level, const gchar *category);
 
 /**
@@ -95,6 +99,7 @@ gboolean purple_debug_ui_is_enabled(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_debug_ui_print(PurpleDebugUi *ui, PurpleDebugLevel level, const gchar *category, const gchar *arg_s);
 
 G_END_DECLS
diff --git a/libpurple/purplefiletransfer.h b/libpurple/purplefiletransfer.h
--- a/libpurple/purplefiletransfer.h
+++ b/libpurple/purplefiletransfer.h
@@ -30,6 +30,7 @@
 #include <glib-object.h>
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -64,6 +65,8 @@ typedef enum {
  */
 
 #define PURPLE_TYPE_FILE_TRANSFER purple_file_transfer_get_type()
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleFileTransfer, purple_file_transfer, PURPLE,
                      FILE_TRANSFER, GObject)
 
@@ -84,6 +87,7 @@ G_DECLARE_FINAL_TYPE(PurpleFileTransfer,
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleFileTransfer *purple_file_transfer_new_send(PurpleAccount *account, PurpleContactInfo *remote, GFile *local_file);
 
 /**
@@ -103,6 +107,7 @@ PurpleFileTransfer *purple_file_transfer
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleFileTransfer *purple_file_transfer_new_receive(PurpleAccount *account, PurpleContactInfo *remote, const char *filename, guint64 file_size);
 
 /**
@@ -115,6 +120,7 @@ PurpleFileTransfer *purple_file_transfer
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_file_transfer_get_account(PurpleFileTransfer *transfer);
 
 /**
@@ -128,6 +134,7 @@ PurpleAccount *purple_file_transfer_get_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_file_transfer_get_remote(PurpleFileTransfer *transfer);
 
 /**
@@ -140,6 +147,7 @@ PurpleContactInfo *purple_file_transfer_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_file_transfer_get_initiator(PurpleFileTransfer *transfer);
 
 /**
@@ -153,6 +161,7 @@ PurpleContactInfo *purple_file_transfer_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GCancellable *purple_file_transfer_get_cancellable(PurpleFileTransfer *transfer);
 
 /**
@@ -165,6 +174,7 @@ GCancellable *purple_file_transfer_get_c
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleFileTransferState purple_file_transfer_get_state(PurpleFileTransfer *transfer);
 
 /**
@@ -179,6 +189,7 @@ PurpleFileTransferState purple_file_tran
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_file_transfer_set_state(PurpleFileTransfer *transfer, PurpleFileTransferState state);
 
 /**
@@ -191,6 +202,7 @@ void purple_file_transfer_set_state(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GError *purple_file_transfer_get_error(PurpleFileTransfer *transfer);
 
 /**
@@ -202,6 +214,7 @@ GError *purple_file_transfer_get_error(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_file_transfer_set_error(PurpleFileTransfer *transfer, GError *error);
 
 /**
@@ -214,6 +227,7 @@ void purple_file_transfer_set_error(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GFile *purple_file_transfer_get_local_file(PurpleFileTransfer *transfer);
 
 /**
@@ -225,6 +239,7 @@ GFile *purple_file_transfer_get_local_fi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_file_transfer_set_local_file(PurpleFileTransfer *transfer, GFile *local_file);
 
 /**
@@ -237,6 +252,7 @@ void purple_file_transfer_set_local_file
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_file_transfer_get_filename(PurpleFileTransfer *transfer);
 
 /**
@@ -249,6 +265,7 @@ const char *purple_file_transfer_get_fil
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint64 purple_file_transfer_get_file_size(PurpleFileTransfer *transfer);
 
 /**
@@ -261,6 +278,7 @@ guint64 purple_file_transfer_get_file_si
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_file_transfer_get_content_type(PurpleFileTransfer *transfer);
 
 /**
@@ -272,6 +290,7 @@ const char *purple_file_transfer_get_con
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_file_transfer_set_content_type(PurpleFileTransfer *transfer, const char *content_type);
 
 /**
@@ -285,6 +304,7 @@ void purple_file_transfer_set_content_ty
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_file_transfer_get_message(PurpleFileTransfer *transfer);
 
 /**
@@ -296,6 +316,7 @@ const char *purple_file_transfer_get_mes
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_file_transfer_set_message(PurpleFileTransfer *transfer, const char *message);
 
 G_END_DECLS
diff --git a/libpurple/purplehistoryadapter.h b/libpurple/purplehistoryadapter.h
--- a/libpurple/purplehistoryadapter.h
+++ b/libpurple/purplehistoryadapter.h
@@ -28,6 +28,7 @@
 
 #include "purplemessage.h"
 #include "purpleconversation.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -38,7 +39,9 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
-#define PURPLE_HISTORY_ADAPTER_DOMAIN (g_quark_from_static_string("purple-history-adapter"))
+#define PURPLE_HISTORY_ADAPTER_DOMAIN \
+	g_quark_from_static_string("purple-history-adapter") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 /**
  * PurpleHistoryAdapter:
@@ -51,6 +54,8 @@ G_BEGIN_DECLS
  */
 
 #define PURPLE_TYPE_HISTORY_ADAPTER (purple_history_adapter_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleHistoryAdapter, purple_history_adapter,
                          PURPLE, HISTORY_ADAPTER, GObject)
 
@@ -89,6 +94,7 @@ struct _PurpleHistoryAdapterClass {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_history_adapter_get_id(PurpleHistoryAdapter *adapter);
 
 /**
@@ -101,6 +107,7 @@ const gchar *purple_history_adapter_get_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_history_adapter_get_name(PurpleHistoryAdapter *adapter);
 
 /**
@@ -116,6 +123,7 @@ const gchar *purple_history_adapter_get_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_adapter_write(PurpleHistoryAdapter *adapter,
                                       PurpleConversation *conversation,
                                       PurpleMessage *message,
@@ -133,6 +141,7 @@ gboolean purple_history_adapter_write(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_history_adapter_query(PurpleHistoryAdapter *adapter,
                                     const gchar *query,
                                     GError **error);
@@ -149,6 +158,7 @@ GList *purple_history_adapter_query(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_adapter_remove(PurpleHistoryAdapter *adapter,
                                        const gchar *query,
                                        GError **error);
diff --git a/libpurple/purplehistorymanager.h b/libpurple/purplehistorymanager.h
--- a/libpurple/purplehistorymanager.h
+++ b/libpurple/purplehistorymanager.h
@@ -27,6 +27,7 @@
 #include <glib-object.h>
 
 #include "purplehistoryadapter.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -37,9 +38,13 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
-#define PURPLE_HISTORY_MANAGER_DOMAIN (g_quark_from_static_string("purple-history-manager"))
+#define PURPLE_HISTORY_MANAGER_DOMAIN \
+	g_quark_from_static_string("purple-history-manager") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 #define PURPLE_TYPE_HISTORY_MANAGER (purple_history_manager_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleHistoryManager, purple_history_manager, PURPLE,
                      HISTORY_MANAGER, GObject)
 
@@ -62,6 +67,7 @@ G_DECLARE_FINAL_TYPE(PurpleHistoryManage
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleHistoryManagerForeachFunc)(PurpleHistoryAdapter *adapter, gpointer data);
 
 /**
@@ -73,6 +79,7 @@ typedef void (*PurpleHistoryManagerForea
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleHistoryManager *purple_history_manager_get_default(void);
 
 /**
@@ -85,6 +92,7 @@ PurpleHistoryManager *purple_history_man
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
  PurpleHistoryAdapter *purple_history_manager_get_active(PurpleHistoryManager *manager);
 
  /**
@@ -100,6 +108,7 @@ PurpleHistoryManager *purple_history_man
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_manager_set_active(PurpleHistoryManager *manager, const gchar *id, GError **error);
 
 /**
@@ -115,6 +124,7 @@ gboolean purple_history_manager_set_acti
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_manager_register(PurpleHistoryManager *manager, PurpleHistoryAdapter *adapter, GError **error);
 
 /**
@@ -130,6 +140,7 @@ gboolean purple_history_manager_register
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_manager_unregister(PurpleHistoryManager *manager, PurpleHistoryAdapter *adapter, GError **error);
 
 /**
@@ -143,6 +154,7 @@ gboolean purple_history_manager_unregist
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleHistoryAdapter *purple_history_manager_find(PurpleHistoryManager *manager, const gchar *id);
 
 /**
@@ -157,6 +169,7 @@ PurpleHistoryAdapter *purple_history_man
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_history_manager_get_all(PurpleHistoryManager *manager);
 
 /**
@@ -173,6 +186,7 @@ GList *purple_history_manager_get_all(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_history_manager_query(PurpleHistoryManager *manager, const gchar *query, GError **error);
 
 /**
@@ -188,6 +202,7 @@ GList *purple_history_manager_query(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_manager_remove(PurpleHistoryManager *manager, const gchar *query, GError **error);
 
 /**
@@ -203,6 +218,7 @@ gboolean purple_history_manager_remove(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_manager_write(PurpleHistoryManager *manager, PurpleConversation *conversation, PurpleMessage *message, GError **error);
 
 /**
@@ -215,6 +231,7 @@ gboolean purple_history_manager_write(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_history_manager_foreach(PurpleHistoryManager *manager, PurpleHistoryManagerForeachFunc func, gpointer data);
 
 G_END_DECLS
diff --git a/libpurple/purpleidlemanager.h b/libpurple/purpleidlemanager.h
--- a/libpurple/purpleidlemanager.h
+++ b/libpurple/purpleidlemanager.h
@@ -30,7 +30,11 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_IDLE_MANAGER (purple_idle_manager_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleIdleManager, purple_idle_manager, PURPLE,
                      IDLE_MANAGER, GObject)
 
@@ -86,6 +90,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleIdleManager *purple_idle_manager_get_default(void);
 
 /**
@@ -102,6 +107,7 @@ PurpleIdleManager *purple_idle_manager_g
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_idle_manager_set_source(PurpleIdleManager *manager, const char *source, GDateTime *timestamp);
 
 /**
@@ -115,6 +121,7 @@ gboolean purple_idle_manager_set_source(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_idle_manager_get_timestamp(PurpleIdleManager *manager);
 
 G_END_DECLS
diff --git a/libpurple/purpleidleui.h b/libpurple/purpleidleui.h
--- a/libpurple/purpleidleui.h
+++ b/libpurple/purpleidleui.h
@@ -28,9 +28,13 @@
 
 #include <time.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_IDLE_UI (purple_idle_ui_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleIdleUi, purple_idle_ui, PURPLE, IDLE_UI, GObject)
 
 /**
@@ -63,6 +67,7 @@ struct _PurpleIdleUiInterface {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 time_t purple_idle_ui_get_idle_time(PurpleIdleUi *ui);
 
 G_END_DECLS
diff --git a/libpurple/purplekeyvaluepair.h b/libpurple/purplekeyvaluepair.h
--- a/libpurple/purplekeyvaluepair.h
+++ b/libpurple/purplekeyvaluepair.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_KEY_VALUE_PAIR (purple_key_value_pair_get_type())
 
 /**
@@ -75,6 +77,7 @@ GType purple_key_value_pair_get_type(voi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleKeyValuePair *purple_key_value_pair_new(const gchar *key, gpointer value);
 
 /**
@@ -90,6 +93,7 @@ PurpleKeyValuePair *purple_key_value_pai
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleKeyValuePair *purple_key_value_pair_new_full(const gchar *key, gpointer value, GDestroyNotify value_destroy_func);
 
 /**
@@ -100,6 +104,7 @@ PurpleKeyValuePair *purple_key_value_pai
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_key_value_pair_free(PurpleKeyValuePair *kvp);
 
 /**
diff --git a/libpurple/purplemenu.h b/libpurple/purplemenu.h
--- a/libpurple/purplemenu.h
+++ b/libpurple/purplemenu.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <gio/gio.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET "dynamic-target"
@@ -47,6 +49,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleMenuWalkFunc)(GMenuModel *model, gint index, gpointer data);
 
 /**
@@ -59,6 +62,7 @@ typedef void (*PurpleMenuWalkFunc)(GMenu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_menu_walk(GMenuModel *model, PurpleMenuWalkFunc func, gpointer data);
 
 /**
@@ -82,6 +86,7 @@ void purple_menu_walk(GMenuModel *model,
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_menu_populate_dynamic_targets(GMenu *menu, const gchar *first_property, ...) G_GNUC_NULL_TERMINATED;
 
 /**
@@ -103,6 +108,7 @@ void purple_menu_populate_dynamic_target
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_menu_populate_dynamic_targetsv(GMenu *menu, GHashTable *properties);
 
 /**
@@ -116,6 +122,7 @@ void purple_menu_populate_dynamic_target
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GMenu *purple_menu_copy(GMenuModel *model);
 
 G_END_DECLS
diff --git a/libpurple/purplemessage.h b/libpurple/purplemessage.h
--- a/libpurple/purplemessage.h
+++ b/libpurple/purplemessage.h
@@ -30,6 +30,7 @@
 #include <glib-object.h>
 
 #include "purpleattachment.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -92,6 +93,7 @@ typedef enum /*< flags >*/
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum /*< prefix=PURPLE_MESSAGE_CONTENT_TYPE,underscore_name=PURPLE_MESSAGE_CONTENT_TYPE >*/
 {
 	PURPLE_MESSAGE_CONTENT_TYPE_PLAIN = 0,
@@ -124,6 +126,7 @@ G_DECLARE_FINAL_TYPE(PurpleMessage, purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleMessage *purple_message_new_outgoing(const gchar *author, const gchar *recipient, const gchar *contents, PurpleMessageFlags flags);
 
 /**
@@ -141,6 +144,7 @@ PurpleMessage *purple_message_new_outgoi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleMessage *purple_message_new_incoming(const gchar *who, const gchar *contents, PurpleMessageFlags flags, guint64 timestamp);
 
 /**
@@ -156,6 +160,7 @@ PurpleMessage *purple_message_new_incomi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleMessage *purple_message_new_system(const gchar *contents, PurpleMessageFlags flags);
 
 /**
@@ -169,6 +174,7 @@ PurpleMessage *purple_message_new_system
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_message_get_id(PurpleMessage *message);
 
 /**
@@ -183,6 +189,7 @@ const gchar *purple_message_get_id(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_id(PurpleMessage *message, const char *id);
 
 /**
@@ -195,6 +202,7 @@ void purple_message_set_id(PurpleMessage
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_message_get_author(PurpleMessage *message);
 
 /**
@@ -209,6 +217,7 @@ const gchar *purple_message_get_author(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_author_name_color(PurpleMessage *message, const gchar *color);
 
 /**
@@ -221,6 +230,7 @@ void purple_message_set_author_name_colo
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_message_get_author_name_color(PurpleMessage *message);
 
 /**
@@ -232,6 +242,7 @@ const gchar *purple_message_get_author_n
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_recipient(PurpleMessage *message, const gchar *recipient);
 
 /**
@@ -244,6 +255,7 @@ void purple_message_set_recipient(Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_message_get_recipient(PurpleMessage *message);
 
 /**
@@ -255,6 +267,7 @@ const gchar *purple_message_get_recipien
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_author_alias(PurpleMessage *message, const gchar *alias);
 
 /**
@@ -267,6 +280,7 @@ void purple_message_set_author_alias(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_message_get_author_alias(PurpleMessage *message);
 
 /**
@@ -278,6 +292,7 @@ const gchar *purple_message_get_author_a
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_contents(PurpleMessage *message, const gchar *cont);
 
 /**
@@ -290,6 +305,7 @@ void purple_message_set_contents(PurpleM
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_message_get_contents(PurpleMessage *message);
 
 /**
@@ -301,6 +317,7 @@ const gchar *purple_message_get_contents
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_content_type(PurpleMessage *message, PurpleMessageContentType content_type);
 
 /**
@@ -313,6 +330,7 @@ void purple_message_set_content_type(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleMessageContentType purple_message_get_content_type(PurpleMessage *message);
 
 /**
@@ -325,6 +343,7 @@ PurpleMessageContentType purple_message_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_message_is_empty(PurpleMessage *message);
 
 /**
@@ -336,6 +355,7 @@ gboolean purple_message_is_empty(PurpleM
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_timestamp(PurpleMessage *message, GDateTime *timestamp);
 
 /**
@@ -349,6 +369,7 @@ void purple_message_set_timestamp(Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_message_get_timestamp(PurpleMessage *message);
 
 /**
@@ -372,6 +393,7 @@ gchar *purple_message_format_timestamp(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_flags(PurpleMessage *message, PurpleMessageFlags flags);
 
 /**
@@ -384,6 +406,7 @@ void purple_message_set_flags(PurpleMess
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleMessageFlags purple_message_get_flags(PurpleMessage *message);
 
 /**
@@ -396,6 +419,7 @@ PurpleMessageFlags purple_message_get_fl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_error(PurpleMessage *message, GError *error);
 
 /**
@@ -408,6 +432,7 @@ void purple_message_set_error(PurpleMess
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GError *purple_message_get_error(PurpleMessage *message);
 
 /**
@@ -421,6 +446,7 @@ GError *purple_message_get_error(PurpleM
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_message_add_attachment(PurpleMessage *message, PurpleAttachment *attachment);
 
 /**
@@ -435,6 +461,7 @@ gboolean purple_message_add_attachment(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_message_remove_attachment(PurpleMessage *message, guint64 id);
 
 /**
@@ -449,6 +476,7 @@ gboolean purple_message_remove_attachmen
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAttachment *purple_message_get_attachment(PurpleMessage *message, guint64 id);
 
 /**
@@ -461,6 +489,7 @@ PurpleAttachment *purple_message_get_att
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_foreach_attachment(PurpleMessage *message, PurpleAttachmentForeachFunc func, gpointer data);
 
 /**
@@ -471,6 +500,7 @@ void purple_message_foreach_attachment(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_clear_attachments(PurpleMessage *message);
 
 /**
@@ -485,6 +515,7 @@ void purple_message_clear_attachments(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_message_get_action(PurpleMessage *message);
 
 /**
@@ -498,6 +529,7 @@ gboolean purple_message_get_action(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_action(PurpleMessage *message, gboolean action);
 
 /**
@@ -517,6 +549,7 @@ void purple_message_set_action(PurpleMes
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_message_get_delivered(PurpleMessage *message);
 
 /**
@@ -532,6 +565,7 @@ gboolean purple_message_get_delivered(Pu
  *
  * Since: 3.0.0.
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_delivered(PurpleMessage *message, gboolean delivered);
 
 /**
@@ -545,6 +579,7 @@ void purple_message_set_delivered(Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_message_get_delivered_at(PurpleMessage *message);
 
 /**
@@ -559,6 +594,7 @@ GDateTime *purple_message_get_delivered_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_delivered_at(PurpleMessage *message, GDateTime *datetime);
 
 /**
@@ -571,6 +607,7 @@ void purple_message_set_delivered_at(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_message_get_edited(PurpleMessage *message);
 
 /**
@@ -586,6 +623,7 @@ gboolean purple_message_get_edited(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_edited(PurpleMessage *message, gboolean edited);
 
 /**
@@ -599,6 +637,7 @@ void purple_message_set_edited(PurpleMes
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_message_get_edited_at(PurpleMessage *message);
 
 /**
@@ -613,6 +652,7 @@ GDateTime *purple_message_get_edited_at(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_message_set_edited_at(PurpleMessage *message, GDateTime *datetime);
 
 G_END_DECLS
diff --git a/libpurple/purplenoopcredentialprovider.h b/libpurple/purplenoopcredentialprovider.h
--- a/libpurple/purplenoopcredentialprovider.h
+++ b/libpurple/purplenoopcredentialprovider.h
@@ -27,6 +27,7 @@
 #include <glib-object.h>
 
 #include "purplecredentialprovider.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -41,6 +42,8 @@ G_BEGIN_DECLS
  */
 
 #define PURPLE_TYPE_NOOP_CREDENTIAL_PROVIDER (purple_noop_credential_provider_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleNoopCredentialProvider,
                      purple_noop_credential_provider,
                      PURPLE, NOOP_CREDENTIAL_PROVIDER, PurpleCredentialProvider)
diff --git a/libpurple/purplenotification.h b/libpurple/purplenotification.h
--- a/libpurple/purplenotification.h
+++ b/libpurple/purplenotification.h
@@ -29,6 +29,7 @@
 #include "purpleaccount.h"
 #include "purpleauthorizationrequest.h"
 #include "purpleaddcontactrequest.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -37,6 +38,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0.
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum {
     PURPLE_NOTIFICATION_TYPE_UNKNOWN,
     PURPLE_NOTIFICATION_TYPE_GENERIC,
@@ -58,6 +60,8 @@ typedef enum {
  */
 
 #define PURPLE_TYPE_NOTIFICATION (purple_notification_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleNotification, purple_notification, PURPLE,
                      NOTIFICATION, GObject)
 
@@ -78,6 +82,7 @@ G_DECLARE_FINAL_TYPE(PurpleNotification,
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleNotification *purple_notification_new(PurpleNotificationType type, PurpleAccount *account, gpointer data, GDestroyNotify data_destroy_func);
 
 /**
@@ -92,6 +97,7 @@ PurpleNotification *purple_notification_
  *
  * Since: 3.0.0.
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleNotification *purple_notification_new_from_add_contact_request(PurpleAddContactRequest *request);
 
 /**
@@ -107,6 +113,7 @@ PurpleNotification *purple_notification_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleNotification *purple_notification_new_from_authorization_request(PurpleAuthorizationRequest *authorization_request);
 
 /**
@@ -122,6 +129,7 @@ PurpleNotification *purple_notification_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleNotification *purple_notification_new_from_connection_error(PurpleAccount *account, PurpleConnectionErrorInfo *info);
 
 /**
@@ -134,6 +142,7 @@ PurpleNotification *purple_notification_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_notification_get_id(PurpleNotification *notification);
 
 /**
@@ -146,6 +155,7 @@ const gchar *purple_notification_get_id(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleNotificationType purple_notification_get_notification_type(PurpleNotification *notification);
 
 /**
@@ -158,6 +168,7 @@ PurpleNotificationType purple_notificati
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_notification_get_account(PurpleNotification *notification);
 
 /**
@@ -170,6 +181,7 @@ PurpleAccount *purple_notification_get_a
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_notification_get_created_timestamp(PurpleNotification *notification);
 
 /**
@@ -186,6 +198,7 @@ GDateTime *purple_notification_get_creat
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_set_created_timestamp(PurpleNotification *notification, GDateTime *timestamp);
 
 /**
@@ -198,6 +211,7 @@ void purple_notification_set_created_tim
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_notification_get_title(PurpleNotification *notification);
 
 /**
@@ -209,6 +223,7 @@ const gchar *purple_notification_get_tit
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_set_title(PurpleNotification *notification, const gchar *title);
 
 /**
@@ -221,6 +236,7 @@ void purple_notification_set_title(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_notification_get_icon_name(PurpleNotification *notification);
 
 /**
@@ -232,6 +248,7 @@ const gchar *purple_notification_get_ico
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_set_icon_name(PurpleNotification *notification, const gchar *icon_name);
 
 /**
@@ -244,6 +261,7 @@ void purple_notification_set_icon_name(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_notification_get_read(PurpleNotification *notification);
 
 /**
@@ -255,6 +273,7 @@ gboolean purple_notification_get_read(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_set_read(PurpleNotification *notification, gboolean read);
 
 /**
@@ -267,6 +286,7 @@ void purple_notification_set_read(Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_notification_get_interactive(PurpleNotification *notification);
 
 /**
@@ -278,6 +298,7 @@ gboolean purple_notification_get_interac
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_set_interactive(PurpleNotification *notification, gboolean interactive);
 
 /**
@@ -290,6 +311,7 @@ void purple_notification_set_interactive
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer purple_notification_get_data(PurpleNotification *notification);
 
 /**
@@ -305,6 +327,7 @@ gpointer purple_notification_get_data(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_notification_compare(gconstpointer a, gconstpointer b);
 
 /**
@@ -319,6 +342,7 @@ gint purple_notification_compare(gconstp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_delete(PurpleNotification *notification);
 
 G_END_DECLS
diff --git a/libpurple/purplenotificationmanager.h b/libpurple/purplenotificationmanager.h
--- a/libpurple/purplenotificationmanager.h
+++ b/libpurple/purplenotificationmanager.h
@@ -28,10 +28,13 @@
 
 #include "purpleaccount.h"
 #include "purplenotification.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_NOTIFICATION_MANAGER (purple_notification_manager_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleNotificationManager, purple_notification_manager,
                      PURPLE, NOTIFICATION_MANAGER, GObject)
 
@@ -53,6 +56,7 @@ G_DECLARE_FINAL_TYPE(PurpleNotificationM
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleNotificationManager *purple_notification_manager_get_default(void);
 
 /**
@@ -64,6 +68,7 @@ PurpleNotificationManager *purple_notifi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_notification_manager_get_default_as_model(void);
 
 /**
@@ -75,6 +80,7 @@ GListModel *purple_notification_manager_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_manager_add(PurpleNotificationManager *manager, PurpleNotification *notification);
 
 /**
@@ -86,6 +92,7 @@ void purple_notification_manager_add(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_manager_remove(PurpleNotificationManager *manager, PurpleNotification *notification);
 
 /**
@@ -103,6 +110,7 @@ void purple_notification_manager_remove(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_manager_remove_with_account(PurpleNotificationManager *manager, PurpleAccount *account, gboolean all);
 
 /**
@@ -115,6 +123,7 @@ void purple_notification_manager_remove_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint purple_notification_manager_get_unread_count(PurpleNotificationManager *manager);
 
 /**
@@ -125,6 +134,7 @@ guint purple_notification_manager_get_un
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_notification_manager_clear(PurpleNotificationManager *manager);
 
 G_END_DECLS
diff --git a/libpurple/purpleperson.h b/libpurple/purpleperson.h
--- a/libpurple/purpleperson.h
+++ b/libpurple/purpleperson.h
@@ -28,10 +28,13 @@
 
 #include "purpleavatar.h"
 #include "purpletags.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_PERSON (purple_person_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurplePerson, purple_person, PURPLE, PERSON, GObject)
 
 #include "purplecontactinfo.h"
@@ -54,6 +57,7 @@ G_DECLARE_FINAL_TYPE(PurplePerson, purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePerson *purple_person_new(void);
 
 /**
@@ -66,6 +70,7 @@ PurplePerson *purple_person_new(void);
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_id(PurplePerson *person);
 
 /**
@@ -80,6 +85,7 @@ const char *purple_person_get_id(PurpleP
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_alias(PurplePerson *person);
 
 /**
@@ -97,6 +103,7 @@ const char *purple_person_get_alias(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_person_set_alias(PurplePerson *person, const char *alias);
 
 /**
@@ -112,6 +119,7 @@ void purple_person_set_alias(PurplePerso
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_person_get_avatar_for_display(PurplePerson *person);
 
 /**
@@ -124,6 +132,7 @@ PurpleAvatar *purple_person_get_avatar_f
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_person_get_avatar(PurplePerson *person);
 
 /**
@@ -140,6 +149,7 @@ PurpleAvatar *purple_person_get_avatar(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_person_set_avatar(PurplePerson *person, PurpleAvatar *avatar);
 
 /**
@@ -152,6 +162,7 @@ void purple_person_set_avatar(PurplePers
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_color(PurplePerson *person);
 
 /**
@@ -164,6 +175,7 @@ const char *purple_person_get_color(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_person_set_color(PurplePerson *person, const char *color);
 
 /**
@@ -178,6 +190,7 @@ void purple_person_set_color(PurplePerso
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_color_for_display(PurplePerson *person);
 
 /**
@@ -190,6 +203,7 @@ const char *purple_person_get_color_for_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_person_get_tags(PurplePerson *person);
 
 /**
@@ -203,6 +217,7 @@ PurpleTags *purple_person_get_tags(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_name_for_display(PurplePerson *person);
 
 /**
@@ -217,6 +232,7 @@ const char *purple_person_get_name_for_d
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_person_add_contact_info(PurplePerson *person, PurpleContactInfo *info);
 
 /**
@@ -230,6 +246,7 @@ void purple_person_add_contact_info(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_person_remove_contact_info(PurplePerson *person, PurpleContactInfo *info);
 
 /**
@@ -243,6 +260,7 @@ gboolean purple_person_remove_contact_in
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_person_get_priority_contact_info(PurplePerson *person);
 
 /*
@@ -255,6 +273,7 @@ PurpleContactInfo *purple_person_get_pri
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_person_has_contacts(PurplePerson *person);
 
 /**
@@ -272,6 +291,7 @@ gboolean purple_person_has_contacts(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_person_matches(PurplePerson *person, const char *needle);
 
 G_END_DECLS
diff --git a/libpurple/purpleplugininfo.h b/libpurple/purpleplugininfo.h
--- a/libpurple/purpleplugininfo.h
+++ b/libpurple/purpleplugininfo.h
@@ -30,6 +30,8 @@
 #include <gplugin.h>
 #include <gplugin-native.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_PLUGIN_INFO (purple_plugin_info_get_type())
 
 /**
@@ -41,6 +43,7 @@
  * Since: 3.0.0
  */
 
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurplePluginInfo, purple_plugin_info, PURPLE,
                          PLUGIN_INFO, GPluginPluginInfo)
 
@@ -200,6 +203,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GPluginPluginInfo *purple_plugin_info_new(const char *first_property, ...) G_GNUC_NULL_TERMINATED;
 
 /**
@@ -212,6 +216,7 @@ GPluginPluginInfo *purple_plugin_info_ne
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePluginInfoFlags purple_plugin_info_get_flags(PurplePluginInfo *info);
 
 /**
@@ -225,6 +230,7 @@ PurplePluginInfoFlags purple_plugin_info
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_plugin_info_get_error(PurplePluginInfo *info);
 
 /**
@@ -237,6 +243,7 @@ const gchar *purple_plugin_info_get_erro
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_plugin_info_get_unloaded(PurplePluginInfo *info);
 
 /**
@@ -248,6 +255,7 @@ gboolean purple_plugin_info_get_unloaded
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_plugin_info_set_unloaded(PurplePluginInfo *info, gboolean unloaded);
 
 /**
@@ -260,6 +268,7 @@ void purple_plugin_info_set_unloaded(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GActionGroup *purple_plugin_info_get_action_group(PurplePluginInfo *info);
 
 /**
@@ -272,6 +281,7 @@ GActionGroup *purple_plugin_info_get_act
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GMenuModel *purple_plugin_info_get_action_menu(PurplePluginInfo *info);
 
 G_END_DECLS
diff --git a/libpurple/purplepresence.h b/libpurple/purplepresence.h
--- a/libpurple/purplepresence.h
+++ b/libpurple/purplepresence.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 /**
  * PurplePresence:
  *
@@ -73,6 +75,7 @@ typedef struct _PurplePresence PurplePre
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum {
 	PURPLE_PRESENCE_PRIMITIVE_OFFLINE,
 	PURPLE_PRESENCE_PRIMITIVE_AVAILABLE,
@@ -117,6 +120,7 @@ G_DECLARE_DERIVABLE_TYPE(PurplePresence,
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePresence *purple_presence_new(void);
 
 /**
@@ -292,6 +296,7 @@ GDateTime *purple_presence_get_login_tim
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_presence_compare(PurplePresence *presence1, PurplePresence *presence2);
 
 /**
@@ -304,6 +309,7 @@ gint purple_presence_compare(PurplePrese
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePresencePrimitive purple_presence_get_primitive(PurplePresence *presence);
 
 /**
@@ -315,6 +321,7 @@ PurplePresencePrimitive purple_presence_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_primitive(PurplePresence *presence, PurplePresencePrimitive primitive);
 
 /**
@@ -327,6 +334,7 @@ void purple_presence_set_primitive(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_presence_get_message(PurplePresence *presence);
 
 /**
@@ -338,6 +346,7 @@ const char *purple_presence_get_message(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_message(PurplePresence *presence, const char *message);
 
 /**
@@ -350,6 +359,7 @@ void purple_presence_set_message(PurpleP
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_presence_get_emoji(PurplePresence *presence);
 
 /**
@@ -362,6 +372,7 @@ const char *purple_presence_get_emoji(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_emoji(PurplePresence *presence, const char *emoji);
 
 /**
@@ -374,6 +385,7 @@ void purple_presence_set_emoji(PurplePre
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_presence_get_mobile(PurplePresence *presence);
 
 /**
@@ -385,6 +397,7 @@ gboolean purple_presence_get_mobile(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_mobile(PurplePresence *presence, gboolean mobile);
 
 /**
@@ -397,6 +410,7 @@ void purple_presence_set_mobile(PurplePr
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_presence_get_notifications_disabled(PurplePresence *presence);
 
 /**
@@ -408,6 +422,7 @@ gboolean purple_presence_get_notificatio
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_notifications_disabled(PurplePresence *presence, gboolean notifications_disabled);
 
 /**
@@ -421,6 +436,7 @@ void purple_presence_set_notifications_d
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_presence_primitive_to_string(PurplePresencePrimitive primitive);
 
 G_END_DECLS
diff --git a/libpurple/purplepresencemanager.h b/libpurple/purplepresencemanager.h
--- a/libpurple/purplepresencemanager.h
+++ b/libpurple/purplepresencemanager.h
@@ -31,10 +31,13 @@
 #include <glib-object.h>
 
 #include "purplesavedpresence.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_PRESENCE_MANAGER purple_presence_manager_get_type()
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurplePresenceManager, purple_presence_manager, PURPLE,
                      PRESENCE_MANAGER, GObject)
 
@@ -58,6 +61,7 @@ G_DECLARE_FINAL_TYPE(PurplePresenceManag
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePresenceManager *purple_presence_manager_new(const char *filename);
 
 /**
@@ -71,6 +75,7 @@ PurplePresenceManager *purple_presence_m
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_presence_manager_get_filename(PurplePresenceManager *manager);
 
 /**
@@ -84,6 +89,7 @@ const char *purple_presence_manager_get_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleSavedPresence *purple_presence_manager_get_active(PurplePresenceManager *manager);
 
 /**
@@ -102,6 +108,7 @@ PurpleSavedPresence *purple_presence_man
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_presence_manager_set_active(PurplePresenceManager *manager, const char *id);
 
 /**
@@ -118,6 +125,7 @@ gboolean purple_presence_manager_set_act
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleSavedPresence *purple_presence_manager_create(PurplePresenceManager *manager);
 
 /**
@@ -133,6 +141,7 @@ PurpleSavedPresence *purple_presence_man
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_presence_manager_remove(PurplePresenceManager *manager, const char *id);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocol.h b/libpurple/purpleprotocol.h
--- a/libpurple/purpleprotocol.h
+++ b/libpurple/purpleprotocol.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_PROTOCOL (purple_protocol_get_type())
 
 /**
@@ -40,6 +42,7 @@
  * Since: 3.0.0
  */
 
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleProtocol, purple_protocol, PURPLE, PROTOCOL,
                          GObject)
 
@@ -183,6 +186,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_id(PurpleProtocol *protocol);
 
 /**
@@ -195,6 +199,7 @@ const gchar *purple_protocol_get_id(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_name(PurpleProtocol *protocol);
 
 /**
@@ -207,6 +212,7 @@ const gchar *purple_protocol_get_name(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_description(PurpleProtocol *protocol);
 
 /**
@@ -219,6 +225,7 @@ const gchar *purple_protocol_get_descrip
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleProtocolOptions purple_protocol_get_options(PurpleProtocol *protocol);
 
 /**
@@ -232,6 +239,7 @@ PurpleProtocolOptions purple_protocol_ge
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_get_user_splits(PurpleProtocol *protocol);
 
 /**
@@ -245,6 +253,7 @@ GList *purple_protocol_get_user_splits(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_get_account_options(PurpleProtocol *protocol);
 
 /**
@@ -257,6 +266,7 @@ GList *purple_protocol_get_account_optio
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleBuddyIconSpec *purple_protocol_get_icon_spec(PurpleProtocol *protocol);
 
 /**
@@ -269,6 +279,7 @@ PurpleBuddyIconSpec *purple_protocol_get
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleWhiteboardOps *purple_protocol_get_whiteboard_ops(PurpleProtocol *protocol);
 
 /**
@@ -280,6 +291,7 @@ PurpleWhiteboardOps *purple_protocol_get
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_login(PurpleProtocol *protocol, PurpleAccount *account);
 
 /**
@@ -291,6 +303,7 @@ void purple_protocol_login(PurpleProtoco
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_close(PurpleProtocol *protocol, PurpleConnection *connection);
 
 /**
@@ -308,6 +321,7 @@ void purple_protocol_close(PurpleProtoco
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_can_connect_async(PurpleProtocol *protocol, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -323,6 +337,7 @@ void purple_protocol_can_connect_async(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_can_connect_finish(PurpleProtocol *protocol, GAsyncResult *result, GError **error);
 
 
@@ -342,6 +357,7 @@ gboolean purple_protocol_can_connect_fin
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleConnection *purple_protocol_create_connection(PurpleProtocol *protocol, PurpleAccount *account, const char *password, GError **error);
 
 /**
@@ -356,6 +372,7 @@ PurpleConnection *purple_protocol_create
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_get_status_types(PurpleProtocol *protocol, PurpleAccount *account);
 
 /**
@@ -370,6 +387,7 @@ GList *purple_protocol_get_status_types(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_icon_name(PurpleProtocol *protocol);
 
 /**
@@ -388,6 +406,7 @@ const gchar *purple_protocol_get_icon_na
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_icon_search_path(PurpleProtocol *protocol);
 
 /**
@@ -406,6 +425,7 @@ const gchar *purple_protocol_get_icon_se
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_icon_resource_path(PurpleProtocol *protocol);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolactions.h b/libpurple/purpleprotocolactions.h
--- a/libpurple/purpleprotocolactions.h
+++ b/libpurple/purpleprotocolactions.h
@@ -32,8 +32,11 @@
 
 #include "connection.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_ACTIONS (purple_protocol_actions_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolActions, purple_protocol_actions, PURPLE,
                     PROTOCOL_ACTIONS, PurpleProtocol)
 
@@ -91,6 +94,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_actions_get_prefix(PurpleProtocolActions *actions);
 
 /**
@@ -104,6 +108,7 @@ const gchar *purple_protocol_actions_get
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GActionGroup *purple_protocol_actions_get_action_group(PurpleProtocolActions *actions, PurpleConnection *connection);
 
 /**
@@ -117,6 +122,7 @@ GActionGroup *purple_protocol_actions_ge
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GMenu *purple_protocol_actions_get_menu(PurpleProtocolActions *actions, PurpleConnection *connection);
 
 /**
@@ -130,6 +136,7 @@ GMenu *purple_protocol_actions_get_menu(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_actions_changed(PurpleProtocolActions *actions, PurpleAccount *account);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolchat.h b/libpurple/purpleprotocolchat.h
--- a/libpurple/purpleprotocolchat.h
+++ b/libpurple/purpleprotocolchat.h
@@ -33,6 +33,7 @@
 #include "connection.h"
 #include "purplemessage.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_CHAT (purple_protocol_chat_get_type())
 
@@ -44,6 +45,7 @@
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolChat, purple_protocol_chat, PURPLE,
                     PROTOCOL_CHAT, PurpleProtocol)
 
@@ -146,6 +148,7 @@ struct _PurpleProtocolChatInterface {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_chat_info(PurpleProtocolChat *protocol_chat, PurpleConnection *connection);
 
 /**
@@ -162,6 +165,7 @@ GList *purple_protocol_chat_info(PurpleP
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GHashTable *purple_protocol_chat_info_defaults(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, const gchar *chat_name);
 
 /**
@@ -175,6 +179,7 @@ GHashTable *purple_protocol_chat_info_de
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_join(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, GHashTable *components);
 
 /**
@@ -188,6 +193,7 @@ void purple_protocol_chat_join(PurplePro
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_reject(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, GHashTable *components);
 
 /**
@@ -202,6 +208,7 @@ void purple_protocol_chat_reject(PurpleP
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gchar *purple_protocol_chat_get_name(PurpleProtocolChat *protocol_chat, GHashTable *components);
 
 /**
@@ -216,6 +223,7 @@ gchar *purple_protocol_chat_get_name(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_invite(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, const gchar *message, const gchar *who);
 
 /**
@@ -228,6 +236,7 @@ void purple_protocol_chat_invite(PurpleP
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_leave(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id);
 
 /**
@@ -244,6 +253,7 @@ void purple_protocol_chat_leave(PurplePr
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_protocol_chat_send(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, PurpleConversation *conversation, PurpleMessage *message);
 
 /**
@@ -259,6 +269,7 @@ gint purple_protocol_chat_send(PurplePro
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gchar *purple_protocol_chat_get_user_real_name(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, const gchar *who);
 
 /**
@@ -272,6 +283,7 @@ gchar *purple_protocol_chat_get_user_rea
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_set_topic(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, const gchar *topic);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolclient.h b/libpurple/purpleprotocolclient.h
--- a/libpurple/purpleprotocolclient.h
+++ b/libpurple/purpleprotocolclient.h
@@ -33,6 +33,7 @@
 #include "purpleaccount.h"
 #include "connection.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_CLIENT (purple_protocol_client_get_type())
 G_DECLARE_INTERFACE(PurpleProtocolClient, purple_protocol_client, PURPLE,
@@ -148,6 +149,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_client_list_emblem(PurpleProtocolClient *client, PurpleBuddy *buddy);
 
 /**
@@ -163,6 +165,7 @@ const gchar *purple_protocol_client_list
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_client_blist_node_menu(PurpleProtocolClient *client, PurpleBlistNode *node);
 
 /**
@@ -174,6 +177,7 @@ GList *purple_protocol_client_blist_node
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_client_buddy_free(PurpleProtocolClient *client, PurpleBuddy *buddy);
 
 /**
@@ -186,6 +190,7 @@ void purple_protocol_client_buddy_free(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_client_convo_closed(PurpleProtocolClient *client, PurpleConnection *connection, const gchar *who);
 
 /**
@@ -202,9 +207,10 @@ void purple_protocol_client_convo_closed
  *
  * Since: 3.0.0
  *
- * Deprecated: 3.0.0: This should use purple_protcol_client_normalize_name when
+ * Deprecated: 3.0.0: This should use purple_protocol_client_normalize_name when
  *             it is created which will return an allocated value.
  */
+PURPLE_DEPRECATED
 const gchar *purple_protocol_client_normalize(PurpleProtocolClient *client, PurpleAccount *account, const gchar *who);
 
 /**
@@ -220,6 +226,7 @@ const gchar *purple_protocol_client_norm
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleChat *purple_protocol_client_find_blist_chat(PurpleProtocolClient *client, PurpleAccount *account, const gchar *name);
 
 /**
@@ -233,6 +240,7 @@ PurpleChat *purple_protocol_client_find_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_client_offline_message(PurpleProtocolClient *client, PurpleBuddy *buddy);
 
 /**
@@ -252,6 +260,7 @@ gboolean purple_protocol_client_offline_
  * Deprecated: 3.0.0: This is a premature optimization. Right now this is only
  *             used by GaduGadu for a single item and should be replaced.
  */
+PURPLE_DEPRECATED
 GHashTable *purple_protocol_client_get_account_text_table(PurpleProtocolClient *client, PurpleAccount *account);
 
 /**
@@ -266,6 +275,7 @@ GHashTable *purple_protocol_client_get_a
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gssize purple_protocol_client_get_max_message_size(PurpleProtocolClient *client, PurpleConversation *conv);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolcontacts.h b/libpurple/purpleprotocolcontacts.h
--- a/libpurple/purpleprotocolcontacts.h
+++ b/libpurple/purpleprotocolcontacts.h
@@ -31,8 +31,11 @@
 #include <glib-object.h>
 
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_CONTACTS (purple_protocol_contacts_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolContacts,
                     purple_protocol_contacts, PURPLE,
                     PROTOCOL_CONTACTS, PurpleProtocol)
@@ -87,6 +90,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_contacts_get_profile_async(PurpleProtocolContacts *protocol_contacts, PurpleContactInfo *info, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -104,6 +108,7 @@ void purple_protocol_contacts_get_profil
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 char *purple_protocol_contacts_get_profile_finish(PurpleProtocolContacts *protocol_contacts, GAsyncResult *result, GError **error);
 
 /**
@@ -118,6 +123,7 @@ char *purple_protocol_contacts_get_profi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GActionGroup *purple_protocol_contacts_get_actions(PurpleProtocolContacts *protocol_contacts, PurpleContactInfo *info);
 
 /**
@@ -134,6 +140,7 @@ GActionGroup *purple_protocol_contacts_g
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GMenuModel *purple_protocol_contacts_get_menu(PurpleProtocolContacts *protocol_contacts, PurpleContactInfo *info);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolcontactsearch.h b/libpurple/purpleprotocolcontactsearch.h
--- a/libpurple/purpleprotocolcontactsearch.h
+++ b/libpurple/purpleprotocolcontactsearch.h
@@ -31,14 +31,19 @@
 #include <glib-object.h>
 
 #include "purpleprotocol.h"
+#include "purpleversion.h"
+
+#define PURPLE_PROTOCOL_CONTACT_SEARCH_DOMAIN \
+	g_quark_from_static_string("purple-protocol-contact-search") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 #define PURPLE_TYPE_PROTOCOL_CONTACT_SEARCH (purple_protocol_contact_search_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolContactSearch,
                     purple_protocol_contact_search, PURPLE,
                     PROTOCOL_CONTACT_SEARCH, PurpleProtocol)
 
-#define PURPLE_PROTOCOL_CONTACT_SEARCH_DOMAIN (g_quark_from_static_string("purple-protocol-contact-search"))
-
 /**
  * PurpleProtocolContactSearch:
  *
@@ -87,6 +92,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_contact_search_search_async(PurpleProtocolContactSearch *search, PurpleAccount *account, const char *text, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -104,6 +110,7 @@ void purple_protocol_contact_search_sear
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_protocol_contact_search_search_finish(PurpleProtocolContactSearch *search, GAsyncResult *result, GError **error);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolconversation.h b/libpurple/purpleprotocolconversation.h
--- a/libpurple/purpleprotocolconversation.h
+++ b/libpurple/purpleprotocolconversation.h
@@ -37,10 +37,13 @@
 #include "purplemessage.h"
 #include "purpleprotocol.h"
 #include "purpletyping.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_PROTOCOL_CONVERSATION (purple_protocol_conversation_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolConversation, purple_protocol_conversation,
                     PURPLE, PROTOCOL_CONVERSATION, PurpleProtocol)
 
@@ -91,6 +94,7 @@ struct _PurpleProtocolConversationInterf
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_conversation_send_message_async(PurpleProtocolConversation *protocol, PurpleConversation *conversation, PurpleMessage *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -110,6 +114,7 @@ void purple_protocol_conversation_send_m
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_conversation_send_message_finish(PurpleProtocolConversation *protocol, GAsyncResult *result, GError **error);
 
 /**
@@ -132,6 +137,7 @@ gboolean purple_protocol_conversation_se
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_conversation_set_topic_async(PurpleProtocolConversation *protocol, PurpleConversation *conversation, const char *topic, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -151,6 +157,7 @@ void purple_protocol_conversation_set_to
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_conversation_set_topic_finish(PurpleProtocolConversation *protocol, GAsyncResult *result, GError **error);
 
 /**
@@ -165,6 +172,7 @@ gboolean purple_protocol_conversation_se
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleChannelJoinDetails *purple_protocol_conversation_get_channel_join_details(PurpleProtocolConversation *protocol, PurpleAccount *account);
 
 /**
@@ -185,6 +193,7 @@ PurpleChannelJoinDetails *purple_protoco
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_conversation_join_channel_async(PurpleProtocolConversation *protocol, PurpleAccount *account, PurpleChannelJoinDetails *details, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -204,6 +213,7 @@ void purple_protocol_conversation_join_c
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_conversation_join_channel_finish(PurpleProtocolConversation *protocol, GAsyncResult *result, GError **error);
 
 /**
@@ -221,6 +231,7 @@ gboolean purple_protocol_conversation_jo
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_conversation_set_avatar_async(PurpleProtocolConversation *protocol, PurpleConversation *conversation, PurpleAvatar *avatar, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -240,6 +251,7 @@ void purple_protocol_conversation_set_av
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_conversation_set_avatar_finish(PurpleProtocolConversation *protocol, GAsyncResult *result, GError **error);
 
 /**
@@ -254,6 +266,7 @@ gboolean purple_protocol_conversation_se
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_conversation_send_typing(PurpleProtocolConversation *protocol, PurpleConversation *conversation, PurpleTypingState state);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolfiletransfer.h b/libpurple/purpleprotocolfiletransfer.h
--- a/libpurple/purpleprotocolfiletransfer.h
+++ b/libpurple/purpleprotocolfiletransfer.h
@@ -32,8 +32,11 @@
 
 #include "purplefiletransfer.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_FILE_TRANSFER (purple_protocol_file_transfer_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolFileTransfer,
                     purple_protocol_file_transfer, PURPLE,
                     PROTOCOL_FILE_TRANSFER, PurpleProtocol)
@@ -86,6 +89,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_file_transfer_send_async(PurpleProtocolFileTransfer *protocol, PurpleFileTransfer *transfer, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -103,6 +107,7 @@ void purple_protocol_file_transfer_send_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_file_transfer_send_finish(PurpleProtocolFileTransfer *protocol, GAsyncResult *result, GError **error);
 
 /**
@@ -120,6 +125,7 @@ gboolean purple_protocol_file_transfer_s
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_file_transfer_receive_async(PurpleProtocolFileTransfer *protocol, PurpleFileTransfer *transfer, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -137,6 +143,7 @@ void purple_protocol_file_transfer_recei
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_file_transfer_receive_finish(PurpleProtocolFileTransfer *protocol, GAsyncResult *result, GError **error);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolim.h b/libpurple/purpleprotocolim.h
--- a/libpurple/purpleprotocolim.h
+++ b/libpurple/purpleprotocolim.h
@@ -33,6 +33,7 @@
 #include "connection.h"
 #include "purpleconversation.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_IM (purple_protocol_im_get_type())
 
@@ -44,6 +45,7 @@
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolIM, purple_protocol_im, PURPLE, PROTOCOL_IM,
                     PurpleProtocol)
 
diff --git a/libpurple/purpleprotocolmanager.h b/libpurple/purpleprotocolmanager.h
--- a/libpurple/purpleprotocolmanager.h
+++ b/libpurple/purpleprotocolmanager.h
@@ -27,6 +27,7 @@
 #include <glib-object.h>
 
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -37,9 +38,13 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
-#define PURPLE_PROTOCOL_MANAGER_DOMAIN (g_quark_from_static_string("purple-protocol-manager"))
+#define PURPLE_PROTOCOL_MANAGER_DOMAIN \
+	g_quark_from_static_string("purple-protocol-manager") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 #define PURPLE_TYPE_PROTOCOL_MANAGER (purple_protocol_manager_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleProtocolManager, purple_protocol_manager, PURPLE,
                      PROTOCOL_MANAGER, GObject)
 
@@ -61,6 +66,7 @@ G_DECLARE_FINAL_TYPE(PurpleProtocolManag
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleProtocolManagerForeachFunc)(PurpleProtocol *protocol, gpointer data);
 
 /**
@@ -72,6 +78,7 @@ typedef void (*PurpleProtocolManagerFore
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleProtocolManager *purple_protocol_manager_get_default(void);
 
 /**
@@ -87,6 +94,7 @@ PurpleProtocolManager *purple_protocol_m
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_manager_register(PurpleProtocolManager *manager, PurpleProtocol *protocol, GError **error);
 
 /**
@@ -102,6 +110,7 @@ gboolean purple_protocol_manager_registe
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_manager_unregister(PurpleProtocolManager *manager, PurpleProtocol *protocol, GError **error);
 
 /**
@@ -115,6 +124,7 @@ gboolean purple_protocol_manager_unregis
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleProtocol *purple_protocol_manager_find(PurpleProtocolManager *manager, const gchar *id);
 
 /**
@@ -127,6 +137,7 @@ PurpleProtocol *purple_protocol_manager_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_manager_foreach(PurpleProtocolManager *manager, PurpleProtocolManagerForeachFunc func, gpointer data);
 
 /**
@@ -141,6 +152,7 @@ void purple_protocol_manager_foreach(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_manager_get_all(PurpleProtocolManager *manager);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolmedia.h b/libpurple/purpleprotocolmedia.h
--- a/libpurple/purpleprotocolmedia.h
+++ b/libpurple/purpleprotocolmedia.h
@@ -33,6 +33,7 @@
 #include "media.h"
 #include "purpleaccount.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_MEDIA (purple_protocol_media_get_type())
 G_DECLARE_INTERFACE(PurpleProtocolMedia, purple_protocol_media, PURPLE,
@@ -98,6 +99,7 @@ struct _PurpleProtocolMediaInterface {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_media_initiate_session(PurpleProtocolMedia *media, PurpleAccount *account, const gchar *who, PurpleMediaSessionType type);
 
 /**
@@ -113,6 +115,7 @@ gboolean purple_protocol_media_initiate_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleMediaCaps purple_protocol_media_get_caps(PurpleProtocolMedia *media, PurpleAccount *account, const gchar *who);
 
 /**
@@ -132,6 +135,7 @@ PurpleMediaCaps purple_protocol_media_ge
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_media_send_dtmf(PurpleProtocolMedia *protocol_media, PurpleMedia *media, gchar dtmf, guint8 volume, guint8 duration);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolroomlist.h b/libpurple/purpleprotocolroomlist.h
--- a/libpurple/purpleprotocolroomlist.h
+++ b/libpurple/purpleprotocolroomlist.h
@@ -32,6 +32,7 @@
 #include "connection.h"
 #include "roomlist.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -44,6 +45,7 @@ G_BEGIN_DECLS
  * lists at the protocol level.
  */
 
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolRoomlist, purple_protocol_roomlist, PURPLE,
                     PROTOCOL_ROOMLIST, PurpleProtocol)
 
@@ -84,6 +86,7 @@ struct _PurpleProtocolRoomlistInterface 
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRoomlist *purple_protocol_roomlist_get_list(PurpleProtocolRoomlist *protocol_roomlist, PurpleConnection *gc);
 
 /**
@@ -96,6 +99,7 @@ PurpleRoomlist *purple_protocol_roomlist
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roomlist_cancel(PurpleProtocolRoomlist *protocol_roomlist, PurpleRoomlist *list);
 
 /**
@@ -108,6 +112,7 @@ void purple_protocol_roomlist_cancel(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roomlist_expand_category(PurpleProtocolRoomlist *protocol_roomlist, PurpleRoomlist *list, PurpleRoomlistRoom *category);
 
 /**
@@ -121,6 +126,7 @@ void purple_protocol_roomlist_expand_cat
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 char *purple_protocol_roomlist_room_serialize(PurpleProtocolRoomlist *protocol_roomlist, PurpleRoomlistRoom *room);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolroster.h b/libpurple/purpleprotocolroster.h
--- a/libpurple/purpleprotocolroster.h
+++ b/libpurple/purpleprotocolroster.h
@@ -33,8 +33,11 @@
 #include "purpleaccount.h"
 #include "purplecontact.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_ROSTER (purple_protocol_roster_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolRoster, purple_protocol_roster, PURPLE,
                     PROTOCOL_ROSTER, PurpleProtocol)
 
@@ -103,6 +106,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roster_add_async(PurpleProtocolRoster *roster, PurpleAccount *account, PurpleContact *contact, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -121,6 +125,7 @@ void purple_protocol_roster_add_async(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_roster_add_finish(PurpleProtocolRoster *roster, GAsyncResult *result, GError **error);
 
 /**
@@ -144,6 +149,7 @@ gboolean purple_protocol_roster_add_fini
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roster_update_async(PurpleProtocolRoster *roster, PurpleAccount *account, PurpleContact *contact, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -162,6 +168,7 @@ void purple_protocol_roster_update_async
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_roster_update_finish(PurpleProtocolRoster *roster, GAsyncResult *result, GError **error);
 
 /**
@@ -180,6 +187,7 @@ gboolean purple_protocol_roster_update_f
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roster_remove_async(PurpleProtocolRoster *roster, PurpleAccount *account, PurpleContact *contact, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -198,6 +206,7 @@ void purple_protocol_roster_remove_async
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_roster_remove_finish(PurpleProtocolRoster *roster, GAsyncResult *result, GError **error);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolserver.h b/libpurple/purpleprotocolserver.h
--- a/libpurple/purpleprotocolserver.h
+++ b/libpurple/purpleprotocolserver.h
@@ -36,8 +36,11 @@
 #include "purpleaccount.h"
 #include "purplemessage.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL_SERVER (purple_protocol_server_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolServer, purple_protocol_server, PURPLE,
                     PROTOCOL_SERVER, PurpleProtocol)
 
@@ -130,6 +133,7 @@ struct _PurpleProtocolServerInterface {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_set_info(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *info);
 
 /**
@@ -143,6 +147,7 @@ void purple_protocol_server_set_info(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_get_info(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who);
 
 /**
@@ -155,6 +160,7 @@ void purple_protocol_server_get_info(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_set_status(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleStatus *status);
 
 /**
@@ -167,6 +173,7 @@ void purple_protocol_server_set_status(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_set_idle(PurpleProtocolServer *protocol_server, PurpleConnection *connection, gint idletime);
 
 /**
@@ -180,6 +187,7 @@ void purple_protocol_server_set_idle(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_change_passwd(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *old_pass, const gchar *new_pass);
 
 /**
@@ -198,6 +206,7 @@ void purple_protocol_server_change_passw
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group, const gchar *message);
 
 /**
@@ -211,6 +220,7 @@ void purple_protocol_server_add_buddy(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_remove_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group);
 
 /**
@@ -230,6 +240,7 @@ void purple_protocol_server_remove_buddy
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_remove_buddies(PurpleProtocolServer *protocol_server, PurpleConnection *connection, GList *buddies, GList *groups);
 
 /**
@@ -241,6 +252,7 @@ void purple_protocol_server_remove_buddi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_keepalive(PurpleProtocolServer *protocol_server, PurpleConnection *connection);
 
 /**
@@ -255,6 +267,7 @@ void purple_protocol_server_keepalive(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_protocol_server_get_keepalive_interval(PurpleProtocolServer *protocol_server);
 
 /**
@@ -268,6 +281,7 @@ gint purple_protocol_server_get_keepaliv
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_alias_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who, const gchar *alias);
 
 /**
@@ -282,6 +296,7 @@ void purple_protocol_server_alias_buddy(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_group_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who, const gchar *old_group, const gchar *new_group);
 
 /**
@@ -297,6 +312,7 @@ void purple_protocol_server_group_buddy(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_rename_group(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *old_name, PurpleGroup *group, GList *moved_buddies);
 
 /**
@@ -309,6 +325,7 @@ void purple_protocol_server_rename_group
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_set_buddy_icon(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleImage *img);
 
 /**
@@ -321,6 +338,7 @@ void purple_protocol_server_set_buddy_ic
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_remove_group(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleGroup *group);
 
 /**
@@ -337,6 +355,7 @@ void purple_protocol_server_remove_group
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gint purple_protocol_server_send_raw(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *buf, gint len);
 
 G_END_DECLS
diff --git a/libpurple/purpleprotocolwhiteboard.h b/libpurple/purpleprotocolwhiteboard.h
--- a/libpurple/purpleprotocolwhiteboard.h
+++ b/libpurple/purpleprotocolwhiteboard.h
@@ -31,9 +31,12 @@
 #include <glib-object.h>
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 #include "purplewhiteboard.h"
 
 #define PURPLE_TYPE_PROTOCOL_WHITEBOARD (purple_protocol_whiteboard_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolWhiteboard, purple_protocol_whiteboard, PURPLE,
                     PROTOCOL_WHITEBOARD, PurpleProtocol)
 
@@ -82,6 +85,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleWhiteboard *purple_protocol_whiteboard_create(PurpleProtocolWhiteboard *whiteboard, PurpleAccount *account, const gchar *who, gint state);
 
 G_END_DECLS
diff --git a/libpurple/purpleproxyinfo.h b/libpurple/purpleproxyinfo.h
--- a/libpurple/purpleproxyinfo.h
+++ b/libpurple/purpleproxyinfo.h
@@ -26,6 +26,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 /**
  * PurpleProxyType:
  * @PURPLE_PROXY_TYPE_USE_GLOBAL: Use the global proxy information.
@@ -91,6 +93,7 @@ PurpleProxyType purple_proxy_info_get_pr
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_proxy_info_set_hostname(PurpleProxyInfo *info, const gchar *hostname);
 
 /**
@@ -103,6 +106,7 @@ void purple_proxy_info_set_hostname(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_proxy_info_get_hostname(PurpleProxyInfo *info);
 
 /**
diff --git a/libpurple/purpleroomlistroom.h b/libpurple/purpleroomlistroom.h
--- a/libpurple/purpleroomlistroom.h
+++ b/libpurple/purpleroomlistroom.h
@@ -26,6 +26,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_ROOMLIST_ROOM (purple_roomlist_room_get_type())
@@ -48,6 +50,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleRoomlistRoom, purple_roomlist_room, PURPLE,
 						 ROOMLIST_ROOM, GObject)
 
@@ -67,6 +70,7 @@ struct _PurpleRoomlistRoomClass {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRoomlistRoom *purple_roomlist_room_new(const gchar *name, const gchar *description);
 
 /**
@@ -79,6 +83,7 @@ PurpleRoomlistRoom *purple_roomlist_room
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_roomlist_room_get_name(PurpleRoomlistRoom *room);
 
 /**
@@ -91,6 +96,7 @@ const gchar *purple_roomlist_room_get_na
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_roomlist_room_get_description(PurpleRoomlistRoom *room);
 
 /**
@@ -104,6 +110,7 @@ const gchar *purple_roomlist_room_get_de
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_roomlist_room_get_category(PurpleRoomlistRoom *room);
 
 /**
@@ -115,6 +122,7 @@ const gchar *purple_roomlist_room_get_ca
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_roomlist_room_set_category(PurpleRoomlistRoom *room, const gchar *category);
 
 /**
@@ -127,6 +135,7 @@ void purple_roomlist_room_set_category(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint purple_roomlist_room_get_user_count(PurpleRoomlistRoom *room);
 
 /**
@@ -138,6 +147,7 @@ guint purple_roomlist_room_get_user_coun
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_roomlist_room_set_user_count(PurpleRoomlistRoom *room, guint user_count);
 
 /**
@@ -150,6 +160,7 @@ void purple_roomlist_room_set_user_count
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_roomlist_room_add_field(PurpleRoomlistRoom *room, const gchar *field, const gchar *value);
 
 /**
@@ -163,6 +174,7 @@ void purple_roomlist_room_add_field(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_roomlist_room_get_field(PurpleRoomlistRoom *room, const gchar *field);
 
 /**
@@ -176,6 +188,7 @@ const gchar *purple_roomlist_room_get_fi
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GHashTable *purple_roomlist_room_get_components(PurpleRoomlistRoom *room);
 
 G_END_DECLS
diff --git a/libpurple/purplesavedpresence.h b/libpurple/purplesavedpresence.h
--- a/libpurple/purplesavedpresence.h
+++ b/libpurple/purplesavedpresence.h
@@ -31,6 +31,7 @@
 #include <glib-object.h>
 
 #include "purplepresence.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -49,6 +50,7 @@ G_DECLARE_FINAL_TYPE(PurpleSavedPresence
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_saved_presence_get_last_used(PurpleSavedPresence *presence);
 
 /**
@@ -61,6 +63,7 @@ GDateTime *purple_saved_presence_get_las
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_saved_presence_set_last_used(PurpleSavedPresence *presence, GDateTime *last_used);
 
 /**
@@ -73,6 +76,7 @@ void purple_saved_presence_set_last_used
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint64 purple_saved_presence_get_use_count(PurpleSavedPresence *presence);
 
 /**
@@ -84,6 +88,7 @@ guint64 purple_saved_presence_get_use_co
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_saved_presence_set_use_count(PurpleSavedPresence *presence, guint64 use_count);
 
 /**
@@ -97,6 +102,7 @@ void purple_saved_presence_set_use_count
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_saved_presence_get_id(PurpleSavedPresence *presence);
 
 /**
@@ -109,6 +115,7 @@ const char *purple_saved_presence_get_id
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_saved_presence_get_name(PurpleSavedPresence *presence);
 
 /**
@@ -121,6 +128,7 @@ const char *purple_saved_presence_get_na
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_saved_presence_set_name(PurpleSavedPresence *presence, const char *name);
 
 /**
@@ -134,6 +142,7 @@ void purple_saved_presence_set_name(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_saved_presence_get_escaped_name(PurpleSavedPresence *presence);
 
 /**
@@ -146,6 +155,7 @@ const char *purple_saved_presence_get_es
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurplePresencePrimitive purple_saved_presence_get_primitive(PurpleSavedPresence *presence);
 
 /**
@@ -157,6 +167,7 @@ PurplePresencePrimitive purple_saved_pre
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_saved_presence_set_primitive(PurpleSavedPresence *presence, PurplePresencePrimitive primitive);
 
 /**
@@ -169,6 +180,7 @@ void purple_saved_presence_set_primitive
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_saved_presence_get_message(PurpleSavedPresence *presence);
 
 /**
@@ -181,6 +193,7 @@ const char *purple_saved_presence_get_me
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_saved_presence_set_message(PurpleSavedPresence *presence, const char *message);
 
 /**
@@ -193,6 +206,7 @@ void purple_saved_presence_set_message(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_saved_presence_get_emoji(PurpleSavedPresence *presence);
 
 /**
@@ -205,6 +219,7 @@ const char *purple_saved_presence_get_em
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_saved_presence_set_emoji(PurpleSavedPresence *presence, const char *emoji);
 
 /**
@@ -219,6 +234,7 @@ void purple_saved_presence_set_emoji(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_saved_presence_equal(PurpleSavedPresence *a, PurpleSavedPresence *b);
 
 G_END_DECLS
diff --git a/libpurple/purplesqlite3.h b/libpurple/purplesqlite3.h
--- a/libpurple/purplesqlite3.h
+++ b/libpurple/purplesqlite3.h
@@ -26,6 +26,8 @@
 #include <glib.h>
 #include <gio/gio.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 /**
@@ -35,7 +37,9 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
-#define PURPLE_SQLITE3_DOMAIN (g_quark_from_static_string("sqlite3"))
+#define PURPLE_SQLITE3_DOMAIN \
+	g_quark_from_static_string("sqlite3") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 /**
  * PurpleSqlite3:
@@ -50,6 +54,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 #ifdef SQLITE_API
 typedef sqlite3 PurpleSqlite3;
 #else
@@ -68,6 +73,7 @@ typedef gpointer PurpleSqlite3;
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_sqlite3_get_schema_version(PurpleSqlite3 *db, GError **error);
 
 /**
@@ -109,6 +115,7 @@ int purple_sqlite3_get_schema_version(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_sqlite3_run_migrations_from_strings(PurpleSqlite3 *db, const char *migrations[], GError **error);
 
 /**
@@ -135,6 +142,7 @@ gboolean purple_sqlite3_run_migrations_f
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_sqlite3_run_migrations_from_resources(PurpleSqlite3 *db, const char *path, const char *migrations[], GError **error);
 
 G_END_DECLS
diff --git a/libpurple/purplesqlitehistoryadapter.h b/libpurple/purplesqlitehistoryadapter.h
--- a/libpurple/purplesqlitehistoryadapter.h
+++ b/libpurple/purplesqlitehistoryadapter.h
@@ -28,6 +28,7 @@
 
 #include "purplehistoryadapter.h"
 #include "purplemessage.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -41,6 +42,8 @@ G_BEGIN_DECLS
  */
 
 #define PURPLE_TYPE_SQLITE_HISTORY_ADAPTER (purple_sqlite_history_adapter_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleSqliteHistoryAdapter, purple_sqlite_history_adapter,
                      PURPLE, SQLITE_HISTORY_ADAPTER, PurpleHistoryAdapter)
 
@@ -54,6 +57,7 @@ G_DECLARE_FINAL_TYPE(PurpleSqliteHistory
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleHistoryAdapter *purple_sqlite_history_adapter_new(const gchar *filename);
 
 /**
@@ -66,6 +70,7 @@ PurpleHistoryAdapter *purple_sqlite_hist
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_sqlite_history_adapter_get_filename(PurpleSqliteHistoryAdapter *adapter);
 
 G_END_DECLS
diff --git a/libpurple/purpletags.h b/libpurple/purpletags.h
--- a/libpurple/purpletags.h
+++ b/libpurple/purpletags.h
@@ -30,7 +30,11 @@
 #include <glib.h>
 #include <gio/gio.h>
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_TAGS (purple_tags_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleTags, purple_tags, PURPLE, TAGS, GObject)
 
 /**
@@ -56,6 +60,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_tags_new(void);
 
 /**
@@ -74,6 +79,7 @@ PurpleTags *purple_tags_new(void);
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_tags_lookup(PurpleTags *tags, const gchar *name, gboolean *found);
 
 /**
@@ -88,6 +94,7 @@ const gchar *purple_tags_lookup(PurpleTa
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_tags_get(PurpleTags *tags, const gchar *name);
 
 /**
@@ -100,6 +107,7 @@ const gchar *purple_tags_get(PurpleTags 
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_tags_add(PurpleTags *tags, const gchar *tag);
 
 /**
@@ -113,6 +121,7 @@ void purple_tags_add(PurpleTags *tags, c
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_tags_add_with_value(PurpleTags *tags, const char *name, const char *value);
 
 /**
@@ -127,6 +136,7 @@ void purple_tags_add_with_value(PurpleTa
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_tags_remove(PurpleTags *tags, const gchar *tag);
 
 /**
@@ -142,6 +152,7 @@ gboolean purple_tags_remove(PurpleTags *
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_tags_remove_with_value(PurpleTags *tags, const char *name, const char *value);
 
 /**
@@ -154,6 +165,7 @@ gboolean purple_tags_remove_with_value(P
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 guint purple_tags_get_count(PurpleTags *tags);
 
 /**
@@ -166,6 +178,7 @@ guint purple_tags_get_count(PurpleTags *
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_tags_get_all(PurpleTags *tags);
 
 /**
@@ -180,6 +193,7 @@ GList *purple_tags_get_all(PurpleTags *t
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GList *purple_tags_get_all_with_name(PurpleTags *tags, const char *name);
 
 /**
@@ -193,6 +207,7 @@ GList *purple_tags_get_all_with_name(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gchar *purple_tags_to_string(PurpleTags *tags, const gchar *separator);
 
 /**
@@ -207,6 +222,7 @@ gchar *purple_tags_to_string(PurpleTags 
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_tag_parse(const char *tag, char **name, char **value);
 
 G_END_DECLS
diff --git a/libpurple/purpletyping.h b/libpurple/purpletyping.h
--- a/libpurple/purpletyping.h
+++ b/libpurple/purpletyping.h
@@ -35,6 +35,7 @@
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum {
     PURPLE_TYPING_STATE_NONE,
     PURPLE_TYPING_STATE_TYPING,
diff --git a/libpurple/purpleui.h b/libpurple/purpleui.h
--- a/libpurple/purpleui.h
+++ b/libpurple/purpleui.h
@@ -26,9 +26,13 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_UI (purple_ui_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleUi, purple_ui, PURPLE, UI, GObject)
 
 /**
@@ -82,6 +86,7 @@ struct _PurpleUiClass {
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_ui_get_id(PurpleUi *ui);
 
 /**
@@ -94,6 +99,7 @@ const char *purple_ui_get_id(PurpleUi *u
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_ui_get_name(PurpleUi *ui);
 
 /**
@@ -106,6 +112,7 @@ const char *purple_ui_get_name(PurpleUi 
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_ui_get_version(PurpleUi *ui);
 
 /**
@@ -118,6 +125,7 @@ const char *purple_ui_get_version(Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_ui_get_website(PurpleUi *ui);
 
 /**
@@ -130,6 +138,7 @@ const char *purple_ui_get_website(Purple
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_ui_get_support_website(PurpleUi *ui);
 
 /**
@@ -142,6 +151,7 @@ const char *purple_ui_get_support_websit
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_ui_get_client_type(PurpleUi *ui);
 
 /**
@@ -154,6 +164,7 @@ const char *purple_ui_get_client_type(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_ui_prefs_init(PurpleUi *ui);
 
 /**
@@ -173,6 +184,7 @@ void purple_ui_prefs_init(PurpleUi *ui);
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_ui_start(PurpleUi *ui, GError **error);
 
 /**
@@ -185,6 +197,7 @@ gboolean purple_ui_start(PurpleUi *ui, G
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_ui_stop(PurpleUi *ui);
 
 /**
@@ -199,6 +212,7 @@ void purple_ui_stop(PurpleUi *ui);
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer purple_ui_get_settings_backend(PurpleUi *ui);
 
 
diff --git a/libpurple/purpleversion.h b/libpurple/purpleversion.h
--- a/libpurple/purpleversion.h
+++ b/libpurple/purpleversion.h
@@ -29,6 +29,106 @@
 
 #include <glib.h>
 
+#include "purpleversionconsts.h"
+
+#if (defined(_WIN32) || defined(__CYGWIN__)) && \
+	!defined(PURPLE_STATIC_COMPILATION)
+#define _PURPLE_EXPORT __declspec(dllexport)
+#define _PURPLE_IMPORT __declspec(dllimport)
+#elif __GNUC__ >= 4
+#define _PURPLE_EXPORT __attribute__((visibility("default")))
+#define _PURPLE_IMPORT
+#else
+#define _PURPLE_EXPORT
+#define _PURPLE_IMPORT
+#endif
+#ifdef PURPLE_COMPILATION
+#define _PURPLE_API _PURPLE_EXPORT
+#else
+#define _PURPLE_API _PURPLE_IMPORT
+#endif
+
+#define _PURPLE_EXTERN _PURPLE_API extern
+
+#ifdef PURPLE_DISABLE_DEPRECATION_WARNINGS
+#define PURPLE_DEPRECATED _PURPLE_EXTERN
+#define PURPLE_DEPRECATED_FOR(f) _PURPLE_EXTERN
+#define PURPLE_UNAVAILABLE(maj, min) _PURPLE_EXTERN
+#define PURPLE_UNAVAILABLE_STATIC_INLINE(maj, min)
+#define PURPLE_UNAVAILABLE_TYPE(maj, min)
+#else
+#define PURPLE_DEPRECATED G_DEPRECATED _PURPLE_EXTERN
+#define PURPLE_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _PURPLE_EXTERN
+#define PURPLE_UNAVAILABLE(maj, min) G_UNAVAILABLE(maj, min) _PURPLE_EXTERN
+#define PURPLE_UNAVAILABLE_STATIC_INLINE(maj, min) G_UNAVAILABLE(maj, min)
+#define PURPLE_UNAVAILABLE_TYPE(maj, min) G_UNAVAILABLE(maj, min)
+#endif
+
+/**
+ * PURPLE_VERSION_CUR_STABLE:
+ *
+ * A macro that evaluates to the current stable version of libpurple, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 3.0.0
+ */
+#define PURPLE_VERSION_CUR_STABLE \
+	(G_ENCODE_VERSION(PURPLE_MAJOR_VERSION, PURPLE_MINOR_VERSION))
+
+/* If the package sets PURPLE_VERSION_MIN_REQUIRED to some future
+ * PURPLE_VERSION_X_Y value that we don't know about, it will compare as 0 in
+ * preprocessor tests.
+ */
+#ifndef PURPLE_VERSION_MIN_REQUIRED
+#define PURPLE_VERSION_MIN_REQUIRED (PURPLE_VERSION_CUR_STABLE)
+#elif PURPLE_VERSION_MIN_REQUIRED == 0
+#undef PURPLE_VERSION_MIN_REQUIRED
+#define PURPLE_VERSION_MIN_REQUIRED (PURPLE_VERSION_CUR_STABLE + 1)
+#endif /* PURPLE_VERSION_MIN_REQUIRED */
+
+#if !defined(PURPLE_VERSION_MAX_ALLOWED) || (PURPLE_VERSION_MAX_ALLOWED == 0)
+#undef PURPLE_VERSION_MAX_ALLOWED
+#define PURPLE_VERSION_MAX_ALLOWED (PURPLE_VERSION_CUR_STABLE)
+#endif /* PURPLE_VERSION_MAX_ALLOWED */
+
+/* sanity checks */
+#if PURPLE_VERSION_MIN_REQUIRED > PURPLE_VERSION_CUR_STABLE
+#error "PURPLE_VERSION_MIN_REQUIRED must be <= PURPLE_VERSION_CUR_STABLE"
+#endif
+#if PURPLE_VERSION_MAX_ALLOWED < PURPLE_VERSION_MIN_REQUIRED
+#error "PURPLE_VERSION_MAX_ALLOWED must be >= PURPLE_VERSION_MIN_REQUIRED"
+#endif
+#if PURPLE_VERSION_MIN_REQUIRED < G_ENCODE_VERSION(0, 1)
+#error "PURPLE_VERSION_MIN_REQUIRED must be >= PURPLE_VERSION_0_1"
+#endif
+
+#define PURPLE_VAR _PURPLE_EXTERN
+#define PURPLE_AVAILABLE_IN_ALL _PURPLE_EXTERN
+
+/**
+ * PURPLE_VERSION_3_0:
+ *
+ * A macro that evaluates to the 3.0 version of libpurple, in a format that can
+ * be used by the C pre-processor.
+ *
+ * Since: 3.0.0
+ */
+#define PURPLE_VERSION_3_0 (G_ENCODE_VERSION(3, 0))
+
+#if PURPLE_VERSION_MAX_ALLOWED < PURPLE_VERSION_3_0
+#define PURPLE_AVAILABLE_IN_3_0 PURPLE_UNAVAILABLE(3, 0)
+#define PURPLE_AVAILABLE_STATIC_INLINE_IN_3_0 PURPLE_UNAVAILABLE_STATIC_INLINE(3, 0)
+#define PURPLE_AVAILABLE_MACRO_IN_3_0 PURPLE_UNAVAILABLE_MACRO(3, 0)
+#define PURPLE_AVAILABLE_ENUMERATOR_IN_3_0 PURPLE_UNAVAILABLE_ENUMERATOR(3, 0)
+#define PURPLE_AVAILABLE_TYPE_IN_3_0 PURPLE_UNAVAILABLE_TYPE(3, 0)
+#else
+#define PURPLE_AVAILABLE_IN_3_0 _PURPLE_EXTERN
+#define PURPLE_AVAILABLE_STATIC_INLINE_IN_3_0
+#define PURPLE_AVAILABLE_MACRO_IN_3_0
+#define PURPLE_AVAILABLE_ENUMERATOR_IN_3_0
+#define PURPLE_AVAILABLE_TYPE_IN_3_0
+#endif
+
 /**
  * PURPLE_VERSION_CHECK:
  * @major: The major version to check for.
diff --git a/libpurple/purplewhiteboard.h b/libpurple/purplewhiteboard.h
--- a/libpurple/purplewhiteboard.h
+++ b/libpurple/purplewhiteboard.h
@@ -31,6 +31,7 @@
 typedef struct _PurpleWhiteboard PurpleWhiteboard;
 
 #include "purpleaccount.h"
+#include "purpleversion.h"
 #include "purplewhiteboardops.h"
 
 /**
@@ -107,6 +108,7 @@ PurpleAccount *purple_whiteboard_get_acc
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_whiteboard_get_id(PurpleWhiteboard *whiteboard);
 
 /**
@@ -299,6 +301,7 @@ gpointer purple_whiteboard_get_protocol_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_whiteboard_equal(PurpleWhiteboard *whiteboard1, PurpleWhiteboard *whiteboard2);
 
 G_END_DECLS
diff --git a/libpurple/purplewhiteboardmanager.h b/libpurple/purplewhiteboardmanager.h
--- a/libpurple/purplewhiteboardmanager.h
+++ b/libpurple/purplewhiteboardmanager.h
@@ -26,6 +26,7 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
 #include "purplewhiteboard.h"
 
 G_BEGIN_DECLS
@@ -37,7 +38,9 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
-#define PURPLE_WHITEBOARD_MANAGER_DOMAIN (g_quark_from_static_string("purple-whiteboard-manager"))
+#define PURPLE_WHITEBOARD_MANAGER_DOMAIN \
+	g_quark_from_static_string("purple-whiteboard-manager") \
+	PURPLE_AVAILABLE_MACRO_IN_3_0
 
 #define PURPLE_TYPE_WHITEBOARD_MANAGER (purple_whiteboard_manager_get_type())
 
@@ -49,6 +52,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleWhiteboardManager, purple_whiteboard_manager,
                      PURPLE, WHITEBOARD_MANAGER, GObject)
 
@@ -61,6 +65,7 @@ G_DECLARE_FINAL_TYPE(PurpleWhiteboardMan
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleWhiteboardManager *purple_whiteboard_manager_get_default(void);
 
 /**
@@ -73,6 +78,7 @@ PurpleWhiteboardManager *purple_whiteboa
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_whiteboard_manager_get_default_as_model(void);
 
 /**
@@ -88,6 +94,7 @@ GListModel *purple_whiteboard_manager_ge
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_whiteboard_manager_register(PurpleWhiteboardManager *manager, PurpleWhiteboard *whiteboard, GError **error);
 
 /**
@@ -103,6 +110,7 @@ gboolean purple_whiteboard_manager_regis
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_whiteboard_manager_unregister(PurpleWhiteboardManager *manager, PurpleWhiteboard *whiteboard, GError **error);
 
 /**
@@ -116,6 +124,7 @@ gboolean purple_whiteboard_manager_unreg
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleWhiteboard *purple_whiteboard_manager_find(PurpleWhiteboardManager *manager, const gchar *id);
 
 G_END_DECLS
diff --git a/libpurple/queuedoutputstream.h b/libpurple/queuedoutputstream.h
--- a/libpurple/queuedoutputstream.h
+++ b/libpurple/queuedoutputstream.h
@@ -25,6 +25,8 @@
 
 #include <gio/gio.h>
 
+#include "purpleversion.h"
+
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_QUEUED_OUTPUT_STREAM  purple_queued_output_stream_get_type()
@@ -48,6 +50,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleQueuedOutputStream, purple_queued_output_stream,
                      PURPLE, QUEUED_OUTPUT_STREAM, GFilterOutputStream)
 
@@ -61,6 +64,7 @@ G_DECLARE_FINAL_TYPE(PurpleQueuedOutputS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleQueuedOutputStream *purple_queued_output_stream_new(GOutputStream *base_stream);
 
 /**
@@ -82,6 +86,7 @@ PurpleQueuedOutputStream *purple_queued_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_queued_output_stream_push_bytes_async(PurpleQueuedOutputStream *stream, GBytes *bytes, int priority, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
 
 /**
@@ -96,6 +101,7 @@ void purple_queued_output_stream_push_by
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_queued_output_stream_push_bytes_finish(PurpleQueuedOutputStream *stream, GAsyncResult *result, GError **error);
 
 /**
@@ -112,6 +118,7 @@ gboolean purple_queued_output_stream_pus
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_queued_output_stream_clear_queue(PurpleQueuedOutputStream *stream);
 
 G_END_DECLS
diff --git a/libpurple/request/purplerequestfield.h b/libpurple/request/purplerequestfield.h
--- a/libpurple/request/purplerequestfield.h
+++ b/libpurple/request/purplerequestfield.h
@@ -40,6 +40,7 @@
 typedef struct _PurpleRequestField PurpleRequestField;
 
 #include "purplerequestgroup.h"
+#include "purpleversion.h"
 
 /**
  * PurpleRequestFieldClass:
@@ -75,6 +76,8 @@ typedef gboolean (*PurpleRequestFieldVal
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_REQUEST_FIELD (purple_request_field_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_DERIVABLE_TYPE(PurpleRequestField, purple_request_field,
                          PURPLE, REQUEST_FIELD, GObject)
 
diff --git a/libpurple/request/purplerequestfieldaccount.h b/libpurple/request/purplerequestfieldaccount.h
--- a/libpurple/request/purplerequestfieldaccount.h
+++ b/libpurple/request/purplerequestfieldaccount.h
@@ -32,6 +32,7 @@
 
 #include "purpleaccount.h"
 #include "purplerequestfield.h"
+#include "purpleversion.h"
 
 /**
  * PurpleRequestFieldAccountFilterFunc:
@@ -47,6 +48,7 @@
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef gboolean (*PurpleRequestFieldAccountFilterFunc)(PurpleAccount *account, gpointer user_data);
 
 G_BEGIN_DECLS
@@ -59,6 +61,8 @@ G_BEGIN_DECLS
  * Since: 3.0.0
  */
 #define PURPLE_TYPE_REQUEST_FIELD_ACCOUNT (purple_request_field_account_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldAccount, purple_request_field_account,
                      PURPLE, REQUEST_FIELD_ACCOUNT, PurpleRequestField)
 
@@ -165,6 +169,7 @@ gboolean purple_request_field_account_ge
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_field_account_match(PurpleRequestFieldAccount *field, PurpleAccount *account);
 
 G_END_DECLS
diff --git a/libpurple/request/purplerequestfieldbool.h b/libpurple/request/purplerequestfieldbool.h
--- a/libpurple/request/purplerequestfieldbool.h
+++ b/libpurple/request/purplerequestfieldbool.h
@@ -31,6 +31,7 @@
 #include <glib-object.h>
 
 #include "purplerequestfield.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -42,6 +43,8 @@ G_BEGIN_DECLS
  * Since: 3.0.0
  */
 #define PURPLE_TYPE_REQUEST_FIELD_BOOL (purple_request_field_bool_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldBool, purple_request_field_bool,
                      PURPLE, REQUEST_FIELD_BOOL, PurpleRequestField)
 
diff --git a/libpurple/request/purplerequestfieldchoice.h b/libpurple/request/purplerequestfieldchoice.h
--- a/libpurple/request/purplerequestfieldchoice.h
+++ b/libpurple/request/purplerequestfieldchoice.h
@@ -31,6 +31,7 @@
 #include <glib-object.h>
 
 #include "purplerequestfield.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -42,6 +43,8 @@ G_BEGIN_DECLS
  * Since: 3.0.0
  */
 #define PURPLE_TYPE_REQUEST_FIELD_CHOICE (purple_request_field_choice_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldChoice, purple_request_field_choice,
                      PURPLE, REQUEST_FIELD_CHOICE, PurpleRequestField)
 
diff --git a/libpurple/request/purplerequestfielddatasheet.h b/libpurple/request/purplerequestfielddatasheet.h
--- a/libpurple/request/purplerequestfielddatasheet.h
+++ b/libpurple/request/purplerequestfielddatasheet.h
@@ -32,6 +32,7 @@
 
 #include "request.h"
 #include "request-datasheet.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -43,6 +44,8 @@ G_BEGIN_DECLS
  * Since: 3.0.0
  */
 #define PURPLE_TYPE_REQUEST_FIELD_DATASHEET (purple_request_field_datasheet_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldDatasheet, purple_request_field_datasheet,
                      PURPLE, REQUEST_FIELD_DATASHEET, PurpleRequestField)
 
diff --git a/libpurple/request/purplerequestfieldimage.h b/libpurple/request/purplerequestfieldimage.h
--- a/libpurple/request/purplerequestfieldimage.h
+++ b/libpurple/request/purplerequestfieldimage.h
@@ -30,6 +30,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include "purpleversion.h"
+
 /**
  * PurpleRequestFieldImage:
  *
@@ -44,6 +46,8 @@ typedef struct _PurpleRequestFieldImage 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_REQUEST_FIELD_IMAGE (purple_request_field_image_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldImage, purple_request_field_image,
                      PURPLE, REQUEST_FIELD_IMAGE, PurpleRequestField)
 
diff --git a/libpurple/request/purplerequestfieldint.h b/libpurple/request/purplerequestfieldint.h
--- a/libpurple/request/purplerequestfieldint.h
+++ b/libpurple/request/purplerequestfieldint.h
@@ -31,6 +31,7 @@
 #include <glib-object.h>
 
 #include "purplerequestfield.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -42,6 +43,8 @@ G_BEGIN_DECLS
  * Since: 3.0.0
  */
 #define PURPLE_TYPE_REQUEST_FIELD_INT (purple_request_field_int_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldInt, purple_request_field_int,
                      PURPLE, REQUEST_FIELD_INT, PurpleRequestField)
 
diff --git a/libpurple/request/purplerequestfieldlabel.h b/libpurple/request/purplerequestfieldlabel.h
--- a/libpurple/request/purplerequestfieldlabel.h
+++ b/libpurple/request/purplerequestfieldlabel.h
@@ -31,6 +31,7 @@
 #include <glib-object.h>
 
 #include "purplerequestfield.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -42,6 +43,8 @@ G_BEGIN_DECLS
  * Since: 3.0.0
  */
 #define PURPLE_TYPE_REQUEST_FIELD_LABEL (purple_request_field_label_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldLabel, purple_request_field_label,
                      PURPLE, REQUEST_FIELD_LABEL, PurpleRequestField)
 
diff --git a/libpurple/request/purplerequestfieldlist.h b/libpurple/request/purplerequestfieldlist.h
--- a/libpurple/request/purplerequestfieldlist.h
+++ b/libpurple/request/purplerequestfieldlist.h
@@ -31,6 +31,7 @@
 #include <glib-object.h>
 
 #include "purplerequestfield.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -42,6 +43,8 @@ G_BEGIN_DECLS
  * Since: 3.0.0
  */
 #define PURPLE_TYPE_REQUEST_FIELD_LIST (purple_request_field_list_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldList, purple_request_field_list,
                      PURPLE, REQUEST_FIELD_LIST, PurpleRequestField)
 
diff --git a/libpurple/request/purplerequestfieldstring.h b/libpurple/request/purplerequestfieldstring.h
--- a/libpurple/request/purplerequestfieldstring.h
+++ b/libpurple/request/purplerequestfieldstring.h
@@ -31,6 +31,7 @@
 #include <glib-object.h>
 
 #include "purplerequestfield.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -42,6 +43,8 @@ G_BEGIN_DECLS
  * Since: 3.0.0
  */
 #define PURPLE_TYPE_REQUEST_FIELD_STRING (purple_request_field_string_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestFieldString, purple_request_field_string,
                      PURPLE, REQUEST_FIELD_STRING, PurpleRequestField)
 
diff --git a/libpurple/request/purplerequestgroup.h b/libpurple/request/purplerequestgroup.h
--- a/libpurple/request/purplerequestgroup.h
+++ b/libpurple/request/purplerequestgroup.h
@@ -41,8 +41,11 @@ typedef struct _PurpleRequestGroup Purpl
 
 #include "purplerequestfield.h"
 #include "purplerequestpage.h"
+#include "purpleversion.h"
 
 #define PURPLE_TYPE_REQUEST_GROUP (purple_request_group_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestGroup, purple_request_group,
                      PURPLE, REQUEST_GROUP, GObject)
 
@@ -58,6 +61,7 @@ G_BEGIN_DECLS
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestGroup *purple_request_group_new(const char *title);
 
 /**
@@ -69,6 +73,7 @@ PurpleRequestGroup *purple_request_group
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_request_group_add_field(PurpleRequestGroup *group, PurpleRequestField *field);
 
 /**
@@ -81,6 +86,7 @@ void purple_request_group_add_field(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_request_group_get_title(PurpleRequestGroup *group);
 
 /**
@@ -93,6 +99,7 @@ const char *purple_request_group_get_tit
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestPage *purple_request_group_get_page(PurpleRequestGroup *group);
 
 /**
@@ -105,6 +112,7 @@ PurpleRequestPage *purple_request_group_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_group_is_valid(PurpleRequestGroup *group);
 
 G_END_DECLS
diff --git a/libpurple/request/purplerequestpage.h b/libpurple/request/purplerequestpage.h
--- a/libpurple/request/purplerequestpage.h
+++ b/libpurple/request/purplerequestpage.h
@@ -42,10 +42,13 @@ typedef struct _PurpleRequestPage Purple
 #include "purpleaccount.h"
 #include "purplerequestgroup.h"
 #include "purplerequestfield.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
 #define PURPLE_TYPE_REQUEST_PAGE (purple_request_page_get_type())
+
+PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleRequestPage, purple_request_page,
                      PURPLE, REQUEST_PAGE, GObject)
 
@@ -58,6 +61,7 @@ G_DECLARE_FINAL_TYPE(PurpleRequestPage, 
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestPage *purple_request_page_new(void);
 
 /**
@@ -69,6 +73,7 @@ PurpleRequestPage *purple_request_page_n
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_request_page_add_group(PurpleRequestPage *page, PurpleRequestGroup *group);
 
 /**
@@ -82,6 +87,7 @@ void purple_request_page_add_group(Purpl
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_page_exists(PurpleRequestPage *page, const char *id);
 
 /**
@@ -95,6 +101,7 @@ gboolean purple_request_page_exists(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_page_is_field_required(PurpleRequestPage *page, const char *id);
 
 /**
@@ -107,6 +114,7 @@ gboolean purple_request_page_is_field_re
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_page_is_valid(PurpleRequestPage *page);
 
 /**
@@ -120,6 +128,7 @@ gboolean purple_request_page_is_valid(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleRequestField *purple_request_page_get_field(PurpleRequestPage *page, const char *id);
 
 /**
@@ -133,6 +142,7 @@ PurpleRequestField *purple_request_page_
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 const char *purple_request_page_get_string(PurpleRequestPage *page, const char *id);
 
 /**
@@ -146,6 +156,7 @@ const char *purple_request_page_get_stri
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 int purple_request_page_get_integer(PurpleRequestPage *page, const char *id);
 
 /**
@@ -159,6 +170,7 @@ int purple_request_page_get_integer(Purp
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_request_page_get_bool(PurpleRequestPage *page, const char *id);
 
 /**
@@ -172,6 +184,7 @@ gboolean purple_request_page_get_bool(Pu
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gpointer purple_request_page_get_choice(PurpleRequestPage *page, const char *id);
 
 /**
@@ -185,6 +198,7 @@ gpointer purple_request_page_get_choice(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_request_page_get_account(PurpleRequestPage *page, const char *id);
 
 G_END_DECLS
diff --git a/libpurple/roomlist.h b/libpurple/roomlist.h
--- a/libpurple/roomlist.h
+++ b/libpurple/roomlist.h
@@ -27,6 +27,8 @@
 #ifndef PURPLE_ROOMLIST_H
 #define PURPLE_ROOMLIST_H
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_ROOMLIST (purple_roomlist_get_type())
 typedef struct _PurpleRoomlist PurpleRoomlist;
 
@@ -220,6 +222,7 @@ void purple_roomlist_cancel_get_list(Pur
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_roomlist_join_room(PurpleRoomlist *list, PurpleRoomlistRoom *room);
 
 /**************************************************************************/
diff --git a/libpurple/status.h b/libpurple/status.h
--- a/libpurple/status.h
+++ b/libpurple/status.h
@@ -27,6 +27,8 @@
 #ifndef PURPLE_STATUS_H
 #define PURPLE_STATUS_H
 
+#include "purpleversion.h"
+
 #define PURPLE_TYPE_STATUS (purple_status_get_type())
 typedef struct _PurpleStatus PurpleStatus;
 
@@ -260,6 +262,7 @@ PurpleStatusType *purple_status_type_new
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 PurpleStatusType *purple_status_type_new_with_attrsv(PurpleStatusPrimitive primitive,
                                                      const gchar *id,
                                                      const gchar *name,
@@ -519,6 +522,7 @@ void purple_status_set_active(PurpleStat
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_status_set_active_with_attributes(PurpleStatus *status, gboolean active, GHashTable *attrs);
 
 /**
@@ -731,6 +735,7 @@ void purple_statuses_uninit(void);
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 GHashTable *purple_attrs_from_vargs(va_list args);
 
 G_END_DECLS
diff --git a/libpurple/util.h b/libpurple/util.h
--- a/libpurple/util.h
+++ b/libpurple/util.h
@@ -35,6 +35,7 @@
 #include "protocols.h"
 #include "purpleaccount.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 G_BEGIN_DECLS
 
@@ -219,6 +220,7 @@ purple_strequal(const gchar *left, const
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_STATIC_INLINE_IN_3_0
 static inline gboolean
 purple_strempty(const char *str) {
 	return (str == NULL || str[0] == '\0');
@@ -347,6 +349,7 @@ void purple_str_wipe(gchar *str);
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_strmatches(const char *pattern, const char *str);
 
 /**************************************************************************/
diff --git a/libpurple/xfer.h b/libpurple/xfer.h
--- a/libpurple/xfer.h
+++ b/libpurple/xfer.h
@@ -40,6 +40,7 @@ typedef struct _PurpleXferUiOps PurpleXf
 #include "connection.h"
 #include "purpleaccount.h"
 #include "purpleprotocol.h"
+#include "purpleversion.h"
 
 /**
  * PurpleXferType:
@@ -274,6 +275,7 @@ PurpleXferStatus purple_xfer_get_status(
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 gboolean purple_xfer_get_visible(PurpleXfer *xfer);
 
 /**
@@ -455,6 +457,7 @@ void purple_xfer_set_status(PurpleXfer *
  *
  * Since: 3.0.0
  */
+PURPLE_AVAILABLE_IN_3_0
 void purple_xfer_set_visible(PurpleXfer *xfer, gboolean visible);
 
 /**
