diff --git a/src/gtkui/columns.c b/src/gtkui/columns.c
index 00deffb..b50f5ed 100644
--- a/src/gtkui/columns.c
+++ b/src/gtkui/columns.c
@@ -207,10 +207,10 @@ static void response_cb (GtkWidget * widget, gint response, void * unused)
         g_return_if_fail (cols <= PW_COLS);
 
         ui_playlist_notebook_empty ();
+        aud_set_string ("gtkui", "column_widths", "");
 
         for (pw_num_cols = 0; pw_num_cols < cols; pw_num_cols ++)
-            pw_cols[pw_num_cols] = ((Column *) index_get (chosen, pw_num_cols))
-             ->column;
+            pw_cols[pw_num_cols] = ((Column *) index_get (chosen, pw_num_cols))->column;
 
         ui_playlist_notebook_populate ();
     }
diff --git a/src/gtkui/ui_playlist_notebook.c b/src/gtkui/ui_playlist_notebook.c
index b944d19..ecd41fa 100644
--- a/src/gtkui/ui_playlist_notebook.c
+++ b/src/gtkui/ui_playlist_notebook.c
@@ -17,7 +17,7 @@
  * the use of this software.
  */
 
-#include "config.h"
+#include <stdlib.h>
 
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtk.h>
@@ -27,9 +27,11 @@
 #include <audacious/misc.h>
 #include <audacious/playlist.h>
 #include <audacious/plugin.h>
+#include <libaudcore/hook.h>
 #include <libaudgui/list.h>
 #include <libaudgui/libaudgui.h>
 
+#include "config.h"
 #include "gtkui.h"
 #include "ui_playlist_notebook.h"
 #include "ui_playlist_widget.h"
@@ -37,6 +39,7 @@
 
 static GtkWidget * notebook = NULL;
 static gint highlighted = -1;
+static gint last_active = -1;
 
 static gint switch_handler = 0;
 static gint reorder_handler = 0;
@@ -123,6 +126,30 @@ GtkNotebook *ui_playlist_get_notebook(void)
     return GTK_NOTEBOOK(notebook);
 }
 
+static void save_column_widths (void)
+{
+    GtkWidget * treeview = playlist_get_treeview (last_active);
+    char * widths = ui_playlist_widget_get_column_widths (treeview);
+
+    printf ("save: %s\n", widths);
+    aud_set_string ("gtkui", "column_widths", widths);
+
+    free (widths);
+}
+
+static void apply_column_widths (GtkWidget * treeview)
+{
+    char * widths = aud_get_string ("gtkui", "column_widths");
+
+    if (widths && widths[0])
+    {
+        printf ("apply: %s\n", widths);
+        ui_playlist_widget_set_column_widths (treeview, widths);
+    }
+
+    free (widths);
+}
+
 static void tab_title_reset(GtkWidget *ebox)
 {
     GtkWidget *label = g_object_get_data(G_OBJECT(ebox), "label");
@@ -166,13 +193,15 @@ static gboolean tab_button_press_cb(GtkWidget *ebox, GdkEventButton *event, gpoi
     return FALSE;
 }
 
-static void tab_changed (GtkNotebook * notebook, GtkWidget * page, gint
- page_num, void * unused)
+static void tab_changed (GtkNotebook * notebook, GtkWidget * page, int page_num)
 {
-    GtkWidget * treeview = playlist_get_treeview (page_num);
+    printf ("tab changed, last active = %d\n", last_active);
 
-    if (treeview != NULL)
-        aud_playlist_set_active (page_num);
+    save_column_widths ();
+    apply_column_widths (playlist_get_treeview (page_num));
+
+    last_active = page_num;
+    aud_playlist_set_active (page_num);
 }
 
 static void tab_reordered(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
@@ -222,7 +251,7 @@ void ui_playlist_notebook_edit_tab_title (int playlist)
     gtk_widget_show(entry);
 }
 
-void ui_playlist_notebook_create_tab(gint playlist)
+static void ui_playlist_notebook_create_tab (int playlist)
 {
     GtkWidget *scrollwin, *treeview;
     GtkWidget *label, *entry, *ebox, *hbox;
@@ -233,10 +262,12 @@ void ui_playlist_notebook_create_tab(gint playlist)
     vscroll = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrollwin));
 
     treeview = ui_playlist_widget_new(playlist);
-    g_object_set_data(G_OBJECT(scrollwin), "treeview", treeview);
+    apply_column_widths (treeview);
 
+    g_object_set_data(G_OBJECT(scrollwin), "treeview", treeview);
     gtk_container_add(GTK_CONTAINER(scrollwin), treeview);
-    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_policy ((GtkScrolledWindow *) scrollwin,
+     GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
     gtk_widget_show_all(scrollwin);
 
     ebox = gtk_event_box_new();
@@ -283,16 +314,17 @@ void ui_playlist_notebook_create_tab(gint playlist)
      G_CALLBACK(ui_playlist_widget_scroll), treeview);
 }
 
-void ui_playlist_notebook_populate(void)
+void ui_playlist_notebook_populate (void)
 {
-    gint playlists = aud_playlist_count();
-    gint count;
+    last_active = aud_playlist_get_active ();
+    highlighted = aud_playlist_get_unique_id (aud_playlist_get_playing ());
 
-    for (count = 0; count < playlists; count++)
-        ui_playlist_notebook_create_tab(count);
+    int n_lists = aud_playlist_count ();
+    for (int i = 0; i < n_lists; i ++)
+        ui_playlist_notebook_create_tab (i);
 
-    gtk_notebook_set_current_page (UI_PLAYLIST_NOTEBOOK, aud_playlist_get_active ());
-    highlighted = aud_playlist_get_unique_id (aud_playlist_get_playing ());
+    gtk_notebook_set_current_page ((GtkNotebook *) notebook, last_active);
+    gtk_widget_grab_focus (playlist_get_treeview (last_active));
 
     if (! switch_handler)
         switch_handler = g_signal_connect (notebook, "switch-page", (GCallback)
@@ -300,12 +332,13 @@ void ui_playlist_notebook_populate(void)
     if (! reorder_handler)
         reorder_handler = g_signal_connect (notebook, "page-reordered",
          (GCallback) tab_reordered, NULL);
-
-    gtk_widget_grab_focus (playlist_get_treeview (aud_playlist_get_active ()));
 }
 
 void ui_playlist_notebook_empty (void)
 {
+    last_active = -1;
+    highlighted = -1;
+
     if (switch_handler)
         g_signal_handler_disconnect (notebook, switch_handler);
     switch_handler = 0;
@@ -323,6 +356,9 @@ static void add_remove_pages (void)
     gint lists = aud_playlist_count ();
     gint pages = gtk_notebook_get_n_pages ((GtkNotebook *) notebook);
 
+    printf ("add-remove, last active = %d\n", last_active);
+    save_column_widths ();
+
     /* scan through existing treeviews */
     for (gint i = 0; i < pages; )
     {
@@ -385,6 +421,10 @@ static void add_remove_pages (void)
         ui_playlist_notebook_create_tab (pages);
         pages ++;
     }
+
+    last_active = aud_playlist_get_active ();
+    gtk_notebook_set_current_page ((GtkNotebook *) notebook, last_active);
+    apply_column_widths ();
 }
 
 void ui_playlist_notebook_update (void * data, void * user)
@@ -433,8 +473,12 @@ void ui_playlist_notebook_position (void * data, void * user)
 
 void ui_playlist_notebook_activate (void * data, void * user)
 {
-    if (! aud_playlist_update_pending ())
-        gtk_notebook_set_current_page ((GtkNotebook *) notebook, aud_playlist_get_active ());
+    if (aud_playlist_update_pending ())
+        return;
+
+    int active = aud_playlist_get_active ();
+    if (active != last_active)
+        gtk_notebook_set_current_page ((GtkNotebook *) notebook, active);
 }
 
 void ui_playlist_notebook_set_playing (void * data, void * user)
@@ -461,7 +505,11 @@ void ui_playlist_notebook_set_playing (void * data, void * user)
 
 static void destroy_cb (void)
 {
+    hook_dissociate ("config save", (HookFunction) save_column_widths);
+
     notebook = NULL;
+    highlighted = -1;
+    last_active = -1;
     switch_handler = 0;
     reorder_handler = 0;
 }
@@ -472,6 +520,8 @@ GtkWidget * ui_playlist_notebook_new (void)
     gtk_notebook_set_scrollable ((GtkNotebook *) notebook, TRUE);
     make_add_button (notebook);
 
+    hook_associate ("config save", (HookFunction) save_column_widths, NULL);
+
     g_signal_connect (notebook, "destroy", (GCallback) destroy_cb, NULL);
     return notebook;
 }
diff --git a/src/gtkui/ui_playlist_notebook.h b/src/gtkui/ui_playlist_notebook.h
index 52332ed..e8fd2b9 100644
--- a/src/gtkui/ui_playlist_notebook.h
+++ b/src/gtkui/ui_playlist_notebook.h
@@ -26,7 +26,6 @@
 
 GtkNotebook *ui_playlist_get_notebook(void);
 GtkWidget *ui_playlist_notebook_new();
-void ui_playlist_notebook_create_tab(gint playlist);
 void ui_playlist_notebook_edit_tab_title (int playlist);
 void ui_playlist_notebook_populate(void);
 void ui_playlist_notebook_empty (void);
diff --git a/src/gtkui/ui_playlist_widget.c b/src/gtkui/ui_playlist_widget.c
index 1c61ae5..9273493 100644
--- a/src/gtkui/ui_playlist_widget.c
+++ b/src/gtkui/ui_playlist_widget.c
@@ -25,6 +25,7 @@
 #include <audacious/i18n.h>
 #include <audacious/misc.h>
 #include <audacious/playlist.h>
+#include <libaudcore/audstrings.h>
 #include <libaudgui/libaudgui.h>
 #include <libaudgui/libaudgui-gtk.h>
 #include <libaudgui/list.h>
@@ -477,3 +478,26 @@ void ui_playlist_widget_scroll (GtkWidget * widget)
     else
         popup_hide (data);
 }
+
+char * ui_playlist_widget_get_column_widths (GtkWidget * widget)
+{
+    int w[pw_num_cols];
+
+    for (int i = 0; i < pw_num_cols; i ++)
+        w[i] = gtk_tree_view_column_get_width
+         (gtk_tree_view_get_column ((GtkTreeView *) widget, i));
+
+    return int_array_to_string (w, pw_num_cols);
+}
+
+void ui_playlist_widget_set_column_widths (GtkWidget * widget, const char * widths)
+{
+    int w[pw_num_cols];
+
+    if (! string_to_int_array (widths, w, pw_num_cols))
+        return;
+
+    for (int i = 0; i < pw_num_cols; i ++)
+        gtk_tree_view_column_set_fixed_width
+         (gtk_tree_view_get_column ((GtkTreeView *) widget, i), w[i]);
+}
diff --git a/src/gtkui/ui_playlist_widget.h b/src/gtkui/ui_playlist_widget.h
index b415e4b..5ec0f6d 100644
--- a/src/gtkui/ui_playlist_widget.h
+++ b/src/gtkui/ui_playlist_widget.h
@@ -29,6 +29,9 @@ void ui_playlist_widget_update (GtkWidget * widget, gint type, gint at,
  gint count);
 void ui_playlist_widget_scroll (GtkWidget * widget);
 
+char * ui_playlist_widget_get_column_widths (GtkWidget * widget);
+void ui_playlist_widget_set_column_widths (GtkWidget * widget, const char * widths);
+
 enum {PW_COL_NUMBER, PW_COL_TITLE, PW_COL_ARTIST, PW_COL_YEAR, PW_COL_ALBUM,
  PW_COL_TRACK, PW_COL_GENRE, PW_COL_QUEUED, PW_COL_LENGTH, PW_COL_PATH,
  PW_COL_FILENAME, PW_COL_CUSTOM, PW_COL_BITRATE, PW_COLS};
