diff --git a/libpurple/purplecredentialprovider.c b/libpurple/purplecredentialprovider.c
--- a/libpurple/purplecredentialprovider.c
+++ b/libpurple/purplecredentialprovider.c
@@ -35,6 +35,79 @@
                                     purple_credential_provider, G_TYPE_OBJECT)
 
 /******************************************************************************
+ * Default Callbacks
+ *****************************************************************************/
+/*< private >
+ * purple_credential_provider_read_password_callback:
+ * @obj: The #PurpleCredentialProvider object.
+ * @result: The #GAsyncResult from the provider.
+ * @data: User data passed to the _async function.
+ *
+ * This #GAsyncReadyCallback is used in the event that the caller did not
+ * specify a callback to purple_credential_provider_read_password_async() so
+ * we can consume the task and free the password and/or #GError from the task.
+ */
+static void
+purple_credential_provider_read_password_callback(GObject *obj,
+                                                  GAsyncResult *result,
+                                                  gpointer data)
+{
+	PurpleCredentialProvider *provider = PURPLE_CREDENTIAL_PROVIDER(obj);
+	gchar *password = NULL;
+
+	password = purple_credential_provider_read_password_finish(provider,
+	                                                           result, NULL);
+
+	g_free(password);
+
+	g_object_unref(G_OBJECT(result));
+}
+
+/*< private >
+ * purple_credential_provider_write_password_callback:
+ * @obj: The #PurpleCredentialProvider object.
+ * @result: The #GAsyncResult from the provider.
+ * @data: User data passed to the _async function.
+ *
+ * This #GAsyncReadyCallback is used in the event that the caller did not
+ * specify a callback to purple_credential_provider_write_password_async() so
+ * we can consume the task and free the #GError, if set, from the task.
+ */
+static void
+purple_credential_provider_write_password_callback(GObject *obj,
+                                                   GAsyncResult *result,
+                                                   gpointer data)
+{
+	PurpleCredentialProvider *provider = PURPLE_CREDENTIAL_PROVIDER(obj);
+
+	purple_credential_provider_write_password_finish(provider, result, NULL);
+
+	g_object_unref(G_OBJECT(result));
+}
+
+/*< private >
+ * purple_credential_provider_clear_password_callback:
+ * @obj: The #PurpleCredentialProvider object.
+ * @result: The #GAsyncResult from the provider.
+ * @data: User data passed to the _async function.
+ *
+ * This #GAsyncReadyCallback is used in the event that the caller did not
+ * specify a callback to purple_credential_provider_clear_password_async() so
+ * we can consume the task and free the #GError, if set, from the task.
+ */
+static void
+purple_credential_provider_clear_password_callback(GObject *obj,
+                                                   GAsyncResult *result,
+                                                   gpointer data)
+{
+	PurpleCredentialProvider *provider = PURPLE_CREDENTIAL_PROVIDER(obj);
+
+	purple_credential_provider_write_password_finish(provider, result, NULL);
+
+	g_object_unref(G_OBJECT(result));
+}
+
+/******************************************************************************
  * Helpers
  *****************************************************************************/
 static void
@@ -242,6 +315,10 @@
 
 	klass = PURPLE_CREDENTIAL_PROVIDER_GET_CLASS(provider);
 	if(klass && klass->read_password_async) {
+		if(callback == NULL) {
+			callback = purple_credential_provider_read_password_callback;
+		}
+
 		klass->read_password_async(provider, account, cancellable, callback,
 		                           data);
 	}
@@ -280,6 +357,10 @@
 
 	klass = PURPLE_CREDENTIAL_PROVIDER_GET_CLASS(provider);
 	if(klass && klass->write_password_async) {
+		if(callback == NULL) {
+			callback = purple_credential_provider_write_password_callback;
+		}
+
 		klass->write_password_async(provider, account, password, cancellable,
 		                            callback, data);
 	}
@@ -317,6 +398,10 @@
 
 	klass = PURPLE_CREDENTIAL_PROVIDER_GET_CLASS(provider);
 	if(klass && klass->clear_password_async) {
+		if(callback == NULL) {
+			callback = purple_credential_provider_clear_password_callback;
+		}
+
 		klass->clear_password_async(provider, account, cancellable, callback,
 		                            data);
 	}
