diff --git a/libpurple/account.h b/libpurple/account.h
--- a/libpurple/account.h
+++ b/libpurple/account.h
@@ -658,7 +658,7 @@
 gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy);
 
 /**
- * purple_account_get_current_error:
+ * purple_account_get_error:
  * @account: The account whose error should be retrieved.
  *
  * Get the error that caused the account to be disconnected, or %NULL if the
@@ -669,15 +669,22 @@
  *          pointer is guaranteed to remain valid until the @ref
  *          account-error-changed signal is emitted for @account.
  */
-const PurpleConnectionErrorInfo *purple_account_get_current_error(PurpleAccount *account);
+const PurpleConnectionErrorInfo *purple_account_get_error(PurpleAccount *account);
 
 /**
- * purple_account_clear_current_error:
- * @account: The account whose error state should be cleared.
+ * purple_account_set_error:
+ * @account: The account whose error should be set.
+ * @info: (nullable) (transfer full): The [struct@Purple.ConnectionErrorInfo]
+ *        to set.
  *
- * Clear an account's current error state, resetting it to %NULL.
+ * Sets the error of @account to @info. Note that setting this won't disconnect
+ * the account. This is intended to be called by libpurple when there is a
+ * connection failure, when invalid settings are entered in an account editor,
+ * or similar situations.
+ *
+ * Since: 3.0.0
  */
-void purple_account_clear_current_error(PurpleAccount *account);
+void purple_account_set_error(PurpleAccount *account, PurpleConnectionErrorInfo *info);
 
 /**
  * purple_account_set_require_password:
# HG changeset patch
# Node ID 1201b95b170b
# Parent  b9ef2851fdc0
diff --git a/libpurple/account.c b/libpurple/account.c
--- a/libpurple/account.c
+++ b/libpurple/account.c
@@ -82,7 +82,7 @@
 
 	PurplePresence *presence;     /* Presence.                            */
 
-	PurpleConnectionErrorInfo *current_error;	/* Errors */
+	PurpleConnectionErrorInfo *error;
 	PurpleNotification *error_notification;
 } PurpleAccountPrivate;
 
@@ -400,42 +400,6 @@
 	return purple_connection_get_state(gc);
 }
 
-void
-_purple_account_set_current_error(PurpleAccount *account,
-		PurpleConnectionErrorInfo *new_err)
-{
-	PurpleNotificationManager *manager = NULL;
-
-	g_return_if_fail(PURPLE_IS_ACCOUNT(account));
-
-	if(new_err == account->current_error) {
-		return;
-	}
-
-	g_clear_pointer(&account->current_error,
-	                purple_connection_error_info_free);
-	account->current_error = new_err;
-
-	manager = purple_notification_manager_get_default();
-
-	if(PURPLE_IS_NOTIFICATION(account->error_notification)) {
-		purple_notification_manager_remove(manager,
-		                                   account->error_notification);
-		g_clear_object(&account->error_notification);
-	}
-
-	if(new_err != NULL) {
-		account->error_notification =
-			purple_notification_new_from_connection_error(account, new_err);
-
-		purple_notification_manager_add(manager, account->error_notification);
-	}
-
-	g_object_notify_by_pspec(G_OBJECT(account), properties[PROP_ERROR]);
-
-	purple_accounts_schedule_save();
-}
-
 static void
 purple_account_changed_cb(GObject *obj, GParamSpec *pspec,
                           G_GNUC_UNUSED gpointer data)
@@ -633,7 +597,7 @@
 		purple_xmlnode_insert_child(node, child);
 	}
 
-	child = current_error_to_xmlnode(account->current_error);
+	child = current_error_to_xmlnode(account->error);
 	purple_xmlnode_insert_child(node, child);
 
 	return node;
@@ -676,6 +640,9 @@
 		case PROP_PROXY_INFO:
 			purple_account_set_proxy_info(account, g_value_get_object(value));
 			break;
+		case PROP_ERROR:
+			purple_account_set_error(account, g_value_get_boxed(value));
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
 			break;
@@ -716,6 +683,9 @@
 		case PROP_PROXY_INFO:
 			g_value_set_object(value, purple_account_get_proxy_info(account));
 			break;
+		case PROP_ERROR:
+			g_value_set_boxed(value, purple_account_get_error(account));
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
 			break;
@@ -838,7 +808,7 @@
 
 	g_clear_object(&account->proxy_info);
 
-	g_clear_pointer(&account->current_error, purple_connection_error_info_free);
+	g_clear_pointer(&account->error, purple_connection_error_info_free);
 	g_clear_object(&account->error_notification);
 
 	g_free(account->user_info);
@@ -915,7 +885,11 @@
 	 * PurpleAccount:error:
 	 *
 	 * The [type@GLib.Error] of the account. This is set when an account enters
-	 * an error state and is cleared when a connection attempt is made.
+	 * an error state and is automatically cleared when a connection attempt is
+	 * made.
+	 *
+	 * Setting this will not disconnect an account, but this will be set when
+	 * there is a connection failure.
 	 *
 	 * Since: 3.0.0
 	 */
@@ -1007,7 +981,7 @@
 
 	g_return_if_fail(PURPLE_IS_ACCOUNT(account));
 
-	purple_account_clear_current_error(account);
+	purple_account_set_error(account, NULL);
 
 	username = purple_contact_info_get_username(PURPLE_CONTACT_INFO(account));
 
@@ -1818,17 +1792,47 @@
 }
 
 const PurpleConnectionErrorInfo *
-purple_account_get_current_error(PurpleAccount *account)
+purple_account_get_error(PurpleAccount *account)
 {
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
 
-	return account->current_error;
+	return account->error;
 }
 
 void
-purple_account_clear_current_error(PurpleAccount *account)
+purple_account_set_error(PurpleAccount *account,
+                         PurpleConnectionErrorInfo *info)
 {
-	_purple_account_set_current_error(account, NULL);
+	PurpleNotificationManager *manager = NULL;
+
+	g_return_if_fail(PURPLE_IS_ACCOUNT(account));
+
+	if(info == account->error) {
+		return;
+	}
+
+	g_clear_pointer(&account->error,
+	                purple_connection_error_info_free);
+	account->error = info;
+
+	manager = purple_notification_manager_get_default();
+
+	if(PURPLE_IS_NOTIFICATION(account->error_notification)) {
+		purple_notification_manager_remove(manager,
+		                                   account->error_notification);
+		g_clear_object(&account->error_notification);
+	}
+
+	if(info != NULL) {
+		account->error_notification =
+			purple_notification_new_from_connection_error(account, info);
+
+		purple_notification_manager_add(manager, account->error_notification);
+	}
+
+	g_object_notify_by_pspec(G_OBJECT(account), properties[PROP_ERROR]);
+
+	purple_accounts_schedule_save();
 }
 
 void
diff --git a/libpurple/accounts.c b/libpurple/accounts.c
--- a/libpurple/accounts.c
+++ b/libpurple/accounts.c
@@ -298,7 +298,7 @@
 	                                                 (description != NULL) ? description : "");
 	g_free(description);
 
-	_purple_account_set_current_error(account, current_error);
+	purple_account_set_error(account, current_error);
 }
 
 static PurpleAccount *
@@ -635,7 +635,7 @@
 	g_return_if_fail(account != NULL);
 
 	err = purple_connection_error_info_new(type, description);
-	_purple_account_set_current_error(account, err);
+	purple_account_set_error(account, err);
 }
 
 void
diff --git a/libpurple/purpleaccountmanager.c b/libpurple/purpleaccountmanager.c
--- a/libpurple/purpleaccountmanager.c
+++ b/libpurple/purpleaccountmanager.c
@@ -319,7 +319,7 @@
 	/* Clearing the error ensures that account-error-changed is emitted,
 	 * which is the end of the guarantee that the error's pointer is valid.
 	 */
-	purple_account_clear_current_error(account);
+	purple_account_set_error(account, NULL);
 
 	g_signal_emit(manager, signals[SIG_REMOVED], 0, account);
 }
diff --git a/libpurple/purpleprivate.h b/libpurple/purpleprivate.h
--- a/libpurple/purpleprivate.h
+++ b/libpurple/purpleprivate.h
@@ -37,17 +37,6 @@
 G_BEGIN_DECLS
 
 /**
- * _purple_account_set_current_error:
- * @account:  The account to set the error for.
- * @new_err:  The #PurpleConnectionErrorInfo instance representing the
- *                 error.
- *
- * Sets an error for an account.
- */
-void _purple_account_set_current_error(PurpleAccount *account,
-                                       PurpleConnectionErrorInfo *new_err);
-
-/**
  * _purple_account_to_xmlnode:
  * @account:  The account
  *
diff --git a/pidgin/pidginaccountrow.c b/pidgin/pidginaccountrow.c
--- a/pidgin/pidginaccountrow.c
+++ b/pidgin/pidginaccountrow.c
@@ -84,7 +84,7 @@
 		} else {
 			const PurpleConnectionErrorInfo *error_info = NULL;
 
-			error_info = purple_account_get_current_error(row->account);
+			error_info = purple_account_get_error(row->account);
 			if(error_info != NULL) {
 				status = error_info->description;
 				error = TRUE;
