diff --git a/libpurple/purplehistorymanager.h b/libpurple/purplehistorymanager.h
--- a/libpurple/purplehistorymanager.h
+++ b/libpurple/purplehistorymanager.h
@@ -54,8 +54,8 @@
  * The standard _get_type macro for #PurpleHistoryManager.
  */
 #define PURPLE_TYPE_HISTORY_MANAGER (purple_history_manager_get_type())
-G_DECLARE_DERIVABLE_TYPE(PurpleHistoryManager, purple_history_manager,
-                         PURPLE, HISTORY_MANAGER, GObject)
+G_DECLARE_FINAL_TYPE(PurpleHistoryManager, purple_history_manager, PURPLE,
+                     HISTORY_MANAGER, GObject)
 
 /**
  * PurpleHistoryManager:
@@ -66,29 +66,6 @@
  */
 
 /**
- * PurpleHistoryManagerClass:
- * @active_changed: The default signal handler for when an adapter is changed.
- * @registered: The default signal handler for when an adapter is registered.
- * @unregistered: The default signal handler for when an adapter is unregistered.
- *
- * The class structure for #PurpleHistoryManager.
- *
- * Since: 3.0.0
- */
-struct _PurpleHistoryManagerClass {
-	/*< private >*/
-	GObjectClass parent;
-
-	/*< public >*/
-	void (*active_changed)(PurpleHistoryManager *manager, PurpleHistoryAdapter *previous, PurpleHistoryAdapter *current);
-	gboolean (*registered)(PurpleHistoryManager *manager, PurpleHistoryAdapter *adapter, GError **error);
-	gboolean (*unregistered)(PurpleHistoryManager *manager, PurpleHistoryAdapter *adapter, GError **error);
-
-	/*< private >*/
-	gpointer reserved[4];
-};
-
-/**
  * PurpleHistoryManagerForeachFunc:
  * @adapter: The #PurpleHistoryAdapter instance.
  * @data: User supplied data.
# HG changeset patch
# Node ID 3cec11ea3a5c
# Parent  4be9a7876d35
diff --git a/libpurple/purplehistorymanager.c b/libpurple/purplehistorymanager.c
--- a/libpurple/purplehistorymanager.c
+++ b/libpurple/purplehistorymanager.c
@@ -34,13 +34,14 @@
 };
 static guint signals[N_SIGNALS] = {0, };
 
-typedef struct {
+struct _PurpleHistoryManager {
+	GObject parent;
+
 	GHashTable *adapters;
 	PurpleHistoryAdapter *active_adapter;
-} PurpleHistoryManagerPrivate;
+};
 
-G_DEFINE_TYPE_WITH_PRIVATE(PurpleHistoryManager, purple_history_manager,
-                           G_TYPE_OBJECT);
+G_DEFINE_TYPE(PurpleHistoryManager, purple_history_manager, G_TYPE_OBJECT);
 
 static PurpleHistoryManager *default_manager = NULL;
 
@@ -50,24 +51,18 @@
 static void
 purple_history_manager_finalize(GObject *obj) {
 	PurpleHistoryManager *manager = NULL;
-	PurpleHistoryManagerPrivate *priv = NULL;
 
 	manager = PURPLE_HISTORY_MANAGER(obj);
-	priv = purple_history_manager_get_instance_private(manager);
 
-	g_clear_pointer(&priv->adapters, g_hash_table_destroy);
+	g_clear_pointer(&manager->adapters, g_hash_table_destroy);
 
 	G_OBJECT_CLASS(purple_history_manager_parent_class)->finalize(obj);
 }
 
 static void
 purple_history_manager_init(PurpleHistoryManager *manager) {
-	PurpleHistoryManagerPrivate *priv = NULL;
-
-	priv = purple_history_manager_get_instance_private(manager);
-
-	priv->adapters = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
-	                                       g_object_unref);
+	manager->adapters = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
+	                                          g_object_unref);
 }
 
 static void
@@ -86,11 +81,11 @@
 	*
 	* Since: 3.0.0
 	*/
-	signals[SIG_ACTIVE_CHANGED] = g_signal_new(
+	signals[SIG_ACTIVE_CHANGED] = g_signal_new_class_handler(
 		"active-changed",
 		G_OBJECT_CLASS_TYPE(klass),
 		G_SIGNAL_RUN_LAST,
-		G_STRUCT_OFFSET(PurpleHistoryManagerClass, active_changed),
+		NULL,
 		NULL,
 		NULL,
 		NULL,
@@ -108,11 +103,11 @@
 	 *
 	 * Since: 3.0.0
 	 */
-	signals[SIG_REGISTERED] = g_signal_new(
+	signals[SIG_REGISTERED] = g_signal_new_class_handler(
 		"registered",
 		G_OBJECT_CLASS_TYPE(klass),
 		G_SIGNAL_RUN_LAST,
-		G_STRUCT_OFFSET(PurpleHistoryManagerClass, registered),
+		NULL,
 		NULL,
 		NULL,
 		NULL,
@@ -129,11 +124,11 @@
 	 *
 	 * Since: 3.0.0
 	 */
-	signals[SIG_UNREGISTERED] = g_signal_new(
+	signals[SIG_UNREGISTERED] = g_signal_new_class_handler(
 		"unregistered",
 		G_OBJECT_CLASS_TYPE(klass),
 		G_SIGNAL_RUN_LAST,
-		G_STRUCT_OFFSET(PurpleHistoryManagerClass, unregistered),
+		NULL,
 		NULL,
 		NULL,
 		NULL,
@@ -154,18 +149,16 @@
 
 void
 purple_history_manager_shutdown(void) {
-	PurpleHistoryManagerPrivate *priv = NULL;
 	GError **error = NULL;
 
 	if(default_manager == NULL) {
 		return;
 	}
 
-	priv = purple_history_manager_get_instance_private(default_manager);
-	if(PURPLE_IS_HISTORY_ADAPTER(priv->active_adapter)) {
+	if(PURPLE_IS_HISTORY_ADAPTER(default_manager->active_adapter)) {
 		PurpleHistoryAdapter *adapter = NULL;
 
-		adapter = g_object_ref(priv->active_adapter);
+		adapter = g_object_ref(default_manager->active_adapter);
 		purple_history_manager_set_active(default_manager, NULL, NULL);
 		purple_history_manager_unregister(default_manager,
 		                                  adapter, error);
@@ -189,23 +182,21 @@
                                 PurpleHistoryAdapter *adapter,
                                 GError **error)
 {
-	PurpleHistoryManagerPrivate *priv = NULL;
 	const gchar *id = NULL;
 
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), FALSE);
 	g_return_val_if_fail(PURPLE_IS_HISTORY_ADAPTER(adapter), FALSE);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
 	id = purple_history_adapter_get_id(adapter);
-	if(g_hash_table_lookup(priv->adapters, id) != NULL) {
+	if(g_hash_table_lookup(manager->adapters, id) != NULL) {
 		g_set_error(error, PURPLE_HISTORY_MANAGER_DOMAIN, 0,
 		            _("adapter %s is already registered"), id);
 
 		return FALSE;
 	}
 
-	g_hash_table_insert(priv->adapters, g_strdup(id), g_object_ref(adapter));
+	g_hash_table_insert(manager->adapters, g_strdup(id),
+	                    g_object_ref(adapter));
 
 	g_signal_emit(G_OBJECT(manager), signals[SIG_REGISTERED], 0, adapter);
 
@@ -217,16 +208,13 @@
                                   PurpleHistoryAdapter *adapter,
                                   GError **error)
 {
-	PurpleHistoryManagerPrivate *priv = NULL;
 	const gchar *id = NULL;
 	gboolean ret = FALSE;
 
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), FALSE);
 	g_return_val_if_fail(PURPLE_IS_HISTORY_ADAPTER(adapter), FALSE);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
-	if(adapter == priv->active_adapter) {
+	if(adapter == manager->active_adapter) {
 		g_set_error(error, PURPLE_HISTORY_MANAGER_DOMAIN, 0,
 		            _("adapter %s is currently in use"), id);
 
@@ -237,7 +225,7 @@
 
 	id = purple_history_adapter_get_id(adapter);
 
-	if(g_hash_table_remove(priv->adapters, id)) {
+	if(g_hash_table_remove(manager->adapters, id)) {
 		g_signal_emit(G_OBJECT(manager), signals[SIG_UNREGISTERED], 0,
 		              adapter);
 
@@ -256,15 +244,12 @@
 
 PurpleHistoryAdapter *
 purple_history_manager_find(PurpleHistoryManager *manager, const gchar *id) {
-	PurpleHistoryManagerPrivate *priv = NULL;
 	gpointer value = NULL;
 
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), NULL);
 	g_return_val_if_fail(id != NULL, NULL);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
-	value = g_hash_table_lookup(priv->adapters, id);
+	value = g_hash_table_lookup(manager->adapters, id);
 	if(value == NULL) {
 		return NULL;
 	}
@@ -274,24 +259,16 @@
 
 GList *
 purple_history_manager_get_all(PurpleHistoryManager *manager) {
-	PurpleHistoryManagerPrivate *priv = NULL;
-
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), NULL);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
-	return g_hash_table_get_values(priv->adapters);
+	return g_hash_table_get_values(manager->adapters);
 }
 
 PurpleHistoryAdapter *
 purple_history_manager_get_active(PurpleHistoryManager *manager) {
-	PurpleHistoryManagerPrivate *priv = NULL;
-
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), NULL);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
-	return priv->active_adapter;
+	return manager->active_adapter;
 }
 
 gboolean
@@ -299,16 +276,13 @@
                                   const gchar *id,
                                   GError **error)
 {
-	PurpleHistoryManagerPrivate *priv = NULL;
 	PurpleHistoryAdapter *old = NULL, *adapter = NULL;
 
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), FALSE);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
 	/* First look up the new adapter if we're given one. */
 	if(id != NULL) {
-		adapter = g_hash_table_lookup(priv->adapters, id);
+		adapter = g_hash_table_lookup(manager->adapters, id);
 		if(!PURPLE_IS_HISTORY_ADAPTER(adapter)) {
 			g_set_error(error, PURPLE_HISTORY_MANAGER_DOMAIN, 0,
 			            "no history adapter found with id %s", id);
@@ -317,14 +291,14 @@
 		}
 	}
 
-	if(PURPLE_IS_HISTORY_ADAPTER(priv->active_adapter)) {
-		old = g_object_ref(priv->active_adapter);
+	if(PURPLE_IS_HISTORY_ADAPTER(manager->active_adapter)) {
+		old = g_object_ref(manager->active_adapter);
 	}
 
-	if(g_set_object(&priv->active_adapter, adapter)) {
+	if(g_set_object(&manager->active_adapter, adapter)) {
 		if(PURPLE_IS_HISTORY_ADAPTER(old)) {
 			if(!purple_history_adapter_deactivate(old, error)) {
-				g_set_object(&priv->active_adapter, old);
+				g_set_object(&manager->active_adapter, old);
 				g_clear_object(&old);
 				return FALSE;
 			}
@@ -336,7 +310,7 @@
 					purple_history_adapter_activate(old, error);
 				}
 
-				g_set_object(&priv->active_adapter, old);
+				g_set_object(&manager->active_adapter, old);
 				g_clear_object(&old);
 
 				return FALSE;
@@ -344,7 +318,7 @@
 		}
 
 		g_signal_emit(G_OBJECT(manager), signals[SIG_ACTIVE_CHANGED], 0, old,
-		              priv->active_adapter);
+		              manager->active_adapter);
 	}
 
 	g_clear_object(&old);
@@ -359,19 +333,15 @@
                              const gchar *query,
                              GError **error)
 {
-	PurpleHistoryManagerPrivate *priv = NULL;
-
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), FALSE);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
-	if(priv->active_adapter == NULL) {
+	if(manager->active_adapter == NULL) {
 		g_set_error_literal(error, PURPLE_HISTORY_MANAGER_DOMAIN, 0,
 		                    _("no active history adapter"));
 		return FALSE;
 	}
 
-	return purple_history_adapter_query(priv->active_adapter, query, error);
+	return purple_history_adapter_query(manager->active_adapter, query, error);
 }
 
 gboolean
@@ -379,19 +349,16 @@
                               const gchar *query,
                               GError **error)
 {
-	PurpleHistoryManagerPrivate *priv = NULL;
-
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), FALSE);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
-	if(priv->active_adapter == NULL) {
+	if(manager->active_adapter == NULL) {
 		g_set_error_literal(error, PURPLE_HISTORY_MANAGER_DOMAIN, 0,
 		                    _("no active history adapter"));
 		return FALSE;
 	}
 
-	return purple_history_adapter_remove(priv->active_adapter, query, error);
+	return purple_history_adapter_remove(manager->active_adapter, query,
+	                                     error);
 }
 
 gboolean
@@ -400,21 +367,17 @@
                              PurpleMessage *message,
                              GError **error)
 {
-	PurpleHistoryManagerPrivate *priv = NULL;
-
 	g_return_val_if_fail(PURPLE_IS_CONVERSATION(conversation), FALSE);
 	g_return_val_if_fail(PURPLE_IS_MESSAGE(message), FALSE);
 	g_return_val_if_fail(PURPLE_IS_HISTORY_MANAGER(manager), FALSE);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
-	if(priv->active_adapter == NULL) {
+	if(manager->active_adapter == NULL) {
 		g_set_error_literal(error, PURPLE_HISTORY_MANAGER_DOMAIN, 0,
 		                    _("no active history adapter"));
 		return FALSE;
 	}
 
-	return purple_history_adapter_write(priv->active_adapter, conversation,
+	return purple_history_adapter_write(manager->active_adapter, conversation,
 	                                    message, error);
 }
 
@@ -424,15 +387,12 @@
                                gpointer data)
 {
 	GHashTableIter iter;
-	PurpleHistoryManagerPrivate *priv = NULL;
 	gpointer value;
 
 	g_return_if_fail(PURPLE_IS_HISTORY_MANAGER(manager));
 	g_return_if_fail(func != NULL);
 
-	priv = purple_history_manager_get_instance_private(manager);
-
-	g_hash_table_iter_init(&iter, priv->adapters);
+	g_hash_table_iter_init(&iter, manager->adapters);
 	while (g_hash_table_iter_next(&iter, NULL, &value)) {
 		func(PURPLE_HISTORY_ADAPTER(value), data);
 	}
