+    wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid notebook") );
+
+    wxCHECK_MSG( win->GetParent() == this, FALSE,
+               _T("Can't add a page whose parent is not the notebook!") );
+
+    /* don't receive switch page during addition */           
+    gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget), 
+      GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback), (gpointer) this );
+      
+    GtkNotebook *notebook = GTK_NOTEBOOK(m_widget);
+
+    wxNotebookPage *page = new wxNotebookPage();
+    
+    if (position < 0)
+        m_pages.Append( page );
+    else
+        m_pages.Insert( m_pages.Nth( position ), page );
+    
+    page->m_client = win;
+
+    page->m_box = gtk_hbox_new( FALSE, 0 );
+    gtk_container_border_width( GTK_CONTAINER(page->m_box), 2 );
+
+    gtk_signal_connect( GTK_OBJECT(win->m_widget), "size_allocate",
+      GTK_SIGNAL_FUNC(gtk_page_size_callback), (gpointer)win );
+
+    if (position < 0)
+        gtk_notebook_append_page( notebook, win->m_widget, page->m_box );
+    else 
+        gtk_notebook_insert_page( notebook, win->m_widget, page->m_box, position );
+
+    page->m_page = (GtkNotebookPage*) g_list_last(notebook->children)->data;
+
+    /* set the label image */
+    page->m_image = imageId;
+    
+    if (imageId != -1)
+    {
+        wxASSERT( m_imageList != NULL );