diff --git a/doc/reference/pidgin/pidgin-docs.xml b/doc/reference/pidgin/pidgin-docs.xml
--- a/doc/reference/pidgin/pidgin-docs.xml
+++ b/doc/reference/pidgin/pidgin-docs.xml
@@ -36,7 +36,6 @@
       <xi:include href="xml/gtkrequest.xml" />
       <xi:include href="xml/gtkroomlist.xml" />
       <xi:include href="xml/gtksavedstatuses.xml" />
-      <xi:include href="xml/gtkscrollbook.xml" />
       <xi:include href="xml/gtksmiley-manager.xml" />
       <xi:include href="xml/gtksmiley-theme.xml" />
       <xi:include href="xml/gtkstatus-icon-theme.xml" />
@@ -83,6 +82,7 @@
       <xi:include href="xml/pidginpresenceicon.xml" />
       <xi:include href="xml/pidginprotocolchooser.xml" />
       <xi:include href="xml/pidginprotocolstore.xml" />
+      <xi:include href="xml/pidginscrollbook.xml" />
       <xi:include href="xml/pidginstock.xml" />
       <xi:include href="xml/pidginstylecontext.xml" />
       <xi:include href="xml/pidgintalkatu.xml" />
diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c
--- a/pidgin/gtkblist.c
+++ b/pidgin/gtkblist.c
@@ -35,7 +35,6 @@
 #include "gtkprivacy.h"
 #include "gtkroomlist.h"
 #include "gtkstatusbox.h"
-#include "gtkscrollbook.h"
 #include "gtkutils.h"
 #include "pidgin/minidialog.h"
 #include "pidgin/pidginaccountchooser.h"
@@ -51,6 +50,7 @@
 #include "pidgin/pidginlog.h"
 #include "pidgin/pidginmooddialog.h"
 #include "pidgin/pidginplugininfo.h"
+#include "pidginscrollbook.h"
 #include "pidgin/pidginstylecontext.h"
 #include "pidgin/pidgintooltip.h"
 #include "pidgin/pidginwindow.h"
@@ -4365,7 +4365,9 @@
 
 	/* this is far too ugly thanks to me not wanting to fix #3989 properly right now */
 	if (priv->error_scrollbook != NULL) {
-		errors = gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->error_scrollbook->notebook));
+		PidginScrollBook *scroll_book = PIDGIN_SCROLL_BOOK(priv->error_scrollbook);
+		GtkWidget *notebook = pidgin_scroll_book_get_notebook(scroll_book);
+		errors = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook));
 	}
 	if ((list = purple_accounts_get_all_active()) != NULL || errors) {
 		gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkblist->notebook), 1);
@@ -4520,8 +4522,11 @@
 	GList *children = NULL;
 	GtkWidget *ret = NULL;
 	/* XXX: Workaround for the currently incomplete implementation of PidginScrollBook */
-	if (PIDGIN_IS_SCROLL_BOOK(container))
-		container = GTK_CONTAINER(PIDGIN_SCROLL_BOOK(container)->notebook);
+	if(PIDGIN_IS_SCROLL_BOOK(container)) {
+		PidginScrollBook *scroll_book = PIDGIN_SCROLL_BOOK(container);
+		GtkWidget *notebook = pidgin_scroll_book_get_notebook(scroll_book);
+		container = GTK_CONTAINER(notebook);
+	}
 	children = gtk_container_get_children(container);
 	l = g_list_find_custom(children, account, (GCompareFunc) find_account_widget);
 	if (l)
diff --git a/pidgin/gtkscrollbook.h b/pidgin/pidginscrollbook.h
rename from pidgin/gtkscrollbook.h
rename to pidgin/pidginscrollbook.h
--- a/pidgin/gtkscrollbook.h
+++ b/pidgin/pidginscrollbook.h
@@ -1,4 +1,6 @@
-/* pidgin
+/*
+ * Pidgin - Internet Messenger
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
  *
  * Pidgin is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -15,71 +17,50 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #if !defined(PIDGIN_GLOBAL_HEADER_INSIDE) && !defined(PIDGIN_COMPILATION)
 # error "only <pidgin.h> may be included directly"
 #endif
 
-#ifndef __PIDGIN_SCROLL_BOOK_H__
-#define __PIDGIN_SCROLL_BOOK_H__
+#ifndef PIDGIN_SCROLL_BOOK_H
+#define PIDGIN_SCROLL_BOOK_H
 /**
- * SECTION:gtkscrollbook
- * @section_id: pidgin-gtkscrollbook
- * @short_description: <filename>gtkscrollbook.h</filename>
+ * SECTION:pidginscrollbook
+ * @section_id: pidgin-pidginscrollbook
  * @title: Scrolling Notebook Widget
+ *
+ * This widget is used to show error messages in the buddy list window.
  */
 
 #include <gtk/gtk.h>
 
 G_BEGIN_DECLS
 
-#define PIDGIN_TYPE_SCROLL_BOOK             (pidgin_scroll_book_get_type ())
-#define PIDGIN_SCROLL_BOOK(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIDGIN_TYPE_SCROLL_BOOK, PidginScrollBook))
-#define PIDGIN_SCROLL_BOOK_CLASS(vtable)    (G_TYPE_CHECK_CLASS_CAST ((vtable), PIDGIN_TYPE_SCROLL_BOOK, PidginScrollBookClass))
-#define PIDGIN_IS_SCROLL_BOOK(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIDGIN_TYPE_SCROLL_BOOK))
-#define PIDGIN_IS_SCROLL_BOOK_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), PIDGIN_TYPE_SCROLL_BOOK))
-#define PIDGIN_SCROLL_BOOK_GET_CLASS(inst)  (G_TYPE_INSTANCE_GET_CLASS ((inst), PIDGIN_TYPE_SCROLL_BOOK, PidginScrollBookClass))
-
-typedef struct _PidginScrollBook      PidginScrollBook;
-typedef struct _PidginScrollBookClass PidginScrollBookClass;
-
-struct _PidginScrollBook
-{
-	GtkVBox parent_instance;
-
-	GtkWidget *notebook;
-	GtkWidget *hbox;
-	GtkWidget *label;
-	GtkWidget *left_arrow;
-	GtkWidget *right_arrow;
-	GList *children;
+#define PIDGIN_TYPE_SCROLL_BOOK (pidgin_scroll_book_get_type ())
+G_DECLARE_FINAL_TYPE(PidginScrollBook, pidgin_scroll_book, PIDGIN, SCROLL_BOOK,
+                     GtkBox)
 
-	/*< private >*/
-	void (*_gtk_reserved1) (void);
-	void (*_gtk_reserved2) (void);
-	void (*_gtk_reserved3) (void);
-
-};
-
+/**
+ * pidgin_scroll_book_new:
+ *
+ * Creates a new #PidginScrollBook.
+ *
+ * Returns: (transfer full): The new #PidginScrollBook instance.
+ */
+GtkWidget *pidgin_scroll_book_new(void);
 
-struct _PidginScrollBookClass
-{
-	GtkContainerClass parent_class;
-
-	/*< private >*/
-	void (*_gtk_reserved0) (void);
-	void (*_gtk_reserved1) (void);
-	void (*_gtk_reserved2) (void);
-	void (*_gtk_reserved3) (void);
-};
-
-
-GType         pidgin_scroll_book_get_type         (void) G_GNUC_CONST;
-GtkWidget    *pidgin_scroll_book_new              (void);
+/**
+ * pidgin_scroll_book_get_notebook:
+ * @scroll_book: The #PidginScrollBook instance.
+ *
+ * Gets the notebook widget from @scroll_book.
+ *
+ * Returns: (transfer none): The notebook inside of @scroll_book.
+ */
+GtkWidget *pidgin_scroll_book_get_notebook(PidginScrollBook *scroll_book);
 
 G_END_DECLS
 
-#endif  /* __PIDGIN_SCROLL_BOOK_H__ */
+#endif  /* PIDGIN_SCROLL_BOOK_H */
diff --git a/pidgin/gtkscrollbook.c b/pidgin/pidginscrollbook.c
rename from pidgin/gtkscrollbook.c
rename to pidgin/pidginscrollbook.c
--- a/pidgin/gtkscrollbook.c
+++ b/pidgin/pidginscrollbook.c
@@ -1,4 +1,6 @@
-/* pidgin
+/*
+ * Pidgin - Internet Messenger
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
  *
  * Pidgin is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -15,49 +17,27 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
-#include "gtkscrollbook.h"
+#include "pidginscrollbook.h"
 
-static void pidgin_scroll_book_init (PidginScrollBook *scroll_book);
-static void pidgin_scroll_book_class_init (PidginScrollBookClass *klass);
-static void pidgin_scroll_book_forall (GtkContainer *c,
-					 gboolean include_internals,
-					 GtkCallback callback,
-					 gpointer user_data);
-
-GType
-pidgin_scroll_book_get_type (void)
-{
-	static GType scroll_book_type = 0;
+struct _PidginScrollBook {
+	GtkVBox parent;
 
-	if (!scroll_book_type)
-	{
-		static const GTypeInfo scroll_book_info =
-		{
-			sizeof (PidginScrollBookClass),
-			NULL, /* base_init */
-			NULL, /* base_finalize */
-			(GClassInitFunc) pidgin_scroll_book_class_init,
-			NULL, /* class_finalize */
-			NULL, /* class_data */
-			sizeof (PidginScrollBook),
-			0,
-			(GInstanceInitFunc) pidgin_scroll_book_init,
-			NULL  /* value_table */
-		};
+	GtkWidget *notebook;
+	GtkWidget *hbox;
+	GtkWidget *label;
+	GtkWidget *left_arrow;
+	GtkWidget *right_arrow;
+	GList *children;
+};
 
-		scroll_book_type = g_type_register_static(GTK_TYPE_BOX,
-							 "PidginScrollBook",
-							 &scroll_book_info,
-							 0);
-	}
+G_DEFINE_TYPE(PidginScrollBook, pidgin_scroll_book, GTK_TYPE_BOX)
 
-	return scroll_book_type;
-}
-
+/******************************************************************************
+ * Helpers
+ *****************************************************************************/
 static gboolean
 scroll_left_cb(PidginScrollBook *scroll_book, GdkEventButton *event)
 {
@@ -148,6 +128,37 @@
 	refresh_scroll_box(scroll_book, page_num, count);
 }
 
+static gboolean
+close_button_left_cb(GtkWidget *widget, GdkEventCrossing *event, GtkLabel *label)
+{
+	static GdkCursor *ptr = NULL;
+	if (ptr == NULL) {
+		GdkDisplay *display = gtk_widget_get_display(widget);
+		ptr = gdk_cursor_new_for_display(display, GDK_LEFT_PTR);
+	}
+
+	gtk_label_set_markup(label, "×");
+	gdk_window_set_cursor(event->window, ptr);
+	return FALSE;
+}
+
+static gboolean
+close_button_entered_cb(GtkWidget *widget, GdkEventCrossing *event, GtkLabel *label)
+{
+	static GdkCursor *hand = NULL;
+	if (hand == NULL) {
+		GdkDisplay *display = gtk_widget_get_display(widget);
+		hand = gdk_cursor_new_for_display(display, GDK_HAND2);
+	}
+
+	gtk_label_set_markup(label, "<u>×</u>");
+	gdk_window_set_cursor(event->window, hand);
+	return FALSE;
+}
+
+/******************************************************************************
+ * GtkContainer Implementation
+ *****************************************************************************/
 static void
 pidgin_scroll_book_add(GtkContainer *container, GtkWidget *widget)
 {
@@ -186,9 +197,6 @@
 			   GtkCallback callback,
 			   gpointer callback_data)
 {
-#if 0
-	GList *children;
-#endif
 	PidginScrollBook *scroll_book;
 
 	g_return_if_fail(GTK_IS_CONTAINER(container));
@@ -199,60 +207,25 @@
 		(*callback)(scroll_book->hbox, callback_data);
 		(*callback)(scroll_book->notebook, callback_data);
 	}
-
-#if 0
-	children = scroll_book->children;
-
-	while (children) {
-		GtkWidget *child;
-		child = children->data;
-		children = children->next;
-		(*callback)(child, callback_data);
-	}
-#endif
 }
 
+/******************************************************************************
+ * GObject Implementation
+ *****************************************************************************/
 static void
-pidgin_scroll_book_class_init (PidginScrollBookClass *klass)
-{
-	GtkContainerClass *container_class = (GtkContainerClass*)klass;
+pidgin_scroll_book_class_init(PidginScrollBookClass *klass) {
+	GtkContainerClass *container_class = GTK_CONTAINER_CLASS(klass);
 
 	container_class->add = pidgin_scroll_book_add;
 	container_class->remove = pidgin_scroll_book_remove;
 	container_class->forall = pidgin_scroll_book_forall;
 }
 
-static gboolean
-close_button_left_cb(GtkWidget *widget, GdkEventCrossing *event, GtkLabel *label)
-{
-	static GdkCursor *ptr = NULL;
-	if (ptr == NULL) {
-		GdkDisplay *display = gtk_widget_get_display(widget);
-		ptr = gdk_cursor_new_for_display(display, GDK_LEFT_PTR);
-	}
-
-	gtk_label_set_markup(label, "×");
-	gdk_window_set_cursor(event->window, ptr);
-	return FALSE;
-}
-
-static gboolean
-close_button_entered_cb(GtkWidget *widget, GdkEventCrossing *event, GtkLabel *label)
-{
-	static GdkCursor *hand = NULL;
-	if (hand == NULL) {
-		GdkDisplay *display = gtk_widget_get_display(widget);
-		hand = gdk_cursor_new_for_display(display, GDK_HAND2);
-	}
-
-	gtk_label_set_markup(label, "<u>×</u>");
-	gdk_window_set_cursor(event->window, hand);
-	return FALSE;
-}
-
 static void
-pidgin_scroll_book_init (PidginScrollBook *scroll_book)
-{
+pidgin_scroll_book_init(PidginScrollBook *scroll_book) {
+	GIcon *icon;
+	GtkWidget *eb;
+	GtkWidget *close_button;
 	const gchar *left_arrow_icon_names[] = {
 	        "pan-start-symbolic",
 	        "pan-left-symbolic",
@@ -261,9 +234,6 @@
 	        "pan-end-symbolic",
 	        "pan-right-symbolic",
 	};
-	GIcon *icon;
-	GtkWidget *eb;
-	GtkWidget *close_button;
 
 	gtk_orientable_set_orientation(GTK_ORIENTABLE(scroll_book), GTK_ORIENTATION_VERTICAL);
 
@@ -319,8 +289,20 @@
 	gtk_widget_show_all(scroll_book->notebook);
 }
 
+/******************************************************************************
+ * Public API
+ *****************************************************************************/
 GtkWidget *
-pidgin_scroll_book_new()
-{
-	return g_object_new(PIDGIN_TYPE_SCROLL_BOOK, NULL);
+pidgin_scroll_book_new() {
+	return g_object_new(
+		PIDGIN_TYPE_SCROLL_BOOK,
+		"orientation", GTK_ORIENTATION_VERTICAL,
+		NULL);
 }
+
+GtkWidget *
+pidgin_scroll_book_get_notebook(PidginScrollBook *scroll_book) {
+	g_return_val_if_fail(PIDGIN_IS_SCROLL_BOOK(scroll_book), NULL);
+
+	return scroll_book->notebook;
+}
diff --git a/pidgin/meson.build b/pidgin/meson.build
--- a/pidgin/meson.build
+++ b/pidgin/meson.build
@@ -16,7 +16,6 @@
 	'gtkrequest.c',
 	'gtkroomlist.c',
 	'gtksavedstatuses.c',
-	'gtkscrollbook.c',
 	'gtksmiley-manager.c',
 	'gtksmiley-theme.c',
 	'gtkstatus-icon-theme.c',
@@ -59,6 +58,7 @@
 	'pidginpresenceicon.c',
 	'pidginprotocolchooser.c',
 	'pidginprotocolstore.c',
+	'pidginscrollbook.c',
 	'pidginstylecontext.c',
 	'pidgintalkatu.c',
 	'pidgintooltip.c',
@@ -86,7 +86,6 @@
 	'gtkrequest.h',
 	'gtkroomlist.h',
 	'gtksavedstatuses.h',
-	'gtkscrollbook.h',
 	'gtksmiley-manager.h',
 	'gtksmiley-theme.h',
 	'gtkstatus-icon-theme.h',
@@ -130,6 +129,7 @@
 	'pidginpresenceicon.h',
 	'pidginprotocolchooser.h',
 	'pidginprotocolstore.h',
+	'pidginscrollbook.h',
 	'pidginstylecontext.h',
 	'pidgintalkatu.h',
 	'pidgintooltip.h',
diff --git a/po/POTFILES.in b/po/POTFILES.in
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -324,7 +324,6 @@
 pidgin/gtkrequest.c
 pidgin/gtkroomlist.c
 pidgin/gtksavedstatuses.c
-pidgin/gtkscrollbook.c
 pidgin/gtksmiley-manager.c
 pidgin/gtksmiley-theme.c
 pidgin/gtkstatusbox.c
@@ -368,6 +367,7 @@
 pidgin/pidginpresenceicon.c
 pidgin/pidginprotocolchooser.c
 pidgin/pidginprotocolstore.c
+pidgin/pidginscrollbook.c
 pidgin/pidginstock.c
 pidgin/pidginstylecontext.c
 pidgin/pidgintalkatu.c
