diff --git a/libpurple/purpleaccount.h b/libpurple/purpleaccount.h
--- a/libpurple/purpleaccount.h
+++ b/libpurple/purpleaccount.h
@@ -52,7 +52,7 @@
  * account. User interfaces typically allow users to create these in a dialog
  * or wizard.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 
 PURPLE_AVAILABLE_IN_3_0
@@ -68,7 +68,7 @@
  *
  * Returns: The new account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleAccount *purple_account_new(const char *username, const char *protocol_id);
@@ -79,7 +79,7 @@
  *
  * Connects to an account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_connect(PurpleAccount *account);
@@ -90,7 +90,7 @@
  *
  * Disconnects from an account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_disconnect(PurpleAccount *account);
@@ -103,7 +103,7 @@
  *
  * Returns: TRUE if the account is being disconnected.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_account_is_disconnecting(PurpleAccount *account);
@@ -114,7 +114,7 @@
  *
  * Close account requests registered for the given PurpleAccount
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_request_close_with_account(PurpleAccount *account);
@@ -125,7 +125,7 @@
  *
  * Close the account request for the given ui handle
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_request_close(void *ui_handle);
@@ -140,7 +140,7 @@
  * Requests a password from the user for the account. Does not set the
  * account password on success; do that in ok_cb if desired.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_request_password(PurpleAccount *account, GCallback ok_cb, GCallback cancel_cb, void *user_data);
@@ -151,7 +151,7 @@
  *
  * Requests information from the user to change the account's password.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_request_change_password(PurpleAccount *account);
@@ -163,7 +163,7 @@
  * Requests information from the user to change the account's
  * user information.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_request_change_user_info(PurpleAccount *account);
@@ -175,7 +175,7 @@
  *
  * Sets the account's user information
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_user_info(PurpleAccount *account, const char *user_info);
@@ -187,7 +187,7 @@
  *
  * Sets the account's buddy icon path.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_buddy_icon_path(PurpleAccount *account, const char *path);
@@ -199,7 +199,7 @@
  *
  * Sets the account's protocol ID.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_protocol_id(PurpleAccount *account, const char *protocol_id);
@@ -211,7 +211,7 @@
  *
  * Sets the account's connection.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_connection(PurpleAccount *account, PurpleConnection *gc);
@@ -223,7 +223,7 @@
  *
  * Sets whether or not this account should save its password.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_remember_password(PurpleAccount *account, gboolean value);
@@ -235,7 +235,7 @@
  *
  * Sets whether or not this account is enabled.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_enabled(PurpleAccount *account, gboolean value);
@@ -247,7 +247,7 @@
  *
  * Sets the account's proxy information.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_proxy_info(PurpleAccount *account, PurpleProxyInfo *info);
@@ -259,7 +259,7 @@
  *
  * Sets the account's status types.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_status_types(PurpleAccount *account, GList *status_types);
@@ -286,7 +286,7 @@
  *
  * Variadic version of [method@Purple.Account.set_status_attrs].
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_status(PurpleAccount *account, const char *status_id, gboolean active, ...) G_GNUC_NULL_TERMINATED;
@@ -312,7 +312,7 @@
  * status. So, if @status_id is an exclusive status and @active is %FALSE, this
  * function does nothing.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_set_status_attrs(PurpleAccount *account, const char *status_id, gboolean active, GHashTable *attrs);
@@ -325,7 +325,7 @@
  *
  * Sets a protocol-specific integer setting for an account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_int(PurpleAccount *account, const char *name, int value);
@@ -338,7 +338,7 @@
  *
  * Sets a protocol-specific string setting for an account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_string(PurpleAccount *account, const char *name, const char *value);
@@ -351,7 +351,7 @@
  *
  * Sets a protocol-specific boolean setting for an account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_set_bool(PurpleAccount *account, const char *name, gboolean value);
@@ -364,7 +364,7 @@
  *
  * Returns: %TRUE if connected, or %FALSE otherwise.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_is_connected(PurpleAccount *account);
@@ -377,7 +377,7 @@
  *
  * Returns: %TRUE if connecting, or %FALSE otherwise.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_is_connecting(PurpleAccount *account);
@@ -390,7 +390,7 @@
  *
  * Returns: %TRUE if disconnected, or %FALSE otherwise.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_is_disconnected(PurpleAccount *account);
@@ -403,7 +403,7 @@
  *
  * Returns: The user information.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const char *purple_account_get_user_info(PurpleAccount *account);
@@ -416,7 +416,7 @@
  *
  * Returns: The buddy icon's non-cached path.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const char *purple_account_get_buddy_icon_path(PurpleAccount *account);
@@ -429,7 +429,7 @@
  *
  * Returns: The protocol ID.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const char *purple_account_get_protocol_id(PurpleAccount *account);
@@ -443,7 +443,7 @@
  * Returns: (transfer none): The #PurpleProtocol for @account or %NULL if it
  *          could not be found.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleProtocol *purple_account_get_protocol(PurpleAccount *account);
@@ -456,7 +456,7 @@
  *
  * Returns: The protocol name.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const char *purple_account_get_protocol_name(PurpleAccount *account);
@@ -469,7 +469,7 @@
  *
  * Returns: (transfer none): The connection.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleConnection *purple_account_get_connection(PurpleAccount *account);
@@ -482,7 +482,7 @@
  *
  * Returns: %TRUE if it should remember the password.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_get_remember_password(PurpleAccount *account);
@@ -495,7 +495,7 @@
  *
  * Returns: %TRUE if it enabled on this UI.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_get_enabled(PurpleAccount *account);
@@ -508,7 +508,7 @@
  *
  * Returns: (transfer none): The proxy information.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleProxyInfo *purple_account_get_proxy_info(PurpleAccount *account);
@@ -524,7 +524,7 @@
  *
  * Returns: (transfer none): The active status.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleStatus *purple_account_get_active_status(PurpleAccount *account);
@@ -538,7 +538,7 @@
  *
  * Returns: (transfer none): The status, or %NULL if it was never registered.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleStatus *purple_account_get_status(PurpleAccount *account, const char *status_id);
@@ -552,7 +552,7 @@
  *
  * Returns: The status type if found, or %NULL.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleStatusType *purple_account_get_status_type(PurpleAccount *account, const char *id);
@@ -569,7 +569,7 @@
  *
  * Returns: The status if found, or %NULL.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleStatusType *purple_account_get_status_type_with_primitive(PurpleAccount *account, PurpleStatusPrimitive primitive);
@@ -582,7 +582,7 @@
  *
  * Returns: (transfer none): The account's presence.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurplePresence *purple_account_get_presence(PurpleAccount *account);
@@ -596,7 +596,7 @@
  *
  * Returns: TRUE if active, or FALSE if not.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_is_status_active(PurpleAccount *account, const char *status_id);
@@ -609,7 +609,7 @@
  *
  * Returns: (transfer none) (element-type PurpleStatusType): The account's status types.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 GList *purple_account_get_status_types(PurpleAccount *account);
@@ -624,7 +624,7 @@
  *
  * Returns: The value.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 int purple_account_get_int(PurpleAccount *account, const char *name, int default_value);
@@ -639,7 +639,7 @@
  *
  * Returns: The value.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const char *purple_account_get_string(PurpleAccount *account, const char *name, const char *default_value);
@@ -654,7 +654,7 @@
  *
  * Returns: The value.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_get_bool(PurpleAccount *account, const char *name, gboolean default_value);
@@ -667,7 +667,7 @@
  *
  * Adds a buddy to the server-side buddy list for the specified account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_add_buddy(PurpleAccount *account, PurpleBuddy *buddy, const char *message);
@@ -680,7 +680,7 @@
  *
  * Adds a list of buddies to the server-side buddy list.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_add_buddies(PurpleAccount *account, GList *buddies, const char *message);
@@ -693,7 +693,7 @@
  *
  * Removes a buddy from the server-side buddy list.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_remove_buddy(PurpleAccount *account, PurpleBuddy *buddy, PurpleGroup *group);
@@ -710,7 +710,7 @@
  * Note: The lists buddies and groups are parallel lists.  Be sure that node n of
  *       groups matches node n of buddies.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_remove_buddies(PurpleAccount *account, GList *buddies, GList *groups);
@@ -722,7 +722,7 @@
  *
  * Removes a group from the server-side buddy list.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_remove_group(PurpleAccount *account, PurpleGroup *group);
@@ -735,7 +735,7 @@
  *
  * Changes the password on the specified account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_change_password(PurpleAccount *account, const char *orig_pw, const char *new_pw);
@@ -747,7 +747,7 @@
  *
  * Whether the account supports sending offline messages to buddy.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy);
@@ -764,7 +764,7 @@
  *          pointer is guaranteed to remain valid until the @ref
  *          account-error-changed signal is emitted for @account.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const PurpleConnectionErrorInfo *purple_account_get_error(PurpleAccount *account);
@@ -780,7 +780,7 @@
  * connection failure, when invalid settings are entered in an account editor,
  * or similar situations.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_set_error(PurpleAccount *account, PurpleConnectionErrorInfo *info);
@@ -794,7 +794,7 @@
  * that it should look for a password in the [class@Purple.CredentialManager]
  * or prompt the user if a password can not be found.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_set_require_password(PurpleAccount *account, gboolean require_password);
@@ -807,7 +807,7 @@
  *
  * Returns: %TRUE if the account requires a password, %FALSE otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_account_get_require_password(PurpleAccount *account);
@@ -828,7 +828,7 @@
  * Call [method@Purple.Account.thaw_notify_settings] to decrement the freeze
  * counter.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_freeze_notify_settings(PurpleAccount *account);
@@ -841,7 +841,7 @@
  *
  * See [method@Purple.Account.freeze_notify_settings] for more information.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_thaw_notify_settings(PurpleAccount *account);
# HG changeset patch
# Node ID 24ce78ab82e5
# Parent  648a1b5dd96a
diff --git a/libpurple/purpleaccount.c b/libpurple/purpleaccount.c
--- a/libpurple/purpleaccount.c
+++ b/libpurple/purpleaccount.c
@@ -828,7 +828,7 @@
 	 * if the [class@Purple.Protocol] that this account is for allows optional
 	 * passwords.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_REQUIRE_PASSWORD] = g_param_spec_boolean(
 		"require-password", "require-password",
@@ -841,7 +841,7 @@
 	 *
 	 * The user information or profile for the account.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_USER_INFO] = g_param_spec_string(
 		"user-info", "user-info",
@@ -854,7 +854,7 @@
 	 *
 	 * The path to the file to use as the avatar for this account.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_BUDDY_ICON_PATH] = g_param_spec_string(
 		"buddy-icon-path", "buddy-icon-path",
@@ -867,7 +867,7 @@
 	 *
 	 * Whether or not this account should track the user's global status.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ENABLED] = g_param_spec_boolean(
 		"enabled", "enabled",
@@ -881,7 +881,7 @@
 	 * Whether or not the password for this account should be stored in the
 	 * configured [class@CredentialProvider].
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_REMEMBER_PASSWORD] = g_param_spec_boolean(
 		"remember-password", "remember-password",
@@ -895,7 +895,7 @@
 	 * The [class@Connection] object for this account. This will be %NULL when
 	 * the account is offline.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_CONNECTION] = g_param_spec_object(
 		"connection", "connection",
@@ -908,7 +908,7 @@
 	 *
 	 * The identifier of the protocol that this account is using.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_PROTOCOL_ID] = g_param_spec_string(
 		"protocol-id", "protocol-id",
@@ -921,7 +921,7 @@
 	 *
 	 * The [class@ProxyInfo] for this account.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_PROXY_INFO] = g_param_spec_object(
 		"proxy-info", "proxy-info",
@@ -939,7 +939,7 @@
 	 * Setting this will not disconnect an account, but this will be set when
 	 * there is a connection failure.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ERROR] = g_param_spec_boxed(
 		"error", "error",
@@ -952,7 +952,7 @@
 	 *
 	 * Whether or not the account is connected.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_CONNECTED] = g_param_spec_boolean(
 		"connected", "connected",
@@ -975,7 +975,7 @@
 	 * connecting to `setting-changed::foo` will only be called when the `foo`
 	 * setting is changed.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_SETTING_CHANGED] = g_signal_new_class_handler(
 		"setting-changed",
@@ -997,7 +997,7 @@
 	 * [property@Connection:state] has changed to
 	 * %PURPLE_CONNECTION_STATE_CONNECTED.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_CONNECTED] = g_signal_new_class_handler(
 		"connected",
@@ -1018,7 +1018,7 @@
 	 * [property@Connection:state] has changed to
 	 * %PURPLE_CONNECTION_STATE_DISCONNECTED.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_DISCONNECTED] = g_signal_new_class_handler(
 		"disconnected",
diff --git a/libpurple/purpleaccountmanager.h b/libpurple/purpleaccountmanager.h
--- a/libpurple/purpleaccountmanager.h
+++ b/libpurple/purpleaccountmanager.h
@@ -47,7 +47,7 @@
  *
  * A function used as a callback with purple_account_manager_foreach().
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleAccountManagerForeachFunc)(PurpleAccount *account, gpointer data);
@@ -57,7 +57,7 @@
  *
  * A manager that keeps track of all [class@Purple.Account]s.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -67,7 +67,7 @@
  *
  * Returns: (transfer none): The default account manager for libpurple.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccountManager *purple_account_manager_get_default(void);
@@ -79,7 +79,7 @@
  *
  * Returns: (transfer none): The default account manager for libpurple.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_account_manager_get_default_as_model(void);
@@ -91,7 +91,7 @@
  *
  * Adds @account to @manager.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_manager_add(PurpleAccountManager *manager, PurpleAccount *account);
@@ -103,7 +103,7 @@
  *
  * Removes @account from @manager.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_manager_remove(PurpleAccountManager *manager, PurpleAccount *account);
@@ -116,7 +116,7 @@
  *
  * Moves @account to @new_index in @manager.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_manager_reorder(PurpleAccountManager *manager, PurpleAccount *account, guint new_index);
@@ -130,7 +130,7 @@
  * Returns: (transfer container) (element-type PurpleAccount): The list of all
  *          enabled accounts.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_account_manager_get_enabled(PurpleAccountManager *manager);
@@ -144,7 +144,7 @@
  * Returns: (transfer container) (element-type PurpleAccount): The list of all
  *          disabled accounts.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_account_manager_get_disabled(PurpleAccountManager *manager);
@@ -158,7 +158,7 @@
  * Returns: (transfer container) (element-type PurpleAccount): The list of all
  *          connected accounts.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_account_manager_get_connected(PurpleAccountManager *manager);
@@ -172,7 +172,7 @@
  *
  * Returns: (transfer full): The account if found, otherwise %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_account_manager_find_by_id(PurpleAccountManager *manager, const gchar *id);
@@ -188,7 +188,7 @@
  *
  * Returns: (transfer full): The account if found, otherwise %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_account_manager_find(PurpleAccountManager *manager, const gchar *username, const gchar *protocol_id);
@@ -204,7 +204,7 @@
  *
  * Returns: (transfer full): The account if found, otherwise %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccount * purple_account_manager_find_custom(PurpleAccountManager *manager, GEqualFunc func, gconstpointer data);
@@ -217,7 +217,7 @@
  *
  * Calls @callback with @data for each account that @manager knows about.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_manager_foreach(PurpleAccountManager *manager, PurpleAccountManagerForeachFunc callback, gpointer data);
diff --git a/libpurple/purpleaccountmanager.c b/libpurple/purpleaccountmanager.c
--- a/libpurple/purpleaccountmanager.c
+++ b/libpurple/purpleaccountmanager.c
@@ -159,7 +159,7 @@
 	 *
 	 * Emitted after @account was added to @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ADDED] = g_signal_new_class_handler(
 		"added",
@@ -180,7 +180,7 @@
 	 *
 	 * Emitted after @account was removed from @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_REMOVED] = g_signal_new_class_handler(
 		"removed",
@@ -208,7 +208,7 @@
 	 * something like `account-changed::enabled` and your callback will only
 	 * be called when the enabled property of @account has been changed.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ACCOUNT_CHANGED] = g_signal_new_class_handler(
 		"account-changed",
@@ -237,7 +237,7 @@
 	 * something like `account-setting-changed::use-tls` and your callback will
 	 * only be called when the `use-tls` setting of @account has been changed.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ACCOUNT_SETTING_CHANGED] = g_signal_new_class_handler(
 		"account-setting-changed",
@@ -261,7 +261,7 @@
 	 * means that your callback will be called for any account that @manager
 	 * knows about.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ACCOUNT_CONNECTED] = g_signal_new_class_handler(
 		"account-connected",
@@ -284,7 +284,7 @@
 	 * This means that your callback will be called for any account that
 	 * @manager knows about.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ACCOUNT_DISCONNECTED] = g_signal_new_class_handler(
 		"account-disconnected",
diff --git a/libpurple/purpleaccountoption.h b/libpurple/purpleaccountoption.h
--- a/libpurple/purpleaccountoption.h
+++ b/libpurple/purpleaccountoption.h
@@ -43,7 +43,7 @@
  * This is set by protocols, and appears in the account settings
  * dialogs.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 typedef struct _PurpleAccountOption		PurpleAccountOption;
 
@@ -65,7 +65,7 @@
  *
  * Returns: The account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleAccountOption *purple_account_option_new(PurplePrefType type, const gchar *text, const gchar *pref_name);
@@ -78,7 +78,7 @@
  *
  * Returns: (transfer full): A new copy of @option.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccountOption *purple_account_option_copy(PurpleAccountOption *option);
@@ -93,7 +93,7 @@
  *
  * Returns: The account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleAccountOption *purple_account_option_bool_new(const gchar *text, const gchar *pref_name, gboolean default_value);
@@ -108,7 +108,7 @@
  *
  * Returns: The account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleAccountOption *purple_account_option_int_new(const gchar *text, const gchar *pref_name, gint default_value);
@@ -123,7 +123,7 @@
  *
  * Returns: The account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleAccountOption *purple_account_option_string_new(const gchar *text, const gchar *pref_name, const gchar *default_value);
@@ -146,7 +146,7 @@
  *
  * Returns: The account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleAccountOption *purple_account_option_list_new(const gchar *text, const gchar *pref_name, GList *list);
@@ -157,7 +157,7 @@
  *
  * Destroys an account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_option_destroy(PurpleAccountOption *option);
@@ -169,7 +169,7 @@
  *
  * Sets the default boolean value for an account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_option_set_default_bool(PurpleAccountOption *option, gboolean value);
@@ -181,7 +181,7 @@
  *
  * Sets the default integer value for an account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_option_set_default_int(PurpleAccountOption *option, gint value);
@@ -193,7 +193,7 @@
  *
  * Sets the default string value for an account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_option_set_default_string(PurpleAccountOption *option, const gchar *value);
@@ -207,7 +207,7 @@
  * as a hint to the UI that the option's value should be obscured from
  * view, like a password.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_option_string_set_masked(PurpleAccountOption *option, gboolean masked);
@@ -222,7 +222,7 @@
  * The list passed will be owned by the account option, and the
  * strings inside will be freed automatically.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_option_string_set_hints(PurpleAccountOption *option, GSList *hints);
@@ -241,7 +241,7 @@
  * The list is in key, value pairs. The key is the ID stored and used
  * internally, and the value is the label displayed.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_option_set_list(PurpleAccountOption *option, GList *values);
@@ -254,7 +254,7 @@
  *
  * Adds an item to a list account option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_option_add_list_item(PurpleAccountOption *option, const gchar *key, const gchar *value);
@@ -267,7 +267,7 @@
  *
  * Returns: The account option's type.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurplePrefType purple_account_option_get_pref_type(const PurpleAccountOption *option);
@@ -280,7 +280,7 @@
  *
  * Returns: The account option's text.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const gchar *purple_account_option_get_text(const PurpleAccountOption *option);
@@ -295,7 +295,7 @@
  *
  * Returns: The option's name.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const gchar *purple_account_option_get_setting(const PurpleAccountOption *option);
@@ -308,7 +308,7 @@
  *
  * Returns: The default boolean value.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_account_option_get_default_bool(const PurpleAccountOption *option);
@@ -321,7 +321,7 @@
  *
  * Returns: The default integer value.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gint purple_account_option_get_default_int(const PurpleAccountOption *option);
@@ -334,7 +334,7 @@
  *
  * Returns: The default string value.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const gchar *purple_account_option_get_default_string(const PurpleAccountOption *option);
@@ -347,7 +347,7 @@
  *
  * Returns: The default list string value.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const gchar *purple_account_option_get_default_list_value(const PurpleAccountOption *option);
@@ -362,7 +362,7 @@
  *
  * Returns: %TRUE if the option's value should be obscured.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_account_option_string_get_masked(const PurpleAccountOption *option);
@@ -375,7 +375,7 @@
  *
  * Returns: (element-type utf8) (transfer none): A list of hints.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const GSList *purple_account_option_string_get_hints(const PurpleAccountOption *option);
@@ -391,7 +391,7 @@
  *          value to the <type>(const char *)</type> that should be passed to
  *          purple_account_set_string() to set the option.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 GList *purple_account_option_get_list(const PurpleAccountOption *option);
diff --git a/libpurple/purpleaccountpresence.h b/libpurple/purpleaccountpresence.h
--- a/libpurple/purpleaccountpresence.h
+++ b/libpurple/purpleaccountpresence.h
@@ -39,7 +39,7 @@
  * A #PurpleAccountPresence represent the #PurplePresence for a specific
  * #PurpleAccount.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 #define PURPLE_TYPE_ACCOUNT_PRESENCE (purple_account_presence_get_type())
@@ -56,7 +56,7 @@
  *
  * Returns: The new presence.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccountPresence *purple_account_presence_new(PurpleAccount *account);
@@ -69,7 +69,7 @@
  *
  * Returns: (transfer none): The presence's account.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_account_presence_get_account(PurpleAccountPresence *presence);
diff --git a/libpurple/purpleaccountusersplit.h b/libpurple/purpleaccountusersplit.h
--- a/libpurple/purpleaccountusersplit.h
+++ b/libpurple/purpleaccountusersplit.h
@@ -42,7 +42,7 @@
  * This is used by some protocols to separate the fields of the username
  * into more human-readable components.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 typedef struct _PurpleAccountUserSplit	PurpleAccountUserSplit;
 
@@ -61,7 +61,7 @@
  *
  * Returns: The new user split.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleAccountUserSplit *purple_account_user_split_new(const gchar *text, const gchar *default_value, gchar sep);
@@ -74,7 +74,7 @@
  *
  * Returns: (transfer full): A copy of @split.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccountUserSplit *purple_account_user_split_copy(PurpleAccountUserSplit *split);
@@ -85,7 +85,7 @@
  *
  * Destroys an account username split.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_account_user_split_destroy(PurpleAccountUserSplit *split);
@@ -98,7 +98,7 @@
  *
  * Returns: The account username split's text.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const gchar *purple_account_user_split_get_text(PurpleAccountUserSplit *split);
@@ -111,7 +111,7 @@
  *
  * Returns: The default string.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const gchar *purple_account_user_split_get_default_value(PurpleAccountUserSplit *split);
@@ -124,7 +124,7 @@
  *
  * Returns: The field separator.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gchar purple_account_user_split_get_separator(PurpleAccountUserSplit *split);
@@ -137,7 +137,7 @@
  *
  * Returns: The 'reverse' value.
  *
- * Since: 2.1.0
+ * Since: 2.1
  */
 PURPLE_AVAILABLE_IN_2_1
 gboolean purple_account_user_split_get_reverse(PurpleAccountUserSplit *split);
@@ -149,7 +149,7 @@
  *
  * Sets the 'reverse' value for an account split.
  *
- * Since: 2.1.0
+ * Since: 2.1
  */
 PURPLE_AVAILABLE_IN_2_1
 void purple_account_user_split_set_reverse(PurpleAccountUserSplit *split, gboolean reverse);
@@ -165,7 +165,7 @@
  *
  * Returns: %TRUE, if the split is constant.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_account_user_split_is_constant(PurpleAccountUserSplit *split);
@@ -177,7 +177,7 @@
  *
  * Sets the constant parameter of account split.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_account_user_split_set_constant(PurpleAccountUserSplit *split, gboolean constant);
diff --git a/libpurple/purpleaddcontactrequest.h b/libpurple/purpleaddcontactrequest.h
--- a/libpurple/purpleaddcontactrequest.h
+++ b/libpurple/purpleaddcontactrequest.h
@@ -42,7 +42,7 @@
  * information when someone has added you to their contact list, so the user
  * interface can ask the user to add the remote user to their contact list.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 #define PURPLE_TYPE_ADD_CONTACT_REQUEST (purple_add_contact_request_get_type())
@@ -62,7 +62,7 @@
  *
  * Returns: The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAddContactRequest *purple_add_contact_request_new(PurpleAccount *account, const gchar *username);
@@ -75,7 +75,7 @@
  *
  * Returns: (transfer none): The account.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_add_contact_request_get_account(PurpleAddContactRequest *request);
@@ -88,7 +88,7 @@
  *
  * Returns: The username of the remote user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_add_contact_request_get_username(PurpleAddContactRequest *request);
@@ -101,7 +101,7 @@
  * Sets the alias of the remote user to @alias. User interfaces can use this
  * when presenting the authorization request to the end user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_add_contact_request_set_alias(PurpleAddContactRequest *request, const gchar *alias);
@@ -114,7 +114,7 @@
  *
  * Returns: (nullable): The alias if one was set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_add_contact_request_get_alias(PurpleAddContactRequest *request);
@@ -127,7 +127,7 @@
  * Sets an optional message from remote user, that the user interface can
  * display to the end user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_add_contact_request_set_message(PurpleAddContactRequest *request, const gchar *message);
@@ -140,7 +140,7 @@
  *
  * Returns: (nullable): The optional message.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_add_contact_request_get_message(PurpleAddContactRequest *request);
@@ -154,7 +154,7 @@
  *
  * If this is called multiple times, then this does nothing.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_add_contact_request_add(PurpleAddContactRequest *request);
diff --git a/libpurple/purpleaddcontactrequest.c b/libpurple/purpleaddcontactrequest.c
--- a/libpurple/purpleaddcontactrequest.c
+++ b/libpurple/purpleaddcontactrequest.c
@@ -186,7 +186,7 @@
 	 * typically emitted by the user interface calling
 	 * [method@AddContactRequest.add].
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ADD] = g_signal_new_class_handler(
 		"add",
@@ -204,7 +204,7 @@
 	 *
 	 * The account that this add contact request is for.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ACCOUNT] = g_param_spec_object(
 		"account", "account",
@@ -217,7 +217,7 @@
 	 *
 	 * The username of the remote user to be added.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_USERNAME] = g_param_spec_string(
 		"username", "username",
@@ -230,7 +230,7 @@
 	 *
 	 * The alias of the remote user to be added.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ALIAS] = g_param_spec_string(
 		"alias", "alias",
@@ -243,7 +243,7 @@
 	 *
 	 * The optional message sent from the remote user.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_MESSAGE] = g_param_spec_string(
 		"message", "message",
diff --git a/libpurple/purpleattachment.h b/libpurple/purpleattachment.h
--- a/libpurple/purpleattachment.h
+++ b/libpurple/purpleattachment.h
@@ -40,7 +40,7 @@
  *
  * #PurpleAttachment represents a file attached to a #PurpleMessage.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 PURPLE_AVAILABLE_IN_3_0
@@ -53,7 +53,7 @@
  *
  * Called when iterating #PurpleAttachment's.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 typedef void (*PurpleAttachmentForeachFunc)(PurpleAttachment *attachment, gpointer data);
 
@@ -64,7 +64,7 @@
  *
  * Creates a new #PurpleAttachment with the given @id and @content_type.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAttachment *purple_attachment_new(guint64 id, const gchar *content_type);
@@ -77,7 +77,7 @@
  *
  * Returns: The ID of @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 guint64 purple_attachment_get_id(PurpleAttachment *attachment);
@@ -92,7 +92,7 @@
  *
  * Returns: (transfer none): The hash key of @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 guint64 *purple_attachment_get_hash_key(PurpleAttachment *attachment);
@@ -104,7 +104,7 @@
  *
  * Sets the ID of @attachment to @id.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_attachment_set_id(PurpleAttachment *attachment, guint64 id);
@@ -117,7 +117,7 @@
  *
  * Returns: The content-type of @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_attachment_get_content_type(PurpleAttachment *attachment);
@@ -130,7 +130,7 @@
  *
  * Returns: (nullable): The local URI for @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_attachment_get_local_uri(PurpleAttachment *attachment);
@@ -142,7 +142,7 @@
  *
  * Sets the local URI of @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_attachment_set_local_uri(PurpleAttachment *attachment, const gchar *local_uri);
@@ -155,7 +155,7 @@
  *
  * Returns: (nullable): The remote URI for @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_attachment_get_remote_uri(PurpleAttachment *attachment);
@@ -167,7 +167,7 @@
  *
  * Sets the remote URI of @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_attachment_set_remote_uri(PurpleAttachment *attachment, const gchar *remote_uri);
@@ -180,7 +180,7 @@
  *
  * Returns: The size of @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 guint64 purple_attachment_get_size(PurpleAttachment *attachment);
@@ -192,7 +192,7 @@
  *
  * Sets the size of @attachment to @size.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_attachment_set_size(PurpleAttachment *attachment, guint64 size);
@@ -206,7 +206,7 @@
  *
  * Returns: (transfer full): The filename for @attachment.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gchar *purple_attachment_get_filename(PurpleAttachment *attachment);
diff --git a/libpurple/purpleattachment.c b/libpurple/purpleattachment.c
--- a/libpurple/purpleattachment.c
+++ b/libpurple/purpleattachment.c
@@ -151,7 +151,7 @@
 	 *
 	 * The identifier of this attachment.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ID] = g_param_spec_uint64(
 		"id", "id",
@@ -165,7 +165,7 @@
 	 * The content type of this attachment. This should be a commonly used
 	 * mime type.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_CONTENT_TYPE] = g_param_spec_string(
 		"content-type", "content-type",
@@ -179,7 +179,7 @@
 	 * The local URI of the attachment. That is where the file can be found on
 	 * disk.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_LOCAL_URI] = g_param_spec_string(
 		"local-uri", "local-uri",
@@ -193,7 +193,7 @@
 	 * The remote URI of the attachment. In most cases this is just a base
 	 * filename.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_REMOTE_URI] = g_param_spec_string(
 		"remote-uri", "remote-uri",
@@ -206,7 +206,7 @@
 	 *
 	 * The size of the attachment in bytes.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_SIZE] = g_param_spec_uint64(
 		"size", "size",
diff --git a/libpurple/purpleauthorizationrequest.h b/libpurple/purpleauthorizationrequest.h
--- a/libpurple/purpleauthorizationrequest.h
+++ b/libpurple/purpleauthorizationrequest.h
@@ -42,7 +42,7 @@
  * information when someone has requested authorization to add you to their
  * contact list.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 #define PURPLE_TYPE_AUTHORIZATION_REQUEST (purple_authorization_request_get_type())
@@ -62,7 +62,7 @@
  *
  * Returns: The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAuthorizationRequest *purple_authorization_request_new(PurpleAccount *account, const gchar *username);
@@ -75,7 +75,7 @@
  *
  * Returns: (transfer none): The account.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_authorization_request_get_account(PurpleAuthorizationRequest *request);
@@ -88,7 +88,7 @@
  *
  * Returns: The username of the remote user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_authorization_request_get_username(PurpleAuthorizationRequest *request);
@@ -101,7 +101,7 @@
  * Sets the alias of the remote user to @alias. User interfaces can use this
  * when presenting the authorization request to the end user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_set_alias(PurpleAuthorizationRequest *request, const gchar *alias);
@@ -114,7 +114,7 @@
  *
  * Returns: (nullable): The alias if one was set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_authorization_request_get_alias(PurpleAuthorizationRequest *request);
@@ -127,7 +127,7 @@
  * Sets an optional message from remote user, that the user interface can
  * display to the end user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_set_message(PurpleAuthorizationRequest *request, const gchar *message);
@@ -140,7 +140,7 @@
  *
  * Returns: (nullable): The optional message.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_authorization_request_get_message(PurpleAuthorizationRequest *request);
@@ -153,7 +153,7 @@
  * Sets whether or not the user interface should ask the end user to add the
  * remote user if the remote user was accepted.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_set_add(PurpleAuthorizationRequest *request, gboolean add);
@@ -168,7 +168,7 @@
  * Returns: %TRUE if the user interface should request the end user to add the
  *          remote user back.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_authorization_request_get_add(PurpleAuthorizationRequest *request);
@@ -183,7 +183,7 @@
  * If this is called multiple times, or called after
  * [method@AuthorizationRequest.deny] then this does nothing.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_accept(PurpleAuthorizationRequest *request);
@@ -199,7 +199,7 @@
  * If this is called multiple times, or called after
  * [method@AuthorizationRequest.accept] then this does nothing.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_authorization_request_deny(PurpleAuthorizationRequest *request, const gchar *message);
diff --git a/libpurple/purpleauthorizationrequest.c b/libpurple/purpleauthorizationrequest.c
--- a/libpurple/purpleauthorizationrequest.c
+++ b/libpurple/purpleauthorizationrequest.c
@@ -196,7 +196,7 @@
 	 * Emitted when the user has accepted @request. This is typically emitted
 	 * by the user interface calling [method@AuthorizationRequest.accept].
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ACCEPTED] = g_signal_new_class_handler(
 		"accepted",
@@ -217,7 +217,7 @@
 	 * Emitted when the user has denied @request. This is typically emitted
 	 * by the user interface calling [method@AuthorizationRequest.deny].
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_DENIED] = g_signal_new_class_handler(
 		"denied",
@@ -236,7 +236,7 @@
 	 *
 	 * The account that this authorization request is for.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ACCOUNT] = g_param_spec_object(
 		"account", "account",
@@ -249,7 +249,7 @@
 	 *
 	 * The username of the remote user that is requesting authorization.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_USERNAME] = g_param_spec_string(
 		"username", "username",
@@ -262,7 +262,7 @@
 	 *
 	 * The alias of the remote user that is requesting authorization.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ALIAS] = g_param_spec_string(
 		"alias", "alias",
@@ -275,7 +275,7 @@
 	 *
 	 * The optional message sent from the remote user.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_MESSAGE] = g_param_spec_string(
 		"message", "message",
@@ -289,7 +289,7 @@
 	 * Whether or not the user interface should ask the end user to add the
 	 * remote user after accepting the end user's friend request.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ADD] = g_param_spec_boolean(
 		"add", "add",
diff --git a/libpurple/purpleavatar.h b/libpurple/purpleavatar.h
--- a/libpurple/purpleavatar.h
+++ b/libpurple/purpleavatar.h
@@ -48,7 +48,7 @@
  * A representation of an Avatar that is used for accounts, contacts, and
  * conversations.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -60,7 +60,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_avatar_new_from_filename(const char *filename, GError **error);
@@ -74,7 +74,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_avatar_new_from_resource(const char *resource_path, GError **error);
@@ -87,7 +87,7 @@
  *
  * Returns: The base filename of @avatar.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_avatar_get_filename(PurpleAvatar *avatar);
@@ -104,7 +104,7 @@
  *
  * Returns: (transfer none): The pixbuf of the avatar which could be %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GdkPixbuf *purple_avatar_get_pixbuf(PurpleAvatar *avatar);
@@ -117,7 +117,7 @@
  *
  * Returns: %TRUE if @avatar is animated, %FALSE otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_avatar_get_animated(PurpleAvatar *avatar);
@@ -131,7 +131,7 @@
  *
  * Returns: (transfer none): The animation or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GdkPixbufAnimation *purple_avatar_get_animation(PurpleAvatar *avatar);
@@ -144,7 +144,7 @@
  *
  * Returns: (transfer none): The [class@Purple.Tags] for @avatar.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_avatar_get_tags(PurpleAvatar *avatar);
diff --git a/libpurple/purpleavatar.c b/libpurple/purpleavatar.c
--- a/libpurple/purpleavatar.c
+++ b/libpurple/purpleavatar.c
@@ -164,7 +164,7 @@
 	 *
 	 * The filename that this avatar was created from.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_FILENAME] = g_param_spec_string(
 		"filename", "filename",
@@ -179,7 +179,7 @@
 	 * [property@Purple.Avatar:animated] is %TRUE, this will be a static frame
 	 * from the animation.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_PIXBUF] = g_param_spec_object(
 		"pixbuf", "pixbuf",
@@ -192,7 +192,7 @@
 	 *
 	 * Whether or not this avatar is animated.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ANIMATED] = g_param_spec_boolean(
 		"animated", "animated",
@@ -206,7 +206,7 @@
 	 * The [class@GdkPixbuf.PixbufAnimation] if
 	 * [property@Purple.Avatar:animated] is %TRUE.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ANIMATION] = g_param_spec_object(
 		"animation", "animation",
@@ -219,7 +219,7 @@
 	 *
 	 * The [class@Purple.Tags] for the avatar.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TAGS] = g_param_spec_object(
 		"tags", "tags",
diff --git a/libpurple/purplebuddypresence.h b/libpurple/purplebuddypresence.h
--- a/libpurple/purplebuddypresence.h
+++ b/libpurple/purplebuddypresence.h
@@ -39,7 +39,7 @@
  * A #PurpleBuddyPresence represent the #PurplePresence for a specific
  * #PurpleBuddy.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 #define PURPLE_TYPE_BUDDY_PRESENCE (purple_buddy_presence_get_type())
@@ -56,7 +56,7 @@
  *
  * Returns: The new presence.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleBuddyPresence *purple_buddy_presence_new(PurpleBuddy *buddy);
@@ -69,7 +69,7 @@
  *
  * Returns: (transfer none): The presence's buddy.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleBuddy *purple_buddy_presence_get_buddy(PurpleBuddyPresence *presence);
@@ -85,7 +85,7 @@
  *           0 if @buddy_presence1 is equal to @buddy_presence2.
  *           1 if @buddy_presence1 is less available than @buddy_presence2.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gint purple_buddy_presence_compare(PurpleBuddyPresence *buddy_presence1,
diff --git a/libpurple/purplechanneljoindetails.h b/libpurple/purplechanneljoindetails.h
--- a/libpurple/purplechanneljoindetails.h
+++ b/libpurple/purplechanneljoindetails.h
@@ -46,7 +46,7 @@
  * user interface will ask a protocol for a [class@ChannelJoinDetails] and then
  * fill it out and pass it back to the protocol to actually join a channel.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -58,7 +58,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleChannelJoinDetails *purple_channel_join_details_new(gboolean nickname_supported, gboolean password_supported);
@@ -71,7 +71,7 @@
  *
  * Returns: (nullable): The name of the channel.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_channel_join_details_get_name(PurpleChannelJoinDetails *details);
@@ -83,7 +83,7 @@
  *
  * Sets the name of the channel to @name.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_channel_join_details_set_name(PurpleChannelJoinDetails *details, const char *name);
@@ -96,7 +96,7 @@
  *
  * Returns: (nullable): The user's channel-specific nickname to use.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_channel_join_details_get_nickname(PurpleChannelJoinDetails *details);
@@ -108,7 +108,7 @@
  *
  * Sets the channel-specific nickname for the user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_channel_join_details_set_nickname(PurpleChannelJoinDetails *details, const char *nickname);
@@ -121,7 +121,7 @@
  *
  * Returns: %TRUE if channel-specific nicknames are supported otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_channel_join_details_get_nickname_supported(PurpleChannelJoinDetails *details);
@@ -134,7 +134,7 @@
  *
  * Returns: (nullable): The password to join this channel.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_channel_join_details_get_password(PurpleChannelJoinDetails *details);
@@ -146,7 +146,7 @@
  *
  * Sets the password to use to join this channel.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_channel_join_details_set_password(PurpleChannelJoinDetails *details, const char *password);
@@ -159,7 +159,7 @@
  *
  * Returns: %TRUE if channel passwords are supported, otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_channel_join_details_get_password_supported(PurpleChannelJoinDetails *details);
@@ -178,7 +178,7 @@
  * its default [class@ChannelJoinDetails] so that any input from the user can
  * be maintained.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_channel_join_details_merge(PurpleChannelJoinDetails *source, PurpleChannelJoinDetails *destination);
diff --git a/libpurple/purplechanneljoindetails.c b/libpurple/purplechanneljoindetails.c
--- a/libpurple/purplechanneljoindetails.c
+++ b/libpurple/purplechanneljoindetails.c
@@ -177,7 +177,7 @@
 	 *
 	 * The name of the channel to join.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_NAME] = g_param_spec_string(
 		"name", "name",
@@ -194,7 +194,7 @@
 	 * interfaces should check [property@ChannelJoinDetails:nickname-supported]
 	 * before displaying this option to the user.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_NICKNAME] = g_param_spec_string(
 		"nickname", "nickname",
@@ -207,7 +207,7 @@
 	 *
 	 * Whether or not the protocol supports channel-specific nicknames.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_NICKNAME_SUPPORTED] = g_param_spec_boolean(
 		"nickname-supported", "nickname-supported",
@@ -224,7 +224,7 @@
 	 * [property@PurpleChannelJoinDetails:password-supported] before displaying
 	 * this option to the user.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_PASSWORD] = g_param_spec_string(
 		"password", "password",
@@ -237,7 +237,7 @@
 	 *
 	 * Whether or not the protocol supports channel passwords.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_PASSWORD_SUPPORTED] = g_param_spec_boolean(
 		"password-supported", "password-supported",
diff --git a/libpurple/purplechatconversation.h b/libpurple/purplechatconversation.h
--- a/libpurple/purplechatconversation.h
+++ b/libpurple/purplechatconversation.h
@@ -70,7 +70,7 @@
  *
  * Returns: The #GType for the ChatConversation object.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GType purple_chat_conversation_get_type(void);
@@ -85,7 +85,7 @@
  *
  * Returns: The new conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_chat_conversation_new(PurpleAccount *account, const gchar *name);
@@ -101,7 +101,7 @@
  *          The list of users. Use g_list_free() when done
  *          using the list.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_chat_conversation_get_users(PurpleChatConversation *chat);
@@ -114,7 +114,7 @@
  *
  * Returns: The count of users in the chat room.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 guint purple_chat_conversation_get_users_count(PurpleChatConversation *chat);
@@ -127,7 +127,7 @@
  *
  * Sets the chat room's topic.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_set_topic(PurpleChatConversation *chat, const gchar *who, const gchar *topic);
@@ -140,7 +140,7 @@
  *
  * Returns: The chat's topic.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_conversation_get_topic(PurpleChatConversation *chat);
@@ -153,7 +153,7 @@
  *
  * Returns: Who set the topic.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_conversation_get_topic_who(PurpleChatConversation *chat);
@@ -165,7 +165,7 @@
  *
  * Sets the chat room's ID.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_set_id(PurpleChatConversation *chat, gint id);
@@ -178,7 +178,7 @@
  *
  * Returns: The ID.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gint purple_chat_conversation_get_id(PurpleChatConversation *chat);
@@ -193,7 +193,7 @@
  *
  * Adds a user to a chat.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_add_user(PurpleChatConversation *chat, const gchar *user, const gchar *extra_msg, PurpleChatUserFlags flags, gboolean new_arrival);
@@ -218,7 +218,7 @@
  * The data is copied from @users, @extra_msgs, and @flags, so it is up to
  * the caller to free this list after calling this function.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_add_users(PurpleChatConversation *chat, GList *users, GList *extra_msgs, GList *flags, gboolean new_arrivals);
@@ -231,7 +231,7 @@
  *
  * Renames a user in a chat.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_rename_user(PurpleChatConversation *chat, const gchar *old_user, const gchar *new_user);
@@ -246,7 +246,7 @@
  *
  * It is up to the developer to free this list after calling this function.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_remove_user(PurpleChatConversation *chat, const gchar *user, const gchar *reason);
@@ -259,7 +259,7 @@
  *
  * Removes a list of users from a chat, optionally with a single reason.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_remove_users(PurpleChatConversation *chat, GList *users, const gchar *reason);
@@ -273,7 +273,7 @@
  *
  * Returns: %TRUE if the user is in the chat, %FALSE if not
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_chat_conversation_has_user(PurpleChatConversation *chat, const gchar *user);
@@ -284,7 +284,7 @@
  *
  * Clears all users from a chat.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_clear_users(PurpleChatConversation *chat);
@@ -296,7 +296,7 @@
  *
  * Sets your nickname (used for highlighting) for a chat.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_set_nick(PurpleChatConversation *chat, const gchar *nick);
@@ -309,7 +309,7 @@
  *
  * Returns: The nick.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_conversation_get_nick(PurpleChatConversation *chat);
@@ -321,7 +321,7 @@
  * Lets the core know we left a chat, without destroying it.
  * Called from purple_serv_got_chat_left().
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_leave(PurpleChatConversation *chat);
@@ -336,7 +336,7 @@
  * Returns: (transfer none): The #PurpleChatUser with the name referred by
  *          @name.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleChatUser *purple_chat_conversation_find_user(PurpleChatConversation *chat, const gchar *name);
@@ -353,7 +353,7 @@
  * The user will be prompted to enter the user's name or a message if one is
  * not given.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_conversation_invite_user(PurpleChatConversation *chat, const gchar *user, const gchar *message, gboolean confirm);
@@ -366,7 +366,7 @@
  *
  * Returns: %TRUE if we left the chat already, %FALSE if we're still there.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_chat_conversation_has_left(PurpleChatConversation *chat);
diff --git a/libpurple/purplechatconversation.c b/libpurple/purplechatconversation.c
--- a/libpurple/purplechatconversation.c
+++ b/libpurple/purplechatconversation.c
@@ -289,7 +289,7 @@
 	 *
 	 * Emitted after a @username has joined the conversation.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_USER_JOINED] = g_signal_new_class_handler(
 		"user-joined",
@@ -313,7 +313,7 @@
 	 *
 	 * Emitted after a @username has left the conversation.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_USER_LEFT] = g_signal_new_class_handler(
 		"user-left",
diff --git a/libpurple/purplechatuser.h b/libpurple/purplechatuser.h
--- a/libpurple/purplechatuser.h
+++ b/libpurple/purplechatuser.h
@@ -37,7 +37,7 @@
  *
  * Structure representing a chat user instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -52,7 +52,7 @@
  *
  * Flags applicable to users in Chats.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 typedef enum /*< flags >*/
 {
@@ -86,7 +86,7 @@
  *
  * Returns: The new chat user
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleChatUser *purple_chat_user_new(PurpleChatConversation *chat,
@@ -101,7 +101,7 @@
  *
  * Set the chat conversation associated with this chat user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_user_set_chat(PurpleChatUser *chat_user,
@@ -115,7 +115,7 @@
  *
  * Returns: (transfer full): The chat conversation that the buddy belongs to.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleChatConversation *purple_chat_user_get_chat(PurpleChatUser *chat_user);
@@ -128,7 +128,7 @@
  *
  * Returns: The alias of the chat user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_user_get_alias(PurpleChatUser *chat_user);
@@ -141,7 +141,7 @@
  *
  * Returns: The name of the chat user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_chat_user_get_name(PurpleChatUser *chat_user);
@@ -153,7 +153,7 @@
  *
  * Set the flags of a chat user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_chat_user_set_flags(PurpleChatUser *chat_user,
@@ -167,7 +167,7 @@
  *
  * Returns: The flags of the chat user.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleChatUserFlags purple_chat_user_get_flags(PurpleChatUser *chat_user);
@@ -180,7 +180,7 @@
  *
  * Returns: %TRUE if the chat user is on the buddy list.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_chat_user_is_buddy(PurpleChatUser *chat_user);
@@ -195,7 +195,7 @@
  *
  * Returns: The sorting order of @a and @b.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gint purple_chat_user_compare(PurpleChatUser *a, PurpleChatUser *b);
diff --git a/libpurple/purpleconnectionerrorinfo.h b/libpurple/purpleconnectionerrorinfo.h
--- a/libpurple/purpleconnectionerrorinfo.h
+++ b/libpurple/purpleconnectionerrorinfo.h
@@ -121,7 +121,7 @@
  *
  * Holds the type of an error along with its description.
  *
- * Since: 2.3.0
+ * Since: 2.3
  */
 PURPLE_AVAILABLE_TYPE_IN_2_3
 typedef struct
@@ -145,7 +145,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConnectionErrorInfo *purple_connection_error_info_new(PurpleConnectionError type, const gchar *description);
@@ -158,7 +158,7 @@
  *
  * Returns: (transfer full): A new copy of @info.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConnectionErrorInfo *purple_connection_error_info_copy(PurpleConnectionErrorInfo *info);
@@ -169,7 +169,7 @@
  *
  * Frees the memory associated with @info.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_connection_error_info_free(PurpleConnectionErrorInfo *info);
diff --git a/libpurple/purplecontact.h b/libpurple/purplecontact.h
--- a/libpurple/purplecontact.h
+++ b/libpurple/purplecontact.h
@@ -65,7 +65,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleContact *purple_contact_new(PurpleAccount *account, const gchar *id);
@@ -79,7 +79,7 @@
  * Returns: (transfer none): The [class@Purple.Account] that @contact belongs
  *          to.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAccount *purple_contact_get_account(PurpleContact *contact);
@@ -98,7 +98,7 @@
  *
  * Returns: (transfer none) (nullable): The conversation or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_contact_find_dm(PurpleContact *contact, gboolean create);
diff --git a/libpurple/purplecontact.c b/libpurple/purplecontact.c
--- a/libpurple/purplecontact.c
+++ b/libpurple/purplecontact.c
@@ -113,7 +113,7 @@
 	 *
 	 * The account that this contact belongs to.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ACCOUNT] = g_param_spec_object(
 		"account", "account",
diff --git a/libpurple/purpleconversation.h b/libpurple/purpleconversation.h
--- a/libpurple/purpleconversation.h
+++ b/libpurple/purpleconversation.h
@@ -111,7 +111,7 @@
  * ways we can't imagine right now. If you come up with one in the future,
  * please let us know!
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef enum {
@@ -134,7 +134,7 @@
  *       conversation is the only one contained in the parent window, that
  *       window is also destroyed.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 
 /**
@@ -168,7 +168,7 @@
  * Present a conversation to the user. This allows core code to initiate a
  * conversation by displaying the IM dialog.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_conversation_present(PurpleConversation *conv);
@@ -180,7 +180,7 @@
  *
  * Sets the specified conversation's UI operations structure.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_conversation_set_ui_ops(PurpleConversation *conv, PurpleConversationUiOps *ops);
@@ -193,7 +193,7 @@
  *
  * Returns: The operations structure.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleConversationUiOps *purple_conversation_get_ui_ops(PurpleConversation *conv);
@@ -206,7 +206,7 @@
  *
  * Returns: (nullable): The id of @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_conversation_get_id(PurpleConversation *conversation);
@@ -219,7 +219,7 @@
  *
  * Returns: The [enum@ConversationType] of @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversationType purple_conversation_get_conversation_type(PurpleConversation *conversation);
@@ -234,7 +234,7 @@
  * > Note this only for the internal representation in libpurple and the
  * protocol will not be told to change the type.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_conversation_type(PurpleConversation *conversation, PurpleConversationType type);
@@ -250,7 +250,7 @@
  *
  * Returns: (transfer none): The conversation's purple_account.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleAccount *purple_conversation_get_account(PurpleConversation *conv);
@@ -263,7 +263,7 @@
  *
  * Returns: (transfer none): The conversation's purple_connection.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConnection *purple_conversation_get_connection(PurpleConversation *conv);
@@ -275,7 +275,7 @@
  *
  * Sets the specified conversation's title.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_conversation_set_title(PurpleConversation *conv, const gchar *title);
@@ -288,7 +288,7 @@
  *
  * Returns: The title.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const char *purple_conversation_get_title(PurpleConversation *conv);
@@ -302,7 +302,7 @@
  * This function takes OPT_IM_ALIAS_TAB into account, as well as the
  * user's alias.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_conversation_autoset_title(PurpleConversation *conv);
@@ -314,7 +314,7 @@
  *
  * Sets the specified conversation's name.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_conversation_set_name(PurpleConversation *conv, const gchar *name);
@@ -328,7 +328,7 @@
  * Returns: The conversation's name. If the conversation is an IM with a
  *          PurpleBuddy, then it's the name of the PurpleBuddy.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 const char *purple_conversation_get_name(PurpleConversation *conv);
@@ -340,7 +340,7 @@
  *
  * Writes to a chat or an IM.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_write_message(PurpleConversation *conv, PurpleMessage *msg);
@@ -353,7 +353,7 @@
  *
  * Writes a system message to a chat or an IM.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_write_system_message(PurpleConversation *conv, const gchar *message, PurpleMessageFlags flags);
@@ -366,7 +366,7 @@
  * Sends a message to this conversation. This function calls
  * purple_conversation_send_with_flags() with no additional flags.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_send(PurpleConversation *conv, const gchar *message);
@@ -380,7 +380,7 @@
  *
  * Sends a message to this conversation with specified flags.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_send_with_flags(PurpleConversation *conv, const gchar *message, PurpleMessageFlags flags);
@@ -392,7 +392,7 @@
  *
  * Set the features as supported for the given conversation.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_conversation_set_features(PurpleConversation *conv, PurpleConnectionFlags features);
@@ -403,7 +403,7 @@
  *
  * Get the features supported by the given conversation.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 PurpleConnectionFlags purple_conversation_get_features(PurpleConversation *conv);
@@ -417,7 +417,7 @@
  * Returns: %TRUE if the conversation has focus, %FALSE if
  * it does not or the UI does not have a concept of conversation focus
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 gboolean purple_conversation_has_focus(PurpleConversation *conv);
@@ -429,7 +429,7 @@
  *
  * Updates the visual status and UI of a conversation.
  *
- * Since: 2.0.0
+ * Since: 2.0
  */
 PURPLE_AVAILABLE_IN_ALL
 void purple_conversation_update(PurpleConversation *conv, PurpleConversationUpdateType type);
@@ -447,7 +447,7 @@
  * The confirmation ensures that the user isn't sending a
  * message by mistake.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_send_confirm(PurpleConversation *conv, const gchar *message);
@@ -462,7 +462,7 @@
  *          items for a conversation, as harvested by the chat-extended-menu
  *          signal.
  *
- * Since: 2.1.0
+ * Since: 2.1
  */
 PURPLE_AVAILABLE_IN_2_1
 GList * purple_conversation_get_extended_menu(PurpleConversation *conv);
@@ -482,7 +482,7 @@
  *
  * Returns:        TRUE if the error was presented, else FALSE
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_present_error(const gchar *who, PurpleAccount *account, const gchar *what);
@@ -495,7 +495,7 @@
  *
  * Returns: %TRUE if age restricted, otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_get_age_restricted(PurpleConversation *conversation);
@@ -508,7 +508,7 @@
  * Sets whether or not @conversation is age restricted to the value of
  * @age_restricted.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_age_restricted(PurpleConversation *conversation, gboolean age_restricted);
@@ -521,7 +521,7 @@
  *
  * Returns: The description of @conversation or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_conversation_get_description(PurpleConversation *conversation);
@@ -533,7 +533,7 @@
  *
  * Sets the description of @conversation to @description.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_description(PurpleConversation *conversation, const char *description);
@@ -546,7 +546,7 @@
  *
  * Returns: (nullable): The topic of @conversation or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_conversation_get_topic(PurpleConversation *conversation);
@@ -558,7 +558,7 @@
  *
  * Sets the topic of @conversation to @topic.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_topic(PurpleConversation *conversation, const char *topic);
@@ -576,7 +576,7 @@
  * [method@Conversation.set_topic_author], and
  * [method@Conversation.set_topic_updated].
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_topic_full(PurpleConversation *conversation, const char *topic, PurpleContactInfo *author, GDateTime *updated);
@@ -589,7 +589,7 @@
  *
  * Returns: (transfer none) (nullable): The author of the topic or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_conversation_get_topic_author(PurpleConversation *conversation);
@@ -601,7 +601,7 @@
  *
  * Sets the author of the topic for @conversation to @author.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_topic_author(PurpleConversation *conversation, PurpleContactInfo *author);
@@ -615,7 +615,7 @@
  * Returns: (transfer none) (nullable): The last time the topic was updated or
  *          %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_conversation_get_topic_updated(PurpleConversation *conversation);
@@ -627,7 +627,7 @@
  *
  * Sets the time that the topic was lasted updated for @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_topic_updated(PurpleConversation *conversation, GDateTime *updated);
@@ -640,7 +640,7 @@
  *
  * Returns: (nullable): The nickname for the user in @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const char *purple_conversation_get_user_nickname(PurpleConversation *conversation);
@@ -652,7 +652,7 @@
  *
  * Sets the user's nickname in @conversation to @nickname.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_user_nickname(PurpleConversation *conversation, const char *nickname);
@@ -666,7 +666,7 @@
  * Returns: %TRUE if @conversation has been set a as a favorite, otherwise
  *          %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_get_favorite(PurpleConversation *conversation);
@@ -678,7 +678,7 @@
  *
  * Sets whether or not @conversation is a favorite to @favorite.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_favorite(PurpleConversation *conversation, gboolean favorite);
@@ -691,7 +691,7 @@
  *
  * Returns: (transfer none) (nullable): The creation time of @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GDateTime *purple_conversation_get_created_on(PurpleConversation *conversation);
@@ -703,7 +703,7 @@
  *
  * Sets the creation time of @conversation to @created_on.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_created_on(PurpleConversation *conversation, GDateTime *created_on);
@@ -716,7 +716,7 @@
  *
  * Returns: (transfer none): The creator or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_conversation_get_creator(PurpleConversation *conversation);
@@ -728,7 +728,7 @@
  *
  * Sets the creator of @conversation to @creator.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_creator(PurpleConversation *conversation, PurpleContactInfo *creator);
@@ -744,7 +744,7 @@
  *
  * Returns: %TRUE if messages can be sent and received from @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_get_online(PurpleConversation *conversation);
@@ -757,7 +757,7 @@
  * Sets whether or not the conversation is online, or able to send and receive
  * messages.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_online(PurpleConversation *conversation, gboolean online);
@@ -775,7 +775,7 @@
  *
  * Returns: %TRUE if @conversation is federated otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_get_federated(PurpleConversation *conversation);
@@ -788,7 +788,7 @@
  *
  * Returns: (transfer none): The tags from @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_conversation_get_tags(PurpleConversation *conversation);
@@ -801,7 +801,7 @@
  *
  * Returns: (transfer none): The members in @conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_conversation_get_members(PurpleConversation *conversation);
@@ -819,7 +819,7 @@
  *
  * Returns: %TRUE if @info is in @conversation otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_has_member(PurpleConversation *conversation, PurpleContactInfo *info, guint *position);
@@ -835,7 +835,7 @@
  * Returns: (transfer none) (nullable): The [class@Purple.ConversationMember]
  *          if found or %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversationMember *purple_conversation_find_member(PurpleConversation *conversation, PurpleContactInfo *info);
@@ -866,7 +866,7 @@
  * Returns: (transfer none): The [class@Purple.ConversationMember] that was
  *          created or found.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversationMember *purple_conversation_add_member(PurpleConversation *conversation, PurpleContactInfo *info, gboolean announce, const char *message);
@@ -889,7 +889,7 @@
  * Returns: %TRUE if @member was found and removed from @conversation,
  *          otherwise %FALSE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_remove_member(PurpleConversation *conversation, PurpleContactInfo *info, gboolean announce, const char *message);
@@ -902,7 +902,7 @@
  *
  * Returns: (transfer none): The list of messages.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GListModel *purple_conversation_get_messages(PurpleConversation *conversation);
@@ -918,7 +918,7 @@
  *
  * Returns: (transfer none) (nullable): The avatar for the conversation.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleAvatar *purple_conversation_get_avatar(PurpleConversation *conversation);
@@ -933,7 +933,7 @@
  * > Note: Not all protocols support this and user interfaces generally use
  * the avatar of a contact info for a direct message.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_set_avatar(PurpleConversation *conversation, PurpleAvatar *avatar);
diff --git a/libpurple/purpleconversation.c b/libpurple/purpleconversation.c
--- a/libpurple/purpleconversation.c
+++ b/libpurple/purpleconversation.c
@@ -677,7 +677,7 @@
 	 * An opaque identifier for this conversation. Generally speaking this is
 	 * protocol dependent and should only be used as a unique identifier.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ID] = g_param_spec_string(
 		"id", "id",
@@ -691,7 +691,7 @@
 	 * A type hint for the conversation. This may be useful for protocols, but
 	 * libpurple treats all conversations the same.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TYPE] = g_param_spec_enum(
 		"type", "type",
@@ -714,7 +714,7 @@
 	 * Not all protocols support this and most user interfaces will use the
 	 * avatar of the remote contact for direct messages.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_AVATAR] = g_param_spec_object(
 		"avatar", "avatar",
@@ -748,7 +748,7 @@
 	 *
 	 * This is typically set only by a protocol plugin.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_AGE_RESTRICTED] = g_param_spec_boolean(
 		"age-restricted", "age-restricted",
@@ -765,7 +765,7 @@
 	 *
 	 * This is typically set only by a protocol plugin.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_DESCRIPTION] = g_param_spec_string(
 		"description", "description",
@@ -781,7 +781,7 @@
 	 * This is normally controlled by the protocol plugin and often times
 	 * requires permission for the user to set.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TOPIC] = g_param_spec_string(
 		"topic", "topic",
@@ -796,7 +796,7 @@
 	 *
 	 * This should typically only be set by a protocol plugin.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TOPIC_AUTHOR] = g_param_spec_object(
 		"topic-author", "topic-author",
@@ -811,7 +811,7 @@
 	 *
 	 * This should typically only be set by a protocol plugin.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TOPIC_UPDATED] = g_param_spec_boxed(
 		"topic-updated", "topic-updated",
@@ -828,7 +828,7 @@
 	 * contact information when joining a conversation. This field holds that
 	 * value.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_USER_NICKNAME] = g_param_spec_string(
 		"user-nickname", "user-nickname",
@@ -841,7 +841,7 @@
 	 *
 	 * Whether or not the conversation has been marked as favorite by the user.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_FAVORITE] = g_param_spec_boolean(
 		"favorite", "favorite",
@@ -857,7 +857,7 @@
 	 *
 	 * This should typically only be set by a protocol plugin.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_CREATED_ON] = g_param_spec_boxed(
 		"created-on", "created-on",
@@ -872,7 +872,7 @@
 	 *
 	 * This should typically only be set by a protocol plugin.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_CREATOR] = g_param_spec_object(
 		"creator", "creator",
@@ -894,7 +894,7 @@
 	 *
 	 * See also [property@Conversation:federated].
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ONLINE] = g_param_spec_boolean(
 		"online", "online",
@@ -916,7 +916,7 @@
 	 * responsibility of the protocol to manage the online property in this
 	 * case.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_FEDERATED] = g_param_spec_boolean(
 		"federated", "federated",
@@ -929,7 +929,7 @@
 	 *
 	 * [class@Tags] for the conversation.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TAGS] = g_param_spec_object(
 		"tags", "tags",
@@ -942,7 +942,7 @@
 	 *
 	 * The members that are currently in this conversation.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_MEMBERS] = g_param_spec_object(
 		"members", "members",
@@ -955,7 +955,7 @@
 	 *
 	 * A [iface.Gio.ListModel] of all the messages in this conversation.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_MESSAGES] = g_param_spec_object(
 		"messages", "messages",
@@ -974,7 +974,7 @@
 	 *
 	 * Emitted when a new member is added to this conversation.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_MEMBER_ADDED] = g_signal_new_class_handler(
 		"member-added",
@@ -999,7 +999,7 @@
 	 *
 	 * Emitted when member is removed from this conversation.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_MEMBER_REMOVED] = g_signal_new_class_handler(
 		"member-removed",
diff --git a/libpurple/purpleconversationmanager.h b/libpurple/purpleconversationmanager.h
--- a/libpurple/purpleconversationmanager.h
+++ b/libpurple/purpleconversationmanager.h
@@ -42,7 +42,7 @@
  * #PurpleConversationManager keeps track of all #PurpleConversation's inside
  * of libpurple and allows searching of them.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 G_DECLARE_FINAL_TYPE(PurpleConversationManager, purple_conversation_manager,
@@ -56,7 +56,7 @@
  * A function to be used as a callback with
  * purple_conversation_manager_foreach().
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleConversationManagerForeachFunc)(PurpleConversation *conversation, gpointer data);
@@ -69,7 +69,7 @@
  *
  * Returns: (transfer none): The default #PurpleConversationManager instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversationManager *purple_conversation_manager_get_default(void);
@@ -83,7 +83,7 @@
  *
  * Returns: %TRUE if @conversation was not yet registered.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_manager_register(PurpleConversationManager *manager, PurpleConversation *conversation);
@@ -97,7 +97,7 @@
  *
  * Returns: %TRUE if @conversation was found and unregistered.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_manager_unregister(PurpleConversationManager *manager, PurpleConversation *conversation);
@@ -112,7 +112,7 @@
  * Returns: %TRUE if @conversation is registered with @manager, %FALSE
  *          otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_conversation_manager_is_registered(PurpleConversationManager *manager, PurpleConversation *conversation);
@@ -125,7 +125,7 @@
  *
  * Calls @func for each #PurpleConversation that @manager knows about.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_manager_foreach(PurpleConversationManager *manager, PurpleConversationManagerForeachFunc func, gpointer data);
@@ -139,7 +139,7 @@
  * Returns: (transfer container) (element-type PurpleConversation): A list of
  *          all of the registered conversations.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GList *purple_conversation_manager_get_all(PurpleConversationManager *manager);
@@ -157,7 +157,7 @@
  *
  * Returns: (transfer none): The #PurpleConversation if found, otherwise %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find(PurpleConversationManager *manager, PurpleAccount *account, const gchar *name);
@@ -173,7 +173,7 @@
  *
  * Returns: (transfer none): The #PurpleConversation if found, otherwise %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find_im(PurpleConversationManager *manager, PurpleAccount *account, const gchar *name);
@@ -189,7 +189,7 @@
  *
  * Returns: (transfer none): The #PurpleConversation if found, otherwise %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find_chat(PurpleConversationManager *manager, PurpleAccount *account, const gchar *name);
@@ -207,7 +207,7 @@
  *
  * Returns: (transfer none): The #PurpleConversation if found, otherwise %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find_chat_by_id(PurpleConversationManager *manager, PurpleAccount *account, gint id);
@@ -223,7 +223,7 @@
  * Returns: (transfer none) (nullable): The [class@PurpleConversation] if
  *          found, otherwise %NULL.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversation *purple_conversation_manager_find_with_id(PurpleConversationManager *manager, PurpleAccount *account, const char *id);
diff --git a/libpurple/purpleconversationmanager.c b/libpurple/purpleconversationmanager.c
--- a/libpurple/purpleconversationmanager.c
+++ b/libpurple/purpleconversationmanager.c
@@ -179,7 +179,7 @@
 	 *
 	 * Emitted after @conversation has been registered with @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_REGISTERED] = g_signal_new_class_handler(
 		"registered",
@@ -200,7 +200,7 @@
 	 *
 	 * Emitted after @conversation has been unregistered from @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_UNREGISTERED] = g_signal_new_class_handler(
 		"unregistered",
@@ -228,7 +228,7 @@
 	 * something like `conversation-changed::title` and your callback will only
 	 * be called when [property@Conversation:title] has been changed.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_CONVERSATION_CHANGED] = g_signal_new_class_handler(
 		"conversation-changed",
diff --git a/libpurple/purpleconversationmember.h b/libpurple/purpleconversationmember.h
--- a/libpurple/purpleconversationmember.h
+++ b/libpurple/purpleconversationmember.h
@@ -55,7 +55,7 @@
  * should not need to hold onto these and will have the
  * [class@Purple.Conversation] when you need to look it up.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -68,7 +68,7 @@
  *
  * Returns: (transfer full): The new instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleConversationMember *purple_conversation_member_new(PurpleContactInfo *info);
@@ -82,7 +82,7 @@
  * Returns: (transfer none): The [class@Purple.ContactInfo] for
  *          @conversation_member.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleContactInfo *purple_conversation_member_get_contact_info(PurpleConversationMember *conversation_member);
@@ -95,7 +95,7 @@
  *
  * Returns: (transfer none): The [class@Purple.Tags] for @conversation_member.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleTags *purple_conversation_member_get_tags(PurpleConversationMember *conversation_member);
@@ -108,7 +108,7 @@
  *
  * Returns: The current typing state for @conversation_member.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleTypingState purple_conversation_member_get_typing_state(PurpleConversationMember *member);
@@ -124,7 +124,7 @@
  * If @seconds is greater than %0, a timeout will be added for @seconds to
  * reset the state to none.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_conversation_member_set_typing_state(PurpleConversationMember *member, PurpleTypingState state, guint seconds);
diff --git a/libpurple/purpleconversationmember.c b/libpurple/purpleconversationmember.c
--- a/libpurple/purpleconversationmember.c
+++ b/libpurple/purpleconversationmember.c
@@ -165,7 +165,7 @@
 	 *
 	 * The contact info that this member is for.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_CONTACT_INFO] = g_param_spec_object(
 		"contact-info", "contact-info",
@@ -178,7 +178,7 @@
 	 *
 	 * The [class@Purple.Tags] instance for this member.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TAGS] = g_param_spec_object(
 		"tags", "tags",
@@ -191,7 +191,7 @@
 	 *
 	 * The [enum@Purple.TypingState] for this member.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_TYPING_STATE] = g_param_spec_enum(
 		"typing-state", "typing-state",
diff --git a/libpurple/purpleconversationuiops.h b/libpurple/purpleconversationuiops.h
--- a/libpurple/purpleconversationuiops.h
+++ b/libpurple/purpleconversationuiops.h
@@ -125,7 +125,7 @@
  *
  * Returns: The #GType for the #PurpleConversationUiOps boxed structure.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GType purple_conversation_ui_ops_get_type(void);
diff --git a/libpurple/purplecredentialmanager.h b/libpurple/purplecredentialmanager.h
--- a/libpurple/purplecredentialmanager.h
+++ b/libpurple/purplecredentialmanager.h
@@ -41,7 +41,7 @@
  *
  * A #GError domain for errors from #PurpleCredentialManager.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 #define PURPLE_CREDENTIAL_MANAGER_DOMAIN \
 	g_quark_from_static_string("purple-credential-manager") \
@@ -63,7 +63,7 @@
  * Once a provider is selected, all credential access will be directed to that
  * provider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 /**
@@ -73,7 +73,7 @@
  *
  * A function to be used as a callback with purple_credential_manager_foreach().
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_TYPE_IN_3_0
 typedef void (*PurpleCredentialManagerForeachFunc)(PurpleCredentialProvider *provider, gpointer data);
@@ -85,7 +85,7 @@
  *
  * Returns: (transfer none): The default #PurpleCredentialManager instance.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleCredentialManager *purple_credential_manager_get_default(void);
@@ -101,7 +101,7 @@
  * Returns: %TRUE if @provider was successfully registered with @manager, %FALSE
  *          otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_register(PurpleCredentialManager *manager, PurpleCredentialProvider *provider, GError **error);
@@ -117,7 +117,7 @@
  * Returns: %TRUE if @provider was successfully unregistered from @provider,
  *          %FALSE otherwise.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_unregister(PurpleCredentialManager *manager, PurpleCredentialProvider *provider, GError **error);
@@ -139,7 +139,7 @@
  *
  * Returns: %TRUE on success or %FALSE with @error set on failure.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_set_active(PurpleCredentialManager *manager, const gchar *id, GError **error);
@@ -153,7 +153,7 @@
  *
  * Returns: (transfer none): The active #PurpleCredentialProvider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 PurpleCredentialProvider *purple_credential_manager_get_active(PurpleCredentialManager *manager);
@@ -170,7 +170,7 @@
  * Reads the password for @account using the active #PurpleCredentialProvider of
  * @manager.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_credential_manager_read_password_async(PurpleCredentialManager *manager, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -187,7 +187,7 @@
  * Returns: (transfer full): The password or %NULL if successful, otherwise
  *                           %NULL with @error set on failure.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gchar *purple_credential_manager_read_password_finish(PurpleCredentialManager *manager, GAsyncResult *result, GError **error);
@@ -205,7 +205,7 @@
  * Writes @password for @account to the active #PurpleCredentialProvider of
  * @manager.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -222,7 +222,7 @@
  * Returns: %TRUE if the password was written successfully, otherwise %FALSE
  *          with @error set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_write_password_finish(PurpleCredentialManager *manager, GAsyncResult *result, GError **error);
@@ -239,7 +239,7 @@
  * Clears the password for @account from the active #PurpleCredentialProvider
  * of @manager.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_credential_manager_clear_password_async(PurpleCredentialManager *manager, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -257,7 +257,7 @@
  * Returns: %TRUE if the password didn't exist or was cleared successfully,
  *          otherwise %FALSE with @error set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_manager_clear_password_finish(PurpleCredentialManager *manager, GAsyncResult *result, GError **error);
@@ -270,7 +270,7 @@
  *
  * Calls @func for each #PurpleCredentialProvider that @manager knows about.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_credential_manager_foreach(PurpleCredentialManager *manager, PurpleCredentialManagerForeachFunc func, gpointer data);
diff --git a/libpurple/purplecredentialmanager.c b/libpurple/purplecredentialmanager.c
--- a/libpurple/purplecredentialmanager.c
+++ b/libpurple/purplecredentialmanager.c
@@ -200,7 +200,7 @@
 	 *
 	 * Emitted after @provider has been registered in @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_REGISTERED] = g_signal_new_class_handler(
 		"registered",
@@ -221,7 +221,7 @@
 	 *
 	 * Emitted after @provider has been unregistered from @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_UNREGISTERED] = g_signal_new_class_handler(
 		"unregistered",
@@ -243,7 +243,7 @@
 	 *
 	 * Emitted after @provider has become the active provider for @manager.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	signals[SIG_ACTIVE_CHANGED] = g_signal_new_class_handler(
 		"active-changed",
diff --git a/libpurple/purplecredentialprovider.h b/libpurple/purplecredentialprovider.h
--- a/libpurple/purplecredentialprovider.h
+++ b/libpurple/purplecredentialprovider.h
@@ -41,7 +41,7 @@
  *
  * A #GError domain for errors from #PurpleCredentialProviders.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 #define PURPLE_CREDENTIAL_PROVIDER_DOMAIN \
 	g_quark_from_static_string("purple-credential-provider") \
@@ -55,7 +55,7 @@
  * libpurple ships with plugins for libsecret, macOS Keychain Access, KWallet,
  * and the Windows Credentials store by subclassing #PurpleCredentialProvider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 
 #define PURPLE_TYPE_CREDENTIAL_PROVIDER (purple_credential_provider_get_type())
@@ -78,7 +78,7 @@
  * #PurpleCredentialProviderClass defines the interface for interacting with
  * credential providers like libsecret, kwallet, etc.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 struct _PurpleCredentialProviderClass {
 	/*< private >*/
@@ -111,7 +111,7 @@
  *
  * Returns: The identifier of @provider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_credential_provider_get_id(PurpleCredentialProvider *provider);
@@ -124,7 +124,7 @@
  *
  * Returns: The name of @provider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_credential_provider_get_name(PurpleCredentialProvider *provider);
@@ -138,7 +138,7 @@
  *
  * Returns: The description of @provider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 const gchar *purple_credential_provider_get_description(PurpleCredentialProvider *provider);
@@ -154,7 +154,7 @@
  *
  * Returns: %FALSE on error, otherwise %TRUE.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_provider_is_valid(PurpleCredentialProvider *provider, GError **error);
@@ -170,7 +170,7 @@
  *
  * Reads the password for @account from @provider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_credential_provider_read_password_async(PurpleCredentialProvider *provider, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -187,7 +187,7 @@
  * Returns: (transfer full): The password or %NULL if successful, otherwise
  *                           %NULL with @error set on failure.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gchar *purple_credential_provider_read_password_finish(PurpleCredentialProvider *provider, GAsyncResult *result, GError **error);
@@ -204,7 +204,7 @@
  *
  * Writes @password for @account to @provider.
  *
- * Since: 3.0.0
+ * Since: 3.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);
@@ -222,7 +222,7 @@
  * Returns: %TRUE if the password was written successfully, otherwise %FALSE
  *          with @error set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_provider_write_password_finish(PurpleCredentialProvider *provider, GAsyncResult *result, GError **error);
@@ -238,7 +238,7 @@
  *
  * Clears the password for @account from @provider.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 void purple_credential_provider_clear_password_async(PurpleCredentialProvider *provider, PurpleAccount *account, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer data);
@@ -256,7 +256,7 @@
  * Returns: %TRUE if the password didn't exist or was cleared successfully,
  *          otherwise %FALSE with @error set.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 gboolean purple_credential_provider_clear_password_finish(PurpleCredentialProvider *provider, GAsyncResult *result, GError **error);
@@ -270,7 +270,7 @@
  * Returns: (transfer none): The settings for @provider or %NULL if @provider
  *          doesn't have any settings.
  *
- * Since: 3.0.0
+ * Since: 3.0
  */
 PURPLE_AVAILABLE_IN_3_0
 GSettings *purple_credential_provider_get_settings(PurpleCredentialProvider *provider);
diff --git a/libpurple/purplecredentialprovider.c b/libpurple/purplecredentialprovider.c
--- a/libpurple/purplecredentialprovider.c
+++ b/libpurple/purplecredentialprovider.c
@@ -203,7 +203,7 @@
 	 * The ID of the provider.  Used for preferences and other things that need
 	 * to address it.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_ID] = g_param_spec_string(
 		"id", "id", "The identifier of the provider",
@@ -216,7 +216,7 @@
 	 *
 	 * The name of the provider which will be displayed to the user.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_NAME] = g_param_spec_string(
 		"name", "name", "The name of the provider",
@@ -229,7 +229,7 @@
 	 *
 	 * The description of the provider which will be displayed to the user.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_DESCRIPTION] = g_param_spec_string(
 		"description", "description", "The description of the provider",
@@ -243,7 +243,7 @@
 	 * The [class@Gio.Settings] used to configure the provider. This may be
 	 * %NULL.
 	 *
-	 * Since: 3.0.0
+	 * Since: 3.0
 	 */
 	properties[PROP_SETTINGS] = g_param_spec_object(
 		"settings", "settings",
