# HG changeset patch
# Node ID f7beeb6e4462
# Parent  648a1b5dd96a
diff --git a/libpurple/purplepath.h b/libpurple/purplepath.h
--- a/libpurple/purplepath.h
+++ b/libpurple/purplepath.h
@@ -43,7 +43,7 @@
  *
  * Returns: The purple cache directory.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_cache_dir(void);
@@ -58,7 +58,7 @@
  *
  * Returns: The purple configuration directory.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_config_dir(void);
@@ -73,7 +73,7 @@
  *
  * Returns: The purple data directory.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_data_dir(void);
@@ -84,7 +84,7 @@
  *
  * Define a custom purple settings directory, overriding the default (user's home directory/.purple)
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_util_set_user_dir(const gchar *dir);
diff --git a/libpurple/purpleperson.h b/libpurple/purpleperson.h
--- a/libpurple/purpleperson.h
+++ b/libpurple/purpleperson.h
@@ -49,7 +49,7 @@
  * A collection of [class@Purple.ContactInfo] that contains a user selectable
  * custom avatar and alias.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -59,7 +59,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurplePerson *purple_person_new(void);
@@ -72,7 +72,7 @@
  *
  * Returns: The id of @person.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_id(PurplePerson *person);
@@ -87,7 +87,7 @@
  *
  * Returns: (nullable): The alias of @person or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_alias(PurplePerson *person);
@@ -105,7 +105,7 @@
  *
  * If @alias is %NULL, then the previous alias is cleared.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_person_set_alias(PurplePerson *person, const char *alias);
@@ -121,7 +121,7 @@
  *
  * Returns: (transfer none) (nullable): The avatar to display.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_person_get_avatar_for_display(PurplePerson *person);
@@ -134,7 +134,7 @@
  *
  * Returns: (transfer none) (nullable): The avatar for @person.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_person_get_avatar(PurplePerson *person);
@@ -151,7 +151,7 @@
  * custom avatar. Protocol plugins should only be setting the avatars of
  * [class@Purple.Contact].
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_person_set_avatar(PurplePerson *person, PurpleAvatar *avatar);
@@ -164,7 +164,7 @@
  *
  * Returns: (nullable): The custom color or %NULL if one is not set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_color(PurplePerson *person);
@@ -177,7 +177,7 @@
  * Sets the custom color of @person to @color. If @color is %NULL the custom
  * color is removed.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_person_set_color(PurplePerson *person, const char *color);
@@ -192,7 +192,7 @@
  *
  * Returns: The color to display for @person.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_color_for_display(PurplePerson *person);
@@ -205,7 +205,7 @@
  *
  * Returns: (transfer none): The tags for @person.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_person_get_tags(PurplePerson *person);
@@ -219,7 +219,7 @@
  *
  * Returns: (transfer none): The name to display for @person.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_person_get_name_for_display(PurplePerson *person);
@@ -234,7 +234,7 @@
  * Duplicate contacts are currently allowed, but that may change at a later
  * time.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_person_add_contact_info(PurplePerson *person, PurpleContactInfo *info);
@@ -248,7 +248,7 @@
  *
  * Returns: %TRUE if @info was found and removed otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_person_remove_contact_info(PurplePerson *person, PurpleContactInfo *info);
@@ -262,7 +262,7 @@
  * Returns: (transfer none) (nullable): The priority contact or %NULL if
  *          @person does not have any contacts.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_person_get_priority_contact_info(PurplePerson *person);
@@ -275,7 +275,7 @@
  *
  * Returns: %TRUE if @person has at least one contact, otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_person_has_contacts(PurplePerson *person);
@@ -293,7 +293,7 @@
  *
  * Returns: %TRUE if @person matches @needle in any way.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_person_matches(PurplePerson *person, const char *needle);
diff --git a/libpurple/purpleperson.c b/libpurple/purpleperson.c
--- a/libpurple/purpleperson.c
+++ b/libpurple/purpleperson.c
@@ -375,7 +375,7 @@
 	 *
 	 * The protocol specific id for the contact.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ID] = g_param_spec_string(
 		"id", "id",
@@ -388,7 +388,7 @@
 	 *
 	 * The alias for this person. This is controlled by the libpurple user.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ALIAS] = g_param_spec_string(
 		"alias", "alias",
@@ -402,7 +402,7 @@
 	 * The avatar for this person. This is controlled by the libpurple user,
 	 * which they can use to set a custom avatar.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_AVATAR] = g_param_spec_object(
 		"avatar", "avatar",
@@ -418,7 +418,7 @@
 	 * [property@Purple.ContactInfo:avatar] for
 	 * [property@Purple.Person:priority-contact-info] will be returned.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_AVATAR_FOR_DISPLAY] = g_param_spec_object(
 		"avatar-for-display", "avatar-for-display",
@@ -435,7 +435,7 @@
 	 * This is an RGB hex code that user interfaces can use when rendering the
 	 * person.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_COLOR] = g_param_spec_string(
 		"color", "color",
@@ -452,7 +452,7 @@
 	 * otherwise it will return the value of [property@ContactInfo:color] of
 	 * the priority contact info.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_COLOR_FOR_DISPLAY] = g_param_spec_string(
 		"color-for-display", "color-for-display",
@@ -465,7 +465,7 @@
 	 *
 	 * The [class@Purple.Tags] for this person.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TAGS] = g_param_spec_object(
 		"tags", "tags",
@@ -484,7 +484,7 @@
 	 * [property@Purple.Person:priority-contact-info] is %NULL, then %NULL will
 	 * be returned.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_NAME_FOR_DISPLAY] = g_param_spec_string(
 		"name-for-display", "name-for-display",
@@ -500,7 +500,7 @@
 	 * This is used by user interfaces to determine which
 	 * [class@Purple.ContactInfo] to use when messaging and so on.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_PRIORITY_CONTACT_INFO] = g_param_spec_object(
 		"priority-contact-info", "priority-contact-info",
diff --git a/libpurple/purpleplugininfo.h b/libpurple/purpleplugininfo.h
--- a/libpurple/purpleplugininfo.h
+++ b/libpurple/purpleplugininfo.h
@@ -44,7 +44,7 @@
  * #PurplePluginInfo is a #GPluginPluginInfo subclass that adds additional
  * libpurple specific properties.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 PURPLE_AVAILABLE_IN_3_0
@@ -58,7 +58,7 @@
  *
  * An opaque type representing the class of a #PurplePluginInfo.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurplePluginInfoClass {
 	/*< private >*/
@@ -74,7 +74,7 @@
  *
  * Flags that can be used to treat plugins differently.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum /*< flags >*/
@@ -206,7 +206,7 @@
  *
  * Returns: A new #PurplePluginInfo instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GPluginPluginInfo *purple_plugin_info_new(const char *first_property, ...) G_GNUC_NULL_TERMINATED;
@@ -219,7 +219,7 @@
  *
  * Returns: The flags of the plugin.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurplePluginInfoFlags purple_plugin_info_get_flags(PurplePluginInfo *info);
@@ -233,7 +233,7 @@
  *
  * Returns: The plugin info error, or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_plugin_info_get_error(PurplePluginInfo *info);
@@ -246,7 +246,7 @@
  *
  * Returns: %TRUE if the plugin has been unloaded previously, or %FALSE if not.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_plugin_info_get_unloaded(PurplePluginInfo *info);
@@ -258,7 +258,7 @@
  *
  * Sets the unloaded state of @info to @unloaded.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_plugin_info_set_unloaded(PurplePluginInfo *info, gboolean unloaded);
@@ -271,7 +271,7 @@
  *
  * Returns: (transfer full): The action group.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GActionGroup *purple_plugin_info_get_action_group(PurplePluginInfo *info);
@@ -284,7 +284,7 @@
  *
  * Returns: (transfer full): The menu model.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GMenuModel *purple_plugin_info_get_action_menu(PurplePluginInfo *info);
diff --git a/libpurple/purpleplugininfo.c b/libpurple/purpleplugininfo.c
--- a/libpurple/purpleplugininfo.c
+++ b/libpurple/purpleplugininfo.c
@@ -214,7 +214,7 @@
 	 *
 	 * An [iface@Gio.ActionGroup] of actions that this plugin provides.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ACTION_GROUP] = g_param_spec_object(
 		"action-group", "action-group",
@@ -227,7 +227,7 @@
 	 *
 	 * A [class@Gio.MenuModel] for activating actions.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ACTION_MENU] = g_param_spec_object(
 		"action-menu", "action-menu",
diff --git a/libpurple/purplepresence.h b/libpurple/purplepresence.h
--- a/libpurple/purplepresence.h
+++ b/libpurple/purplepresence.h
@@ -47,7 +47,7 @@
  * Note: When a presence is destroyed with the last g_object_unref(), all
  * statuses added to this list will be destroyed along with the presence.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 
 typedef struct _PurplePresence PurplePresence;
@@ -76,7 +76,7 @@
  *
  * An enum that is used to determine the type of a [class@Purple.Presence].
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum {
@@ -98,7 +98,7 @@
  *
  * The base class for all #PurplePresence's.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurplePresenceClass {
 	/*< private >*/
@@ -125,7 +125,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurplePresence *purple_presence_new(void);
@@ -142,7 +142,7 @@
  * be set active, so if you wish to disable a status, set another
  * non-independent status to active, or use purple_presence_switch_status().
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_presence_set_status_active(PurplePresence *presence, const gchar *status_id, gboolean active);
@@ -157,7 +157,7 @@
  * This is similar to purple_presence_set_status_active(), except it won't
  * activate independent statuses.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_presence_switch_status(PurplePresence *presence, const gchar *status_id);
@@ -172,7 +172,7 @@
  *
  * Sets the idle state and time of @presence.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_presence_set_idle(PurplePresence *presence, gboolean idle, GDateTime *idle_time);
@@ -184,7 +184,7 @@
  *
  * Sets the login time on a presence.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_presence_set_login_time(PurplePresence *presence, GDateTime *login_time);
@@ -197,7 +197,7 @@
  *
  * Returns: (element-type PurpleStatus) (transfer none): The statuses.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 GList *purple_presence_get_statuses(PurplePresence *presence);
@@ -211,7 +211,7 @@
  *
  * Returns: (transfer none): The #PurpleStatus if found, or %NULL.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleStatus *purple_presence_get_status(PurplePresence *presence, const gchar *status_id);
@@ -224,7 +224,7 @@
  *
  * Returns: (transfer none): The active exclusive status.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleStatus *purple_presence_get_active_status(PurplePresence *presence);
@@ -239,7 +239,7 @@
  *
  * Returns: %TRUE if the presence is available, or %FALSE otherwise.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_presence_is_available(PurplePresence *presence);
@@ -252,7 +252,7 @@
  *
  * Returns: %TRUE if the presence is online, or %FALSE otherwise.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_presence_is_online(PurplePresence *presence);
@@ -268,7 +268,7 @@
  *
  * Returns: %TRUE if the status is active, or %FALSE.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_presence_is_status_active(PurplePresence *presence, const gchar *status_id);
@@ -285,7 +285,7 @@
  *
  * Returns: %TRUE if the status is active, or %FALSE.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_presence_is_status_primitive_active(PurplePresence *presence, PurpleStatusPrimitive primitive);
@@ -300,7 +300,7 @@
  *          presence is offline (purple_presence_is_online() returns %FALSE)
  *          then %FALSE is returned.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_presence_is_idle(PurplePresence *presence);
@@ -314,7 +314,7 @@
  *
  * Returns: (nullable): The idle time of @presence or %NULL.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 GDateTime *purple_presence_get_idle_time(PurplePresence *presence);
@@ -327,7 +327,7 @@
  *
  * Returns: (transfer none): The login time of @presence.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 GDateTime *purple_presence_get_login_time(PurplePresence *presence);
@@ -343,7 +343,7 @@
  *           0 if @presence1 is equal to @presence2.
  *           1 if @presence1 is less available than @presence2.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gint purple_presence_compare(PurplePresence *presence1, PurplePresence *presence2);
@@ -356,7 +356,7 @@
  *
  * Returns: The current primitive.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurplePresencePrimitive purple_presence_get_primitive(PurplePresence *presence);
@@ -368,7 +368,7 @@
  *
  * Sets the [enum@Purple.StatusPrimitive] for @presence to @primitive.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_primitive(PurplePresence *presence, PurplePresencePrimitive primitive);
@@ -381,7 +381,7 @@
  *
  * Returns: (nullable): The status message of @presence.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_presence_get_message(PurplePresence *presence);
@@ -393,7 +393,7 @@
  *
  * Sets the status message of @presence to @message.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_message(PurplePresence *presence, const char *message);
@@ -406,7 +406,7 @@
  *
  * Returns: The current emoji or %NULL if none is set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_presence_get_emoji(PurplePresence *presence);
@@ -419,7 +419,7 @@
  * Sets the current emoji, sometimes referred to as a mood, of @presence to
  * @emoji.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_emoji(PurplePresence *presence, const char *emoji);
@@ -432,7 +432,7 @@
  *
  * Returns: %TRUE if @presence is on a mobile device, otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_presence_get_mobile(PurplePresence *presence);
@@ -444,7 +444,7 @@
  *
  * Sets whether or not @presence is on a mobile device.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_mobile(PurplePresence *presence, gboolean mobile);
@@ -457,7 +457,7 @@
  *
  * Returns: %TRUE if @presence has notifications disabled, otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_presence_get_notifications_disabled(PurplePresence *presence);
@@ -469,7 +469,7 @@
  *
  * Sets whether or not @presence has notifications disabled.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_presence_set_notifications_disabled(PurplePresence *presence, gboolean notifications_disabled);
@@ -483,7 +483,7 @@
  *
  * Returns: The string representation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_presence_primitive_to_string(PurplePresencePrimitive primitive);
diff --git a/libpurple/purplepresence.c b/libpurple/purplepresence.c
--- a/libpurple/purplepresence.c
+++ b/libpurple/purplepresence.c
@@ -211,7 +211,7 @@
 	 *
 	 * Whether or not the presence is in an idle state.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_IDLE] = g_param_spec_boolean("idle", "Idle",
 				"Whether the presence is in idle state.", FALSE,
@@ -222,7 +222,7 @@
 	 *
 	 * The time when the presence went idle.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_IDLE_TIME] = g_param_spec_boxed(
 				"idle-time", "Idle time",
@@ -235,7 +235,7 @@
 	 *
 	 * The login-time of the presence.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_LOGIN_TIME] = g_param_spec_boxed(
 		"login-time", "Login time",
@@ -248,7 +248,7 @@
 	 *
 	 * The currently active status of the presence.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ACTIVE_STATUS] = g_param_spec_object("active-status",
 				"Active status",
@@ -260,7 +260,7 @@
 	 *
 	 * The [enum@Purple.StatusPrimitive] for this presence.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_PRIMITIVE] = g_param_spec_enum(
 		"primitive", "primitive",
@@ -274,7 +274,7 @@
 	 *
 	 * The status message of the presence.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_MESSAGE] = g_param_spec_string(
 		"message", "message",
@@ -287,7 +287,7 @@
 	 *
 	 * The emoji or mood of the presence.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_EMOJI] = g_param_spec_string(
 		"emoji", "emoji",
@@ -300,7 +300,7 @@
 	 *
 	 * Whether or not the presence is on a mobile device.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_MOBILE] = g_param_spec_boolean(
 		"mobile", "mobile",
@@ -317,7 +317,7 @@
 	 * default it displays that the user has notifications turned off outside
 	 * of that schedule.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_NOTIFICATIONS_DISABLED] = g_param_spec_boolean(
 		"notifications-disabled", "notifications-disabled",
diff --git a/libpurple/purplepresencemanager.c b/libpurple/purplepresencemanager.c
--- a/libpurple/purplepresencemanager.c
+++ b/libpurple/purplepresencemanager.c
@@ -443,7 +443,7 @@
 	 * The directory path where settings should be stored. If this is %NULL
 	 * settings will not be saved to disk.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_PATH] = g_param_spec_string(
 		"path", "path",
@@ -456,7 +456,7 @@
 	 *
 	 * The [class@SavedPresence] that is currently active.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ACTIVE] = g_param_spec_object(
 		"active-presence", "active-presence",
@@ -474,7 +474,7 @@
 	 * Emitted when a [class@SavedPresence] is successfully added to the
 	 * manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ADDED] = g_signal_new_class_handler(
 		"added",
@@ -496,7 +496,7 @@
 	 * Emitted when a [class@SavedPresence] is successfully removed from the
 	 * manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_REMOVED] = g_signal_new_class_handler(
 		"removed",
diff --git a/libpurple/purplepresencemanagerprivate.h b/libpurple/purplepresencemanagerprivate.h
--- a/libpurple/purplepresencemanagerprivate.h
+++ b/libpurple/purplepresencemanagerprivate.h
@@ -37,7 +37,7 @@
  * This will ask the UI what [class@PresenceManager] should be used and caches
  * it for use with [func@PresenceManager.get_default].
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL void purple_presence_manager_startup(void);
 
@@ -46,7 +46,7 @@
  *
  * Clears the references to the default manager if one exists.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL void purple_presence_manager_shutdown(void);
 
diff --git a/libpurple/purpleprivate.h b/libpurple/purpleprivate.h
--- a/libpurple/purpleprivate.h
+++ b/libpurple/purpleprivate.h
@@ -142,7 +142,7 @@
  *
  * Starts up the account manager by creating the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_account_manager_startup(void);
@@ -152,7 +152,7 @@
  *
  * Shuts down the account manager by destroying the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_account_manager_shutdown(void);
@@ -162,7 +162,7 @@
  *
  * Starts up the contact manager by creating the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_contact_manager_startup(void);
@@ -172,7 +172,7 @@
  *
  * Shuts down the contact manager by destroying the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_contact_manager_shutdown(void);
@@ -182,7 +182,7 @@
  *
  * Starts up the conversation manager by creating the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_conversation_manager_startup(void);
@@ -192,7 +192,7 @@
  *
  * Shuts down the conversation manager by destroying the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_conversation_manager_shutdown(void);
@@ -202,7 +202,7 @@
  *
  * Starts up the credential manager by creating the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_credential_manager_startup(void);
@@ -212,7 +212,7 @@
  *
  * Shuts down the credential manager by destroying the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_credential_manager_shutdown(void);
@@ -222,7 +222,7 @@
  *
  * Starts up the protocol manager by creating the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_protocol_manager_startup(void);
@@ -232,7 +232,7 @@
  *
  * Shuts down the protocol manager by destroying the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_protocol_manager_shutdown(void);
@@ -243,7 +243,7 @@
  *
  * Tells a @provider that it has become the active provider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_credential_provider_activate(PurpleCredentialProvider *provider);
@@ -255,7 +255,7 @@
  * Tells @provider that another #PurpleCredentialProvider has become the active
  * provider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_credential_provider_deactivate(PurpleCredentialProvider *provider);
@@ -272,7 +272,7 @@
  *
  * Returns: %TRUE on success otherwise %FALSE with @error set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_adapter_activate(PurpleHistoryAdapter *adapter, GError **error);
@@ -289,7 +289,7 @@
  *
  * Returns: %TRUE on success otherwise %FALSE with @error set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_history_adapter_deactivate(PurpleHistoryAdapter *adapter, GError **error);
@@ -299,7 +299,7 @@
  *
  * Starts up the notification manager by creating the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_notification_manager_startup(void);
@@ -309,7 +309,7 @@
  *
  * Shuts down the notification manager by destroying the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_notification_manager_shutdown(void);
@@ -319,7 +319,7 @@
  *
  * Starts up the whiteboard manager by creating the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_whiteboard_manager_startup(void);
@@ -329,7 +329,7 @@
  *
  * Shuts down the whiteboard manager by destroying the default instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_whiteboard_manager_shutdown(void);
@@ -345,7 +345,7 @@
  * Its primary usage is when loading accounts from disk, as without this, the
  * account attempts to connect immediately.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 G_GNUC_INTERNAL
 void purple_account_set_enabled_plain(PurpleAccount *account, gboolean enabled);
diff --git a/libpurple/purpleprotocol.h b/libpurple/purpleprotocol.h
--- a/libpurple/purpleprotocol.h
+++ b/libpurple/purpleprotocol.h
@@ -39,7 +39,7 @@
  *
  * #PurpleProtocol is the base type for all protocols in libpurple.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 PURPLE_AVAILABLE_IN_3_0
@@ -79,18 +79,18 @@
  *           to this protocol.<sbr/>
  *           Used as a hint that unknown commands should not be sent as
  *           messages.
- *           Since: 2.1.0
+ *           Since: 2.1
  * @OPT_PROTO_INVITE_MESSAGE: Indicates that this protocol supports sending a
  *           user-supplied message along with an invitation.
- *           Since: 2.8.0
+ *           Since: 2.8
  * @OPT_PROTO_AUTHORIZATION_GRANTED_MESSAGE: Indicates that this protocol
  *           supports sending a user-supplied message along with an
  *           authorization acceptance.
- *           Since: 3.0.0
+ *           Since: 3.0
  * @OPT_PROTO_AUTHORIZATION_DENIED_MESSAGE: Indicates that this protocol
  *           supports sending a user-supplied message along with an
  *           authorization denial.
- *           Since: 3.0.0
+ *           Since: 3.0
  *
  * Protocol options
  *
@@ -132,7 +132,7 @@
  *
  * All protocol types must implement the methods in this class.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolClass {
 	GObjectClass parent_class;
@@ -166,7 +166,7 @@
  * Returns: %TRUE if a protocol implements a function in an interface,
  *          %FALSE otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 #define PURPLE_PROTOCOL_IMPLEMENTS(protocol, IFACE, func) \
 	(PURPLE_IS_PROTOCOL_##IFACE(protocol) && \
@@ -182,7 +182,7 @@
  *
  * Returns: The ID of the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_id(PurpleProtocol *protocol);
@@ -195,7 +195,7 @@
  *
  * Returns: The translated name of the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_name(PurpleProtocol *protocol);
@@ -208,7 +208,7 @@
  *
  * Returns: The Description of the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_description(PurpleProtocol *protocol);
@@ -221,7 +221,7 @@
  *
  * Returns: The options of the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleProtocolOptions purple_protocol_get_options(PurpleProtocol *protocol);
@@ -235,7 +235,7 @@
  * Returns: (element-type PurpleAccountUserSplit) (transfer full): The user
  *          splits of the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_get_user_splits(PurpleProtocol *protocol);
@@ -249,7 +249,7 @@
  * Returns: (element-type PurpleAccountOption) (transfer full): The account
  *          options for the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_get_account_options(PurpleProtocol *protocol);
@@ -262,7 +262,7 @@
  *
  * Returns: (transfer full): The icon spec of the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleBuddyIconSpec *purple_protocol_get_icon_spec(PurpleProtocol *protocol);
@@ -275,7 +275,7 @@
  *
  * Returns: (transfer none): The whiteboard ops of the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleWhiteboardOps *purple_protocol_get_whiteboard_ops(PurpleProtocol *protocol);
@@ -287,7 +287,7 @@
  *
  * Logs @account in to @protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_login(PurpleProtocol *protocol, PurpleAccount *account);
@@ -299,7 +299,7 @@
  *
  * Closes @connection using @protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_close(PurpleProtocol *protocol, PurpleConnection *connection);
@@ -317,7 +317,7 @@
  * Most protocol plugins will call [method@Gio.NetworkMonitor.can_reach_async]
  * to determine if a connection is possible.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_can_connect_async(PurpleProtocol *protocol, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -333,7 +333,7 @@
  *
  * Returns: %TRUE on success, otherwise %FALSE with @error optionally set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_can_connect_finish(PurpleProtocol *protocol, GAsyncResult *result, GError **error);
@@ -353,7 +353,7 @@
  * Returns: (transfer full): The new connection or %NULL with @error possibly
  *          set on error.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConnection *purple_protocol_create_connection(PurpleProtocol *protocol, PurpleAccount *account, const char *password, GError **error);
@@ -368,7 +368,7 @@
  * Returns: (transfer full) (element-type PurpleStatusType): A list of the
  *          available PurpleStatusType's for @account with @protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_get_status_types(PurpleProtocol *protocol, PurpleAccount *account);
@@ -383,7 +383,7 @@
  *
  * Returns: The name of the icon for @protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_icon_name(PurpleProtocol *protocol);
@@ -402,7 +402,7 @@
  *
  * Returns: The file system path where the icons can be found.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_icon_search_path(PurpleProtocol *protocol);
@@ -421,7 +421,7 @@
  *
  * Returns: The gresource path where the icons can be found.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_get_icon_resource_path(PurpleProtocol *protocol);
diff --git a/libpurple/purpleprotocol.c b/libpurple/purpleprotocol.c
--- a/libpurple/purpleprotocol.c
+++ b/libpurple/purpleprotocol.c
@@ -288,7 +288,7 @@
 	 *
 	 * The identifier for the protocol.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ID] = g_param_spec_string(
 		"id", "id",
@@ -301,7 +301,7 @@
 	 *
 	 * The name to show in user interface for the protocol.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_NAME] = g_param_spec_string(
 		"name", "name",
@@ -314,7 +314,7 @@
 	 *
 	 * The description to show in user interface for the protocol.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_DESCRIPTION] = g_param_spec_string(
 		"description", "description",
@@ -329,7 +329,7 @@
 	 * via PurpleProtocol::icon-search-path or
 	 * PurpleProtocol::icon-resource-path.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ICON_NAME] = g_param_spec_string(
 		"icon-name", "icon-name",
@@ -344,7 +344,7 @@
 	 * protocol. See purple_protocol_get_icon_search_path() for more
 	 * information.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ICON_SEARCH_PATH] = g_param_spec_string(
 		"icon-search-path", "icon-search-path",
@@ -358,7 +358,7 @@
 	 * A #GResource path which contains the icons for the protocol. See
 	 * purple_protocol_get_icon_resource_path() for more information.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ICON_RESOURCE_PATH] = g_param_spec_string(
 		"icon-resource-path", "icon-resource-path",
@@ -371,7 +371,7 @@
 	 *
 	 * The #PurpleProtocolOptions for the protocol.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_OPTIONS] = g_param_spec_flags(
 		"options", "options",
diff --git a/libpurple/purpleprotocolactions.h b/libpurple/purpleprotocolactions.h
--- a/libpurple/purpleprotocolactions.h
+++ b/libpurple/purpleprotocolactions.h
@@ -46,7 +46,7 @@
  * The #PurpleProtocolActions interface defines the behavior of a protocol's
  * actions interface.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -65,7 +65,7 @@
  *
  * This interface provides a gateway between purple and the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolActionsInterface {
 	/*< private >*/
@@ -92,7 +92,7 @@
  *
  * Returns: Gets the prefix for the name of the actions in @actions.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_actions_get_prefix(PurpleProtocolActions *actions);
@@ -106,7 +106,7 @@
  *
  * Returns: (transfer full): The group of actions for @connection.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GActionGroup *purple_protocol_actions_get_action_group(PurpleProtocolActions *actions, PurpleConnection *connection);
@@ -120,7 +120,7 @@
  *
  * Returns: (transfer full): The menu to display or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GMenu *purple_protocol_actions_get_menu(PurpleProtocolActions *actions, PurpleConnection *connection);
@@ -134,7 +134,7 @@
  * be called by [iface@ProtocolActions] implementations when actions have
  * changed.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_actions_changed(PurpleProtocolActions *actions, PurpleAccount *account);
diff --git a/libpurple/purpleprotocolactions.c b/libpurple/purpleprotocolactions.c
--- a/libpurple/purpleprotocolactions.c
+++ b/libpurple/purpleprotocolactions.c
@@ -44,7 +44,7 @@
 	 * A signal that is emitted to tell interested parties that the actions
 	 * have changed.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ACTIONS_CHANGED] = g_signal_new_class_handler(
 		"actions-changed",
diff --git a/libpurple/purpleprotocolchat.h b/libpurple/purpleprotocolchat.h
--- a/libpurple/purpleprotocolchat.h
+++ b/libpurple/purpleprotocolchat.h
@@ -44,7 +44,7 @@
  * #PurpleProtocolChat describes the API that protocols need to implement for
  * handling multiple user conversations.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolChat, purple_protocol_chat, PURPLE,
@@ -147,7 +147,7 @@
  * Returns: (transfer full) (element-type PurpleProtocolChatEntry): The list
  *          of #PurpleProtocolChatEntry's that are used to join a chat.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_chat_info(PurpleProtocolChat *protocol_chat, PurpleConnection *connection);
@@ -164,7 +164,7 @@
  * Returns: (transfer full) (element-type utf8 utf8): The values that will be
  *          used to join the chat.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GHashTable *purple_protocol_chat_info_defaults(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, const gchar *chat_name);
@@ -178,7 +178,7 @@
  *
  * Joins the chat described in @components.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_join(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, GHashTable *components);
@@ -192,7 +192,7 @@
  *
  * Used to reject a chat invite.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_reject(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, GHashTable *components);
@@ -207,7 +207,7 @@
  *
  * Returns: (transfer full): The chat name from @components.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gchar *purple_protocol_chat_get_name(PurpleProtocolChat *protocol_chat, GHashTable *components);
@@ -222,7 +222,7 @@
  *
  * Sends an invite to @who with @message.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_invite(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, const gchar *message, const gchar *who);
@@ -235,7 +235,7 @@
  *
  * Leaves the chat identified by @id.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_leave(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id);
@@ -252,7 +252,7 @@
  *
  * Returns: 0 on success, non-zero on failure.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gint purple_protocol_chat_send(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, PurpleConversation *conversation, PurpleMessage *message);
@@ -268,7 +268,7 @@
  *
  * Returns: (transfer full): The realname of @who.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gchar *purple_protocol_chat_get_user_real_name(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, const gchar *who);
@@ -282,7 +282,7 @@
  *
  * Sets the topic for the chat with id @id to @topic.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_chat_set_topic(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, const gchar *topic);
diff --git a/libpurple/purpleprotocolclient.h b/libpurple/purpleprotocolclient.h
--- a/libpurple/purpleprotocolclient.h
+++ b/libpurple/purpleprotocolclient.h
@@ -48,7 +48,7 @@
  * #PurpleProtocolClient interface defines the behavior of a typical chat
  * service's client interface.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -114,7 +114,7 @@
  *
  * This interface provides a gateway between purple and the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolClientInterface {
 	/*< private >*/
@@ -154,7 +154,7 @@
  *
  * Returns: The icon name of the emblem or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_protocol_client_list_emblem(PurpleProtocolClient *client, PurpleBuddy *buddy);
@@ -170,7 +170,7 @@
  * Returns: (transfer full) (element-type PurpleActionMenu): The list of
  *          #PurpleActionMenu structs to display for @node.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_client_blist_node_menu(PurpleProtocolClient *client, PurpleBlistNode *node);
@@ -182,7 +182,7 @@
  *
  * Cleans up any protocol specific data for @buddy.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_client_buddy_free(PurpleProtocolClient *client, PurpleBuddy *buddy);
@@ -195,7 +195,7 @@
  *
  * Closes the conversation named @who on connection @connection.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_client_convo_closed(PurpleProtocolClient *client, PurpleConnection *connection, const gchar *who);
@@ -212,9 +212,9 @@
  *
  * Returns: The normalized version of @who for @account.
  *
- * Since: 3.0.0
+ * Since: 3.0
  *
- * Deprecated: 3.0.0: This should use purple_protocol_client_normalize_name when
+ * Deprecated: 3.0: This should use purple_protocol_client_normalize_name when
  *             it is created which will return an allocated value.
  */
 PURPLE_DEPRECATED
@@ -231,7 +231,7 @@
  * Returns: (transfer none): The #PurpleChat instance or %NULL if no chat could
  *          be found.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleChat *purple_protocol_client_find_blist_chat(PurpleProtocolClient *client, PurpleAccount *account, const gchar *name);
@@ -245,7 +245,7 @@
  *
  * Returns: %TRUE if @buddy supports offline messages, otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_client_offline_message(PurpleProtocolClient *client, PurpleBuddy *buddy);
@@ -262,9 +262,9 @@
  *
  * Returns: (transfer full): The newly allocated text table.
  *
- * Since: 3.0.0
+ * Since: 3.0
  *
- * Deprecated: 3.0.0: This is a premature optimization. Right now this is only
+ * Deprecated: 3.0: This is a premature optimization. Right now this is only
  *             used by GaduGadu for a single item and should be replaced.
  */
 PURPLE_DEPRECATED
@@ -280,7 +280,7 @@
  * Returns: The maximum number of characters per message for @conv or -1 for no
  *          limit.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gssize purple_protocol_client_get_max_message_size(PurpleProtocolClient *client, PurpleConversation *conv);
diff --git a/libpurple/purpleprotocolcontacts.h b/libpurple/purpleprotocolcontacts.h
--- a/libpurple/purpleprotocolcontacts.h
+++ b/libpurple/purpleprotocolcontacts.h
@@ -46,7 +46,7 @@
  * #PurpleProtocolContacts provides methods for interacting with remote
  * contacts.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -54,7 +54,7 @@
  *
  * A domain for errors from the [class@ProtocolContacts] API.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 #define PURPLE_PROTOCOL_CONTACTS_DOMAIN \
 	g_quark_from_static_string("purple-protocol-contacts") \
@@ -67,7 +67,7 @@
  * protocol layer. These methods will primarily be called by the user
  * interface.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolContactsInterface {
 	/*< private >*/
@@ -104,7 +104,7 @@
  *
  * Call [method@ProtocolContacts.search_finish] to get the results.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_contacts_search_async(PurpleProtocolContacts *protocol_contacts, PurpleAccount *account, const char *text, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -122,7 +122,7 @@
  * Returns: (transfer full): A [iface@Gio.ListModel] of the matched contacts or
  *          %NULL with @error set on error.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_protocol_contacts_search_finish(PurpleProtocolContacts *protocol_contacts, GAsyncResult *result, GError **error);
@@ -140,7 +140,7 @@
  *
  * Call [method@ProtocolContacts.get_profile_finish] to get the results.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_contacts_get_profile_async(PurpleProtocolContacts *protocol_contacts, PurpleContactInfo *info, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -158,7 +158,7 @@
  * Returns: (transfer full): A plain text or markdown formatted string of the
  *          contact info's profile, or %NULL with @error set on error.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 char *purple_protocol_contacts_get_profile_finish(PurpleProtocolContacts *protocol_contacts, GAsyncResult *result, GError **error);
@@ -173,7 +173,7 @@
  *
  * Returns: (transfer full): The action group or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GActionGroup *purple_protocol_contacts_get_actions(PurpleProtocolContacts *protocol_contacts, PurpleContactInfo *info);
@@ -190,7 +190,7 @@
  *
  * Returns: (transfer full): The menu model or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GMenuModel *purple_protocol_contacts_get_menu(PurpleProtocolContacts *protocol_contacts, PurpleContactInfo *info);
diff --git a/libpurple/purpleprotocolconversation.h b/libpurple/purpleprotocolconversation.h
--- a/libpurple/purpleprotocolconversation.h
+++ b/libpurple/purpleprotocolconversation.h
@@ -54,7 +54,7 @@
  * the protocol layer. These methods will primarily be called by the user
  * interface.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolConversationInterface {
 	/*< private >*/
@@ -92,7 +92,7 @@
  *
  * Starts the process of sending @message to @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -112,7 +112,7 @@
  * Returns: %TRUE if the message was sent successfully, otherwise %FALSE with
  *          @error possibly set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_conversation_send_message_finish(PurpleProtocolConversation *protocol, GAsyncResult *result, GError **error);
@@ -135,7 +135,7 @@
  * to update it. Regardless, user interfaces should not be updating the topic
  * directly.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -155,7 +155,7 @@
  * Returns: %TRUE if the message was sent successfully, otherwise %FALSE with
  *          @error possibly set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_conversation_set_topic_finish(PurpleProtocolConversation *protocol, GAsyncResult *result, GError **error);
@@ -170,7 +170,7 @@
  *
  * Returns: (transfer full): The new join channel details.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleChannelJoinDetails *purple_protocol_conversation_get_channel_join_details(PurpleProtocolConversation *protocol, PurpleAccount *account);
@@ -191,7 +191,7 @@
  * @protocol to add the conversation to the [class@ConversationManager] during
  * this process.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -211,7 +211,7 @@
  * Returns: %TRUE if the channel was joined successfully, otherwise %FALSE with
  *          @error possibly set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_conversation_join_channel_finish(PurpleProtocolConversation *protocol, GAsyncResult *result, GError **error);
@@ -229,7 +229,7 @@
  * Sets the avatar for @conversation to @pixbuf. Pass %NULL to clear the
  * current avatar.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -249,7 +249,7 @@
  * Returns: %TRUE if the avatar was set successfully, otherwise %FALSE with
  *          @error possibly set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_conversation_set_avatar_finish(PurpleProtocolConversation *protocol, GAsyncResult *result, GError **error);
@@ -264,7 +264,7 @@
  *
  * This should primarily be called by the user interface.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_conversation_send_typing(PurpleProtocolConversation *protocol, PurpleConversation *conversation, PurpleTypingState state);
diff --git a/libpurple/purpleprotocolfiletransfer.h b/libpurple/purpleprotocolfiletransfer.h
--- a/libpurple/purpleprotocolfiletransfer.h
+++ b/libpurple/purpleprotocolfiletransfer.h
@@ -47,7 +47,7 @@
  * #PurpleProtocolFileTransfer provides methods for sending and receiving
  * files.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -55,7 +55,7 @@
  *
  * This interface defines the behavior for sending and receiving files.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolFileTransferInterface {
 	/*< private >*/
@@ -87,7 +87,7 @@
  * > Note: This function does not take a cancellable as the protocol should be
  * using [property@FileTransfer:cancellable] from @transfer.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_file_transfer_send_async(PurpleProtocolFileTransfer *protocol, PurpleFileTransfer *transfer, GAsyncReadyCallback callback, gpointer data);
@@ -105,7 +105,7 @@
  * Returns: %TRUE if the transfer was started successfully, otherwise %FALSE
  *          with @error possibly set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_file_transfer_send_finish(PurpleProtocolFileTransfer *protocol, GAsyncResult *result, GError **error);
@@ -123,7 +123,7 @@
  * > Note: This function does not take a cancellable as the protocol should be
  * using [property@FileTransfer:cancellable] from @transfer.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_file_transfer_receive_async(PurpleProtocolFileTransfer *protocol, PurpleFileTransfer *transfer, GAsyncReadyCallback callback, gpointer data);
@@ -141,7 +141,7 @@
  * Returns: %TRUE if the transfer was started successfully, otherwise %FALSE
  *          with @error possibly set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_file_transfer_receive_finish(PurpleProtocolFileTransfer *protocol, GAsyncResult *result, GError **error);
diff --git a/libpurple/purpleprotocolim.h b/libpurple/purpleprotocolim.h
--- a/libpurple/purpleprotocolim.h
+++ b/libpurple/purpleprotocolim.h
@@ -43,7 +43,7 @@
  * #PurpleProtocolIM describes the API that protocols need to implement for
  * handling one on one conversations.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_INTERFACE(PurpleProtocolIM, purple_protocol_im, PURPLE, PROTOCOL_IM,
@@ -68,7 +68,7 @@
  * The protocol IM interface that needs to be implemented to send one to one
  * messages.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolIMInterface {
 	/*< private >*/
@@ -99,7 +99,7 @@
  * Returns: >= 0 on success, or < 0 on error.  If 0 is returned the message
  *          should not be output locally.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gint purple_protocol_im_send(PurpleProtocolIM *im,
@@ -126,7 +126,7 @@
  *          five seconds, and if the Purple user is still typing then Purple
  *          will send another #PURPLE_IM_TYPING message.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 guint purple_protocol_im_send_typing(PurpleProtocolIM *im,
diff --git a/libpurple/purpleprotocolmanager.h b/libpurple/purpleprotocolmanager.h
--- a/libpurple/purpleprotocolmanager.h
+++ b/libpurple/purpleprotocolmanager.h
@@ -40,7 +40,7 @@
  *
  * A #GError domain for errors from #PurpleProtocolManager.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 #define PURPLE_PROTOCOL_MANAGER_DOMAIN \
 	g_quark_from_static_string("purple-protocol-manager") \
@@ -58,7 +58,7 @@
  * #PurpleProtocolManager keeps track of all protocols and emits signals when
  * protocols are registered and unregistered.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -68,7 +68,7 @@
  *
  * A function to be used as a callback with purple_protocol_manager_foreach().
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleProtocolManagerForeachFunc)(PurpleProtocol *protocol, gpointer data);
@@ -80,7 +80,7 @@
  *
  * Returns: (transfer none): The default #PurpleProtocolManager instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleProtocolManager *purple_protocol_manager_get_default(void);
@@ -96,7 +96,7 @@
  * Returns: %TRUE if @protocol was successfully registered with @manager,
  *          %FALSE otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_manager_register(PurpleProtocolManager *manager, PurpleProtocol *protocol, GError **error);
@@ -112,7 +112,7 @@
  * Returns: %TRUE if @protocol was successfully unregistered from @manager,
  *          %FALSE otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_manager_unregister(PurpleProtocolManager *manager, PurpleProtocol *protocol, GError **error);
@@ -126,7 +126,7 @@
  *
  * Returns: (transfer none): The #PurpleProtocol identified by @id or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleProtocol *purple_protocol_manager_find(PurpleProtocolManager *manager, const gchar *id);
@@ -139,7 +139,7 @@
  *
  * Calls @func for each #PurpleProtocol that @manager knows about.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_manager_foreach(PurpleProtocolManager *manager, PurpleProtocolManagerForeachFunc func, gpointer data);
@@ -154,7 +154,7 @@
  * Returns: (transfer container) (element-type PurpleProtocol): The list
  *          containing all of the #PurpleProtocols registered with @manager.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_protocol_manager_get_all(PurpleProtocolManager *manager);
diff --git a/libpurple/purpleprotocolmanager.c b/libpurple/purpleprotocolmanager.c
--- a/libpurple/purpleprotocolmanager.c
+++ b/libpurple/purpleprotocolmanager.c
@@ -131,7 +131,7 @@
 	 *
 	 * Emitted after @protocol has been registered in @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_REGISTERED] = g_signal_new_class_handler(
 		"registered",
@@ -152,7 +152,7 @@
 	 *
 	 * Emitted after @protocol has been unregistered from @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_UNREGISTERED] = g_signal_new_class_handler(
 		"unregistered",
@@ -176,7 +176,7 @@
 	 * signal and will only be emitted for protocols that implement
 	 * [iface@ProtocolActions].
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ACCOUNT_ACTIONS_CHANGED] = g_signal_new_class_handler(
 		"account-actions-changed",
diff --git a/libpurple/purpleprotocolmedia.h b/libpurple/purpleprotocolmedia.h
--- a/libpurple/purpleprotocolmedia.h
+++ b/libpurple/purpleprotocolmedia.h
@@ -49,7 +49,7 @@
  * #PurpleProtocolMedia describes the multimedia api that is available for
  * protocols.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -75,7 +75,7 @@
  *
  * This interface provides callbacks for media sessions on the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolMediaInterface {
 	/*< private >*/
@@ -103,7 +103,7 @@
  *
  * Returns: %TRUE if successful, %FALSE otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_media_initiate_session(PurpleProtocolMedia *media, PurpleAccount *account, const gchar *who, PurpleMediaSessionType type);
@@ -119,7 +119,7 @@
  *
  * Returns: the media capabilities of @who.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleMediaCaps purple_protocol_media_get_caps(PurpleProtocolMedia *media, PurpleAccount *account, const gchar *who);
@@ -139,7 +139,7 @@
  *
  * Returns: %TRUE if successful, %FALSE otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_media_send_dtmf(PurpleProtocolMedia *protocol_media, PurpleMedia *media, gchar dtmf, guint8 volume, guint8 duration);
diff --git a/libpurple/purpleprotocolroomlist.h b/libpurple/purpleprotocolroomlist.h
--- a/libpurple/purpleprotocolroomlist.h
+++ b/libpurple/purpleprotocolroomlist.h
@@ -44,7 +44,7 @@
  * #PurpleProtocolRoomlist is an interface to abstract how to handle rooms
  * lists at the protocol level.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 PURPLE_AVAILABLE_IN_3_0
@@ -58,7 +58,7 @@
  *
  * This interface provides callbacks for room listing.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolRoomlistInterface {
 	/*< private >*/
@@ -86,7 +86,7 @@
  *
  * Returns: (transfer full): The roomlist for @gc.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleRoomlist *purple_protocol_roomlist_get_list(PurpleProtocolRoomlist *protocol_roomlist, PurpleConnection *gc);
@@ -99,7 +99,7 @@
  * Requesting a roomlist can take a long time. This function cancels a request
  * that's already in progress.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roomlist_cancel(PurpleProtocolRoomlist *protocol_roomlist, PurpleRoomlist *list);
@@ -112,7 +112,7 @@
  *
  * Expands the given @category for @list.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roomlist_expand_category(PurpleProtocolRoomlist *protocol_roomlist, PurpleRoomlist *list, PurpleRoomlistRoom *category);
@@ -126,7 +126,7 @@
  *
  * Returns: (transfer full): The serialized form of @room.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 char *purple_protocol_roomlist_room_serialize(PurpleProtocolRoomlist *protocol_roomlist, PurpleRoomlistRoom *room);
diff --git a/libpurple/purpleprotocolroster.h b/libpurple/purpleprotocolroster.h
--- a/libpurple/purpleprotocolroster.h
+++ b/libpurple/purpleprotocolroster.h
@@ -47,7 +47,7 @@
  * The #PurpleProtocolRoster interface defines the behavior to tell a
  * protocol when the users wants to manage contacts on the server side roster.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -68,7 +68,7 @@
  * managing the server side roster. All of the functions are asynchronous to
  * make sure nothing blocks the rest of the program.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolRosterInterface {
 	/*< private >*/
@@ -104,7 +104,7 @@
  * @callback is called, [method@ProtocolRoster.add_finish] should be called to
  * get the result.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roster_add_async(PurpleProtocolRoster *roster, PurpleAccount *account, PurpleContact *contact, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -123,7 +123,7 @@
  * Returns: %TRUE if the operation was successful, otherwise %FALSE with error
  *          optionally set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_roster_add_finish(PurpleProtocolRoster *roster, GAsyncResult *result, GError **error);
@@ -147,7 +147,7 @@
  * [property@ContactInfo:permission], [property@ContactInfo:person], and
  * [property@ContactInfo:tags].
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roster_update_async(PurpleProtocolRoster *roster, PurpleAccount *account, PurpleContact *contact, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -166,7 +166,7 @@
  * Returns: %TRUE if the operation was successful, otherwise %FALSE with error
  *          optionally set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_roster_update_finish(PurpleProtocolRoster *roster, GAsyncResult *result, GError **error);
@@ -185,7 +185,7 @@
  * @callback is called, [method@ProtocolRoster.remove_finish] should be called
  * to get the result.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_roster_remove_async(PurpleProtocolRoster *roster, PurpleAccount *account, PurpleContact *contact, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -204,7 +204,7 @@
  * Returns: %TRUE if the operation was successful, otherwise %FALSE with error
  *          optionally set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_protocol_roster_remove_finish(PurpleProtocolRoster *roster, GAsyncResult *result, GError **error);
diff --git a/libpurple/purpleprotocolserver.h b/libpurple/purpleprotocolserver.h
--- a/libpurple/purpleprotocolserver.h
+++ b/libpurple/purpleprotocolserver.h
@@ -52,7 +52,7 @@
  * #PurpleProtocolServer describes the API for protocols that have a central
  * server.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -87,7 +87,7 @@
  *
  * This interface provides a gateway between purple and the protocol's server.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolServerInterface {
 	/*< private >*/
@@ -133,7 +133,7 @@
  *
  * Sets the user info, sometimes referred to as a user profile to @info.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_set_info(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *info);
@@ -147,7 +147,7 @@
  * Gets the user info or profile for @who and displays it in a protocol
  * specific way.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_get_info(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who);
@@ -160,7 +160,7 @@
  *
  * Sets the status for account @account to @status.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_set_status(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleStatus *status);
@@ -173,7 +173,7 @@
  *
  * Tells @protocol_server to set the user's idle time to @idletime.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_set_idle(PurpleProtocolServer *protocol_server, PurpleConnection *connection, gint idletime);
@@ -187,7 +187,7 @@
  *
  * Changes the user's password from @old_pass to @new_pass.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -206,7 +206,7 @@
  * function will request authorization. If authorization is required, then
  * @message will be used as an invite message.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group, const gchar *message);
@@ -220,7 +220,7 @@
  *
  * Removes @buddy and potentially @group from the server side list of contacts.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_remove_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group);
@@ -240,7 +240,7 @@
  * purple_protocol_server_remove_buddy() will be called for each buddy/group
  * pair in @buddies/@groups.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_remove_buddies(PurpleProtocolServer *protocol_server, PurpleConnection *connection, GList *buddies, GList *groups);
@@ -252,7 +252,7 @@
  *
  * Tell @protocol_server to send its keep alive to the server.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_keepalive(PurpleProtocolServer *protocol_server, PurpleConnection *connection);
@@ -267,7 +267,7 @@
  * Returns: The interval, in seconds, that the keep-alive function should be
  *          called.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gint purple_protocol_server_get_keepalive_interval(PurpleProtocolServer *protocol_server);
@@ -281,7 +281,7 @@
  *
  * Sets the server side alias for @who to @alias.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_alias_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who, const gchar *alias);
@@ -296,7 +296,7 @@
  *
  * Moves @who from group @old_group to a new group of @new_group.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -312,7 +312,7 @@
  *
  * Renames the group named @old_name to the new @group.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -325,7 +325,7 @@
  *
  * Sets the user's buddy icon to @img.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_set_buddy_icon(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleImage *img);
@@ -338,7 +338,7 @@
  *
  * Removes @group from the server side contact list.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_protocol_server_remove_group(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleGroup *group);
@@ -355,7 +355,7 @@
  *
  * Returns: The number of bytes that was sent.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gint purple_protocol_server_send_raw(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *buf, gint len);
diff --git a/libpurple/purpleprotocolwhiteboard.h b/libpurple/purpleprotocolwhiteboard.h
--- a/libpurple/purpleprotocolwhiteboard.h
+++ b/libpurple/purpleprotocolwhiteboard.h
@@ -46,7 +46,7 @@
  * The #PurpleProtocolWhiteboard interface defines the behavior of a protocol's
  * whiteboard interface.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -57,7 +57,7 @@
  *
  * This interface provides a gateway between purple and the protocol.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleProtocolWhiteboardInterface {
 	/*< private >*/
@@ -83,7 +83,7 @@
  *
  * Returns: (transfer full): The new whiteboard instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleWhiteboard *purple_protocol_whiteboard_create(PurpleProtocolWhiteboard *whiteboard, PurpleAccount *account, const gchar *who, gint state);
diff --git a/libpurple/purpleproxyinfo.h b/libpurple/purpleproxyinfo.h
--- a/libpurple/purpleproxyinfo.h
+++ b/libpurple/purpleproxyinfo.h
@@ -44,7 +44,7 @@
  *
  * A type of proxy connection.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 typedef enum {
     PURPLE_PROXY_TYPE_USE_GLOBAL = -1,
@@ -71,7 +71,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleProxyInfo *purple_proxy_info_new(void);
@@ -83,7 +83,7 @@
  *
  * Sets the type of @info.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_proxy_info_set_proxy_type(PurpleProxyInfo *info, PurpleProxyType proxy_type);
@@ -96,7 +96,7 @@
  *
  * Returns: The type of the proxy.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleProxyType purple_proxy_info_get_proxy_type(PurpleProxyInfo *info);
@@ -108,7 +108,7 @@
  *
  * Sets the hostname for the proxy.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_proxy_info_set_hostname(PurpleProxyInfo *info, const gchar *hostname);
@@ -121,7 +121,7 @@
  *
  * Returns: The hostname.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_proxy_info_get_hostname(PurpleProxyInfo *info);
@@ -133,7 +133,7 @@
  *
  * Sets the port for the proxy.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_proxy_info_set_port(PurpleProxyInfo *info, gint port);
@@ -146,7 +146,7 @@
  *
  * Returns: The port of the proxy.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gint purple_proxy_info_get_port(PurpleProxyInfo *info);
@@ -158,7 +158,7 @@
  *
  * Sets the username of the proxy.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_proxy_info_set_username(PurpleProxyInfo *info, const gchar *username);
@@ -171,7 +171,7 @@
  *
  * Returns: The username of the proxy.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const gchar *purple_proxy_info_get_username(PurpleProxyInfo *info);
@@ -183,7 +183,7 @@
  *
  * Sets the password for the proxy.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_proxy_info_set_password(PurpleProxyInfo *info, const gchar *password);
@@ -196,7 +196,7 @@
  *
  * Returns: The password of the proxy.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const gchar *purple_proxy_info_get_password(PurpleProxyInfo *info);
diff --git a/libpurple/purpleproxyinfo.c b/libpurple/purpleproxyinfo.c
--- a/libpurple/purpleproxyinfo.c
+++ b/libpurple/purpleproxyinfo.c
@@ -134,7 +134,7 @@
      *
      * The [enum@ProxyType] to use for this proxy.
      *
-     * Since: 3.0.0
+     * Since: 3.0
      */
     properties[PROP_PROXY_TYPE] = g_param_spec_enum(
         "proxy-type", "proxy-type",
@@ -148,7 +148,7 @@
      *
      * The hostname to use for this proxy.
      *
-     * Since: 3.0.0
+     * Since: 3.0
      */
     properties[PROP_HOSTNAME] = g_param_spec_string(
         "hostname", "hostname",
@@ -161,7 +161,7 @@
      *
      * The port to use for this proxy.
      *
-     * Since: 3.0.0
+     * Since: 3.0
      */
     properties[PROP_PORT] = g_param_spec_int(
         "port", "port",
@@ -174,7 +174,7 @@
      *
      * The username to use for this proxy.
      *
-     * Since: 3.0.0
+     * Since: 3.0
      */
     properties[PROP_USERNAME] = g_param_spec_string(
         "username", "username",
@@ -187,7 +187,7 @@
      *
      * The password to use for this proxy.
      *
-     * Since: 3.0.0
+     * Since: 3.0
      */
     properties[PROP_PASSWORD] = g_param_spec_string(
         "password", "password",
