+    // We cannot remove the page yet, as GTK sends the "switch_page"
+    // signal before it has removed the notebook-page from its
+    // corresponding list. Thus, if we were to remove the page from
+    // m_pages at this point, the two lists of pages would be out
+    // of sync during the PAGE_CHANGING/PAGE_CHANGED events.
+    wxNotebookPage *client = GetPage(page);
+    if ( !client )
+        return NULL;
+
+    // we don't need to unparent the client->m_widget; GTK+ will do
+    // that for us (and will throw a warning if we do it!)
+    gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page );
+
+    // It's safe to remove the page now.
+    wxASSERT_MSG(GetPage(page) == client, wxT("pages changed during delete"));
+    wxNotebookBase::DoRemovePage(page);
+
+    wxGtkNotebookPage* p = GetNotebookPage(page);
+    m_pagesData.DeleteObject(p);
+    delete p;
+
+    return client;
+}
+
+bool wxNotebook::InsertPage( size_t position,
+                             wxNotebookPage* win,
+                             const wxString& text,
+                             bool select,
+                             int imageId )
+{
+    wxCHECK_MSG( m_widget != NULL, false, wxT("invalid notebook") );
+
+    wxCHECK_MSG( win->GetParent() == this, false,
+               wxT("Can't add a page whose parent is not the notebook!") );
+
+    wxCHECK_MSG( position <= GetPageCount(), false,
+                 wxT("invalid page index in wxNotebookPage::InsertPage()") );
+
+    // Hack Alert! (Part II): See above in wxNotebook::AddChildGTK
+    // why this has to be done.
+    gtk_widget_unparent(win->m_widget);
+
+    if (m_themeEnabled)
+        win->SetThemeEnabled(true);
+
+    GtkNotebook *notebook = GTK_NOTEBOOK(m_widget);
+
+    wxGtkNotebookPage* pageData = new wxGtkNotebookPage;
+
+    m_pages.Insert(win, position);
+    m_pagesData.Insert(position, pageData);
+
+    // set the label image and text
+    // this must be done before adding the page, as GetPageText
+    // and GetPageImage will otherwise return wrong values in
+    // the page-changed event that results from inserting the
+    // first page.
+    pageData->m_imageIndex = imageId;
+
+    pageData->m_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
+    gtk_container_set_border_width(GTK_CONTAINER(pageData->m_box), 2);
+
+    pageData->m_image = NULL;
+    if (imageId != -1)
+    {
+        if (HasImageList())
+        {
+            const wxBitmap* bitmap = GetImageList()->GetBitmapPtr(imageId);
+            pageData->m_image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf());
+            gtk_box_pack_start(GTK_BOX(pageData->m_box),
+                pageData->m_image, false, false, m_padding);
+        }
+        else
+        {
+            wxFAIL_MSG("invalid notebook imagelist");
+        }
+    }
+
+    /* set the label text */
+    pageData->m_label = gtk_label_new(wxGTK_CONV(wxStripMenuCodes(text)));
+    gtk_box_pack_end(GTK_BOX(pageData->m_box),
+        pageData->m_label, false, false, m_padding);
+
+    gtk_widget_show_all(pageData->m_box);
+    gtk_notebook_insert_page(notebook, win->m_widget, pageData->m_box, position);
+
+    /* apply current style */
+#ifdef __WXGTK3__
+    GTKApplyStyle(pageData->m_label, NULL);
+#else
+    GtkRcStyle *style = GTKCreateWidgetStyle();
+    if ( style )
+    {
+        gtk_widget_modify_style(pageData->m_label, style);
+        g_object_unref(style);
+    }
+#endif