[gnome-system-monitor] Get rid of ProcData structure



commit 97674c7940e819bef14c8a98bd181cbb5a604226
Author: Stefano Facchini <stefano facchini gmail com>
Date:   Wed Oct 3 18:21:42 2012 +0300

    Get rid of ProcData structure
    
    It's redundant now that we have a true Application object
    
    https://bugzilla.gnome.org/show_bug.cgi?id=684536

 src/callbacks.cpp       |  214 ++++++++++-----------
 src/callbacks.h         |    4 +-
 src/cgroups.cpp         |    2 +-
 src/cgroups.h           |    2 +-
 src/disks.cpp           |   35 ++--
 src/disks.h             |    4 +-
 src/interface.cpp       |  185 +++++++++---------
 src/interface.h         |   10 +-
 src/load-graph.cpp      |   20 +-
 src/lsof.cpp            |   10 +-
 src/lsof.h              |    4 +-
 src/memmaps.cpp         |   18 +-
 src/memmaps.h           |    4 +-
 src/openfiles.cpp       |   18 +-
 src/openfiles.h         |    4 +-
 src/procactions.cpp     |   38 ++--
 src/procactions.h       |    6 +-
 src/procdialogs.cpp     |   89 +++++-----
 src/procdialogs.h       |   12 +-
 src/procman-app.cpp     |  491 +++++++++++++++++++++++++++++++----------------
 src/procman-app.h       |  222 +++++++++++++++++++++-
 src/procman.cpp         |  188 +------------------
 src/procman.h           |  262 -------------------------
 src/procman_gksu.cpp    |    2 +-
 src/procman_gnomesu.cpp |    2 +-
 src/procman_pkexec.cpp  |    2 +-
 src/procproperties.cpp  |   17 +-
 src/procproperties.h    |    4 +-
 src/proctable.cpp       |  127 +++++++------
 src/proctable.h         |   14 +-
 src/selinux.cpp         |    2 +-
 src/selinux.h           |    2 +-
 src/smooth_refresh.cpp  |    6 +-
 src/sysinfo.cpp         |    5 +-
 src/util.cpp            |    8 +-
 35 files changed, 976 insertions(+), 1057 deletions(-)
---
diff --git a/src/callbacks.cpp b/src/callbacks.cpp
index f4f1bb4..81f0bf5 100644
--- a/src/callbacks.cpp
+++ b/src/callbacks.cpp
@@ -30,7 +30,7 @@
 #include "proctable.h"
 #include "util.h"
 #include "procactions.h"
-#include "procman.h"
+#include "procman-app.h"
 #include "procdialogs.h"
 #include "memmaps.h"
 #include "openfiles.h"
@@ -43,10 +43,10 @@
 void
 cb_kill_sigstop(GtkAction *action, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
     /* no confirmation */
-    kill_process (procdata, SIGSTOP);
+    kill_process (app, SIGSTOP);
 }
 
 
@@ -55,44 +55,43 @@ cb_kill_sigstop(GtkAction *action, gpointer data)
 void
 cb_kill_sigcont(GtkAction *action, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
     /* no confirmation */
-    kill_process (procdata, SIGCONT);
+    kill_process (app, SIGCONT);
 }
 
 
 
-
 static void
-kill_process_helper(ProcData *procdata, int sig)
+kill_process_helper(ProcmanApp *app, int sig)
 {
-    if (procdata->config.show_kill_warning)
-        procdialog_create_kill_dialog (procdata, sig);
+    if (app->config.show_kill_warning)
+        procdialog_create_kill_dialog (app, sig);
     else
-        kill_process (procdata, sig);
+        kill_process (app, sig);
 }
 
 
 void
 cb_edit_preferences (GtkAction *action, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
-    procdialog_create_preferences_dialog (procdata);
+    procdialog_create_preferences_dialog (app);
 }
 
 
 void
 cb_renice (GtkAction *action, GtkRadioAction *current, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
     gint selected = gtk_radio_action_get_current_value(current);
 
     if (selected == CUSTOM_PRIORITY)
     {
-       procdialog_create_renice_dialog (procdata);
+       procdialog_create_renice_dialog (app);
     } else {
        gint new_nice_value = 0;
        switch (selected) {
@@ -102,7 +101,7 @@ cb_renice (GtkAction *action, GtkRadioAction *current, gpointer data)
            case LOW_PRIORITY: new_nice_value = 5; break;
            case VERY_LOW_PRIORITY: new_nice_value = 19; break;
        }
-       renice(procdata, new_nice_value);
+       renice(app, new_nice_value);
     }
 }
 
@@ -110,52 +109,53 @@ cb_renice (GtkAction *action, GtkRadioAction *current, gpointer data)
 void
 cb_end_process (GtkAction *action, gpointer data)
 {
-    kill_process_helper(static_cast<ProcData*>(data), SIGTERM);
+    kill_process_helper(static_cast<ProcmanApp *>(data), SIGTERM);
 }
 
 
 void
 cb_kill_process (GtkAction *action, gpointer data)
 {
-    kill_process_helper(static_cast<ProcData*>(data), SIGKILL);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
+    kill_process_helper(app, SIGKILL);
 }
 
 
 void
 cb_show_memory_maps (GtkAction *action, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
-    create_memmaps_dialog (procdata);
+    create_memmaps_dialog (app);
 }
 
 void
 cb_show_open_files (GtkAction *action, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
-    create_openfiles_dialog (procdata);
+    create_openfiles_dialog (app);
 }
 
 void
 cb_show_process_properties (GtkAction *action, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-    create_procproperties_dialog (procdata);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    create_procproperties_dialog (app);
 }
 
 void
 cb_show_lsof(GtkAction *action, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-    procman_lsof(procdata);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    procman_lsof(app);
 }
 
 
 void
 cb_about (GtkAction *action, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
     const gchar * const authors[] = {
         "Kevin Vandersloot",
@@ -180,7 +180,7 @@ cb_about (GtkAction *action, gpointer data)
     };
 
     gtk_show_about_dialog (
-        GTK_WINDOW (procdata->app),
+        GTK_WINDOW (app->main_window),
         "name",                 _("System Monitor"),
         "comments",             _("View current processes and monitor "
                                   "system state"),
@@ -211,38 +211,22 @@ cb_help_contents (GtkAction *action, gpointer data)
 }
 
 
-void
-cb_app_exit (GtkAction *action, gpointer data)
-{
-    ProcData * const procdata = static_cast<ProcData*>(data);
-
-    cb_app_delete (NULL, NULL, procdata);
-    gtk_widget_destroy (procdata->app);
-}
-
-
 gboolean
-cb_app_delete (GtkWidget *window, GdkEventAny *event, gpointer data)
+cb_main_window_delete (GtkWidget *window, GdkEvent *event, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
-
-    procman_save_config (procdata);
-    if (procdata->timeout)
-        g_source_remove (procdata->timeout);
-    if (procdata->disk_timeout)
-        g_source_remove (procdata->disk_timeout);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
-    procdata->terminating = TRUE;
+    app->shutdown ();
 
-    return FALSE;
+    return TRUE;
 }
 
 
-
 void
 cb_end_process_button_pressed (GtkButton *button, gpointer data)
 {
-    kill_process_helper(static_cast<ProcData*>(data), SIGTERM);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    kill_process_helper(app, SIGTERM);
 }
 
 void
@@ -291,30 +275,30 @@ static void change_settings_color(GSettings *settings, const char *key,
 void
 cb_mem_color_changed (GSMColorButton *cp, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
-    change_settings_color(procdata->settings, "mem-color", cp);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
+    change_settings_color(app->settings, "mem-color", cp);
 }
 
 
 void
 cb_swap_color_changed (GSMColorButton *cp, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
-    change_settings_color(procdata->settings, "swap-color", cp);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
+    change_settings_color(app->settings, "swap-color", cp);
 }
 
 void
 cb_net_in_color_changed (GSMColorButton *cp, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
-    change_settings_color(procdata->settings, "net-in-color", cp);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
+    change_settings_color(app->settings, "net-in-color", cp);
 }
 
 void
 cb_net_out_color_changed (GSMColorButton *cp, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
-    change_settings_color(procdata->settings, "net-out-color", cp);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
+    change_settings_color(app->settings, "net-out-color", cp);
 }
 
 static void
@@ -330,20 +314,20 @@ get_last_selected (GtkTreeModel *model, GtkTreePath *path,
 void
 cb_row_selected (GtkTreeSelection *selection, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
-    procdata->selection = selection;
+    app->selection = selection;
 
-    procdata->selected_process = NULL;
+    app->selected_process = NULL;
 
     /* get the most recent selected process and determine if there are
     ** no selected processes
     */
-    gtk_tree_selection_selected_foreach (procdata->selection, get_last_selected,
-                                         &procdata->selected_process);
-    if (procdata->selected_process) {
+    gtk_tree_selection_selected_foreach (app->selection, get_last_selected,
+                                         &app->selected_process);
+    if (app->selected_process) {
         gint value;
-        gint nice = procdata->selected_process->nice;
+        gint nice = app->selected_process->nice;
         if (nice < -7)
             value = VERY_HIGH_PRIORITY;
         else if (nice < -2)
@@ -355,13 +339,13 @@ cb_row_selected (GtkTreeSelection *selection, gpointer data)
         else
             value = VERY_LOW_PRIORITY;
 
-        GtkRadioAction* normal = GTK_RADIO_ACTION(gtk_action_group_get_action(procdata->action_group, "Normal"));
-        block_priority_changed_handlers(procdata, TRUE);
+        GtkRadioAction* normal = GTK_RADIO_ACTION(gtk_action_group_get_action(app->action_group, "Normal"));
+        block_priority_changed_handlers(app, TRUE);
         gtk_radio_action_set_current_value(normal, value);
-        block_priority_changed_handlers(procdata, FALSE);
+        block_priority_changed_handlers(app, FALSE);
 
     }
-    update_sensitivity(procdata);
+    update_sensitivity(app);
 }
 
 
@@ -370,10 +354,10 @@ cb_tree_button_pressed (GtkWidget *widget,
                         GdkEventButton *event,
                         gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
     if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
-        do_popup_menu (procdata, event);
+        do_popup_menu (app, event);
 
     return FALSE;
 }
@@ -382,9 +366,9 @@ cb_tree_button_pressed (GtkWidget *widget,
 gboolean
 cb_tree_popup_menu (GtkWidget *widget, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
-    do_popup_menu (procdata, NULL);
+    do_popup_menu (app, NULL);
 
     return TRUE;
 }
@@ -400,59 +384,59 @@ cb_switch_page (GtkNotebook *nb, GtkWidget *page,
 void
 cb_change_current_page (GtkNotebook *nb, gint num, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
-    procdata->config.current_tab = num;
+    app->config.current_tab = num;
 
 
     if (num == PROCMAN_TAB_PROCESSES) {
 
-        cb_timeout (procdata);
+        cb_timeout (app);
 
-        if (!procdata->timeout)
-            procdata->timeout = g_timeout_add (
-                procdata->config.update_interval,
-                cb_timeout, procdata);
+        if (!app->timeout)
+            app->timeout = g_timeout_add (
+                app->config.update_interval,
+                cb_timeout, app);
 
-        update_sensitivity(procdata);
+        update_sensitivity(app);
     }
     else {
-        if (procdata->timeout) {
-            g_source_remove (procdata->timeout);
-            procdata->timeout = 0;
+        if (app->timeout) {
+            g_source_remove (app->timeout);
+            app->timeout = 0;
         }
 
-        update_sensitivity(procdata);
+        update_sensitivity(app);
     }
 
 
     if (num == PROCMAN_TAB_RESOURCES) {
-        load_graph_start (procdata->cpu_graph);
-        load_graph_start (procdata->mem_graph);
-        load_graph_start (procdata->net_graph);
+        load_graph_start (app->cpu_graph);
+        load_graph_start (app->mem_graph);
+        load_graph_start (app->net_graph);
     }
     else {
-        load_graph_stop (procdata->cpu_graph);
-        load_graph_stop (procdata->mem_graph);
-        load_graph_stop (procdata->net_graph);
+        load_graph_stop (app->cpu_graph);
+        load_graph_stop (app->mem_graph);
+        load_graph_stop (app->net_graph);
     }
 
 
     if (num == PROCMAN_TAB_DISKS) {
 
-        cb_update_disks (procdata);
+        cb_update_disks (app);
 
-        if(!procdata->disk_timeout) {
-            procdata->disk_timeout =
-                g_timeout_add (procdata->config.disks_update_interval,
+        if(!app->disk_timeout) {
+            app->disk_timeout =
+                g_timeout_add (app->config.disks_update_interval,
                                cb_update_disks,
-                               procdata);
+                               app);
         }
     }
     else {
-        if(procdata->disk_timeout) {
-            g_source_remove (procdata->disk_timeout);
-            procdata->disk_timeout = 0;
+        if(app->disk_timeout) {
+            g_source_remove (app->disk_timeout);
+            app->disk_timeout = 0;
         }
     }
 
@@ -466,8 +450,8 @@ cb_change_current_page (GtkNotebook *nb, gint num, gpointer data)
 gint
 cb_user_refresh (GtkAction*, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
-    proctable_update_all(procdata);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
+    proctable_update_all(app);
     return FALSE;
 }
 
@@ -475,18 +459,18 @@ cb_user_refresh (GtkAction*, gpointer data)
 gint
 cb_timeout (gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
     guint new_interval;
-    if (!procdata->terminating) {
-        proctable_update_all (procdata);
-
-        if (procdata->smooth_refresh->get(new_interval))
-        {
-            procdata->timeout = g_timeout_add(new_interval,
-                                          cb_timeout,
-                                          procdata);
-            return FALSE;
-        }
+
+
+    proctable_update_all (app);
+
+    if (app->smooth_refresh->get(new_interval))
+    {
+        app->timeout = g_timeout_add(new_interval,
+                                     cb_timeout,
+                                     app);
+        return FALSE;
     }
 
     return TRUE;
@@ -496,10 +480,10 @@ cb_timeout (gpointer data)
 void
 cb_radio_processes(GtkAction *action, GtkRadioAction *current, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
-    procdata->config.whose_process = gtk_radio_action_get_current_value(current);
+    app->config.whose_process = gtk_radio_action_get_current_value(current);
 
-    g_settings_set_int (procdata->settings, "view-as",
-                        procdata->config.whose_process);
+    g_settings_set_int (app->settings, "view-as",
+                        app->config.whose_process);
 }
diff --git a/src/callbacks.h b/src/callbacks.h
index 573d66a..4f88117 100644
--- a/src/callbacks.h
+++ b/src/callbacks.h
@@ -22,7 +22,6 @@
 #define _PROCMAN_CALLBACKS_H_
 
 #include <gtk/gtk.h>
-#include "procman.h"
 #include "gsm_color_button.h"
 
 
@@ -38,8 +37,7 @@ void            cb_edit_preferences (GtkAction *action, gpointer data);
 void            cb_help_contents (GtkAction *action, gpointer data);
 void            cb_about (GtkAction *action, gpointer data);
 
-void            cb_app_exit (GtkAction *action, gpointer data);
-gboolean        cb_app_delete (GtkWidget *window, GdkEventAny *event, gpointer data);
+gboolean        cb_main_window_delete (GtkWidget *window, GdkEvent *event, gpointer data);
 
 void            cb_end_process_button_pressed (GtkButton *button, gpointer data);
 void            cb_logout (GtkButton *button, gpointer data);
diff --git a/src/cgroups.cpp b/src/cgroups.cpp
index eafa1e3..d77b9aa 100644
--- a/src/cgroups.cpp
+++ b/src/cgroups.cpp
@@ -3,7 +3,7 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 
-#include "procman.h"
+#include "procman-app.h"
 #include "util.h"
 
 gboolean
diff --git a/src/cgroups.h b/src/cgroups.h
index 8c42f6f..0bf3947 100644
--- a/src/cgroups.h
+++ b/src/cgroups.h
@@ -3,7 +3,7 @@
 
 #include <glib.h>
 
-#include "procman.h"
+#include "procman-app.h"
 
 void
 get_process_cgroup_info (ProcInfo *info);
diff --git a/src/disks.cpp b/src/disks.cpp
index 0638558..5047cb7 100644
--- a/src/disks.cpp
+++ b/src/disks.cpp
@@ -7,7 +7,7 @@
 #include <glibtop/fsusage.h>
 #include <glib/gi18n.h>
 
-#include "procman.h"
+#include "procman-app.h"
 #include "disks.h"
 #include "util.h"
 #include "interface.h"
@@ -218,21 +218,20 @@ add_disk(GtkListStore *list, const glibtop_mountentry *entry, bool show_all_fs)
 int
 cb_update_disks(gpointer data)
 {
-    ProcData *const procdata = static_cast<ProcData*>(data);
-
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
     GtkListStore *list;
     glibtop_mountentry * entries;
     glibtop_mountlist mountlist;
     guint i;
 
-    list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(procdata->disk_list)));
+    list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->disk_list)));
 
-    entries = glibtop_get_mountlist(&mountlist, procdata->config.show_all_fs);
+    entries = glibtop_get_mountlist(&mountlist, app->config.show_all_fs);
 
     remove_old_disks(GTK_TREE_MODEL(list), entries, mountlist.number);
 
     for (i = 0; i < mountlist.number; i++)
-        add_disk(list, &entries[i], procdata->config.show_all_fs);
+        add_disk(list, &entries[i], app->config.show_all_fs);
 
     g_free(entries);
 
@@ -241,11 +240,11 @@ cb_update_disks(gpointer data)
 
 
 static void
-cb_disk_columns_changed(GtkTreeView *treeview, gpointer user_data)
+cb_disk_columns_changed(GtkTreeView *treeview, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(user_data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
-    procman_save_tree_state(procdata->settings,
+    procman_save_tree_state(app->settings,
                             GTK_WIDGET(treeview),
                             "disktreenew");
 }
@@ -284,8 +283,14 @@ static void open_dir(GtkTreeView       *tree_view,
     g_free(dir);
 }
 
+static void
+cb_disk_list_destroying (GtkWidget *self, gpointer data)
+{
+    g_signal_handlers_disconnect_by_func(self, (gpointer) cb_disk_columns_changed, data);
+}
+
 void
-create_disk_view(ProcData *procdata, GtkBuilder *builder)
+create_disk_view(ProcmanApp *app, GtkBuilder *builder)
 {
     GtkWidget *scrolled;
     GtkWidget *disk_tree;
@@ -320,7 +325,7 @@ create_disk_view(ProcData *procdata, GtkBuilder *builder)
 
     disk_tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
     g_signal_connect(G_OBJECT(disk_tree), "row-activated", G_CALLBACK(open_dir), NULL);
-    procdata->disk_list = disk_tree;
+    app->disk_list = disk_tree;
     gtk_container_add(GTK_CONTAINER(scrolled), disk_tree);
     gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(disk_tree), TRUE);
     g_object_unref(G_OBJECT(model));
@@ -397,10 +402,14 @@ create_disk_view(ProcData *procdata, GtkBuilder *builder)
 
     /* numeric sort */
 
-    procman_get_tree_state(procdata->settings, disk_tree,
+    procman_get_tree_state(app->settings, disk_tree,
                            "disktreenew");
 
+    g_signal_connect (G_OBJECT(disk_tree), "destroy",
+                      G_CALLBACK(cb_disk_list_destroying),
+                      app);
+
     g_signal_connect (G_OBJECT(disk_tree), "columns-changed",
-                      G_CALLBACK(cb_disk_columns_changed), procdata);
+                      G_CALLBACK(cb_disk_columns_changed), app);
 
 }
diff --git a/src/disks.h b/src/disks.h
index 311cd9e..d3acf47 100644
--- a/src/disks.h
+++ b/src/disks.h
@@ -1,10 +1,10 @@
 #ifndef H_GNOME_SYSTEM_MONITOR_DISKS_1123719137
 #define H_GNOME_SYSTEM_MONITOR_DISKS_1123719137
 
-#include "procman.h"
+#include "procman-app.h"
 
 void
-create_disk_view(ProcData *procdata, GtkBuilder *builder);
+create_disk_view(ProcmanApp *app, GtkBuilder *builder);
 
 int
 cb_update_disks(gpointer procdata);
diff --git a/src/interface.cpp b/src/interface.cpp
index 379faaa..5d45c53 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -30,7 +30,6 @@
 #include <gdk/gdkkeysyms.h>
 #include <math.h>
 
-#include "procman.h"
 #include "callbacks.h"
 #include "interface.h"
 #include "proctable.h"
@@ -124,7 +123,7 @@ make_title_label (const char *text)
 }
 
 static void 
-create_proc_view(ProcData *procdata, GtkBuilder * builder) 
+create_proc_view(ProcmanApp *app, GtkBuilder * builder)
 {
     GtkWidget *proctree;
     GtkWidget *scrolled;
@@ -135,34 +134,34 @@ create_proc_view(ProcData *procdata, GtkBuilder * builder)
 
     /* create the processes tab */
     string = make_loadavg_string ();
-    procdata->loadavg = GTK_WIDGET (gtk_builder_get_object (builder, "load_avg_label"));
-    gtk_label_set_text (GTK_LABEL (procdata->loadavg), string);
+    app->loadavg = GTK_WIDGET (gtk_builder_get_object (builder, "load_avg_label"));
+    gtk_label_set_text (GTK_LABEL (app->loadavg), string);
     g_free (string);
 
-    proctree = proctable_new (procdata);
+    proctree = proctable_new (app);
     scrolled = GTK_WIDGET (gtk_builder_get_object (builder, "processes_scrolled"));
 
     gtk_container_add (GTK_CONTAINER (scrolled), proctree);
 
-    procdata->endprocessbutton = GTK_WIDGET (gtk_builder_get_object (builder, "endprocessbutton"));
-    g_signal_connect (G_OBJECT (procdata->endprocessbutton), "clicked",
-                      G_CALLBACK (cb_end_process_button_pressed), procdata);
+    app->endprocessbutton = GTK_WIDGET (gtk_builder_get_object (builder, "endprocessbutton"));
+    g_signal_connect (G_OBJECT (app->endprocessbutton), "clicked",
+                      G_CALLBACK (cb_end_process_button_pressed), app);
 
     button = GTK_WIDGET (gtk_builder_get_object (builder, "viewmenubutton"));
-    viewmenu = gtk_ui_manager_get_widget (procdata->uimanager, "/ViewMenu");
+    viewmenu = gtk_ui_manager_get_widget (app->uimanager, "/ViewMenu");
     gtk_widget_set_halign (viewmenu, GTK_ALIGN_END);
     gtk_menu_button_set_popup (GTK_MENU_BUTTON (button), viewmenu);
 
     button = GTK_WIDGET (gtk_builder_get_object (builder, "refreshbutton"));
-    action = gtk_action_group_get_action (procdata->action_group, "Refresh");
+    action = gtk_action_group_get_action (app->action_group, "Refresh");
     gtk_activatable_set_related_action (GTK_ACTIVATABLE (button), action);
 
     /* create popup_menu for the processes tab */
-    procdata->popup_menu = gtk_ui_manager_get_widget (procdata->uimanager, "/PopupMenu");
+    app->popup_menu = gtk_ui_manager_get_widget (app->uimanager, "/PopupMenu");
 }
 
 static void
-create_sys_view (ProcData *procdata, GtkBuilder * builder)
+create_sys_view (ProcmanApp *app, GtkBuilder * builder)
 {
     GtkWidget *cpu_graph_box, *mem_graph_box, *net_graph_box;
     GtkWidget *label,*cpu_label;
@@ -192,7 +191,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
 
     GtkWidget* cpu_table = GTK_WIDGET (gtk_builder_get_object (builder, "cpu_table"));
     gint cols = 4;
-    for (i=0;i<procdata->config.num_cpus; i++) {
+    for (i=0;i<app->config.num_cpus; i++) {
         GtkWidget *temp_hbox;
 
         temp_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
@@ -212,7 +211,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
                           G_CALLBACK (cb_cpu_color_changed), GINT_TO_POINTER (i));
         gtk_box_pack_start (GTK_BOX (temp_hbox), color_picker, FALSE, TRUE, 0);
         gtk_widget_set_size_request(GTK_WIDGET(color_picker), 32, -1);
-        if(procdata->config.num_cpus == 1) {
+        if(app->config.num_cpus == 1) {
             label_text = g_strdup (_("CPU"));
         } else {
             label_text = g_strdup_printf (_("CPU%d"), i+1);
@@ -231,7 +230,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
 
     }
 
-    procdata->cpu_graph = cpu_graph;
+    app->cpu_graph = cpu_graph;
 
     /** The memory box */
     mem_graph_box = GTK_WIDGET (gtk_builder_get_object (builder, "mem_graph_box"));
@@ -247,7 +246,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
 
     color_picker = load_graph_get_mem_color_picker(mem_graph);
     g_signal_connect (G_OBJECT (color_picker), "color_set",
-                      G_CALLBACK (cb_mem_color_changed), procdata);
+                      G_CALLBACK (cb_mem_color_changed), app);
     title_text = g_strdup_printf(title_template, _("Memory"));
     gsm_color_button_set_title(GSM_COLOR_BUTTON(color_picker), title_text);
     g_free(title_text);
@@ -258,7 +257,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
 
     color_picker = load_graph_get_swap_color_picker(mem_graph);
     g_signal_connect (G_OBJECT (color_picker), "color_set",
-                      G_CALLBACK (cb_swap_color_changed), procdata);
+                      G_CALLBACK (cb_swap_color_changed), app);
     title_text = g_strdup_printf(title_template, _("Swap"));
     gsm_color_button_set_title(GSM_COLOR_BUTTON(color_picker), title_text);
     g_free(title_text);
@@ -266,7 +265,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
 
     gtk_grid_attach (GTK_GRID (table),  load_graph_get_labels(mem_graph)->swap, 3, 1, 1, 1);
 
-    procdata->mem_graph = mem_graph;
+    app->mem_graph = mem_graph;
 
     /* The net box */
     net_graph_box = GTK_WIDGET (gtk_builder_get_object (builder, "net_graph_box"));
@@ -283,7 +282,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
     color_picker = gsm_color_button_new (
         &net_graph->colors.at(0), GSMCP_TYPE_NETWORK_IN);
     g_signal_connect (G_OBJECT (color_picker), "color_set",
-                      G_CALLBACK (cb_net_in_color_changed), procdata);
+                      G_CALLBACK (cb_net_in_color_changed), app);
     title_text = g_strdup_printf(title_template, _("Receiving"));
     gsm_color_button_set_title(GSM_COLOR_BUTTON(color_picker), title_text);
     g_free(title_text);
@@ -298,7 +297,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
     color_picker = gsm_color_button_new (
         &net_graph->colors.at(1), GSMCP_TYPE_NETWORK_OUT);
     g_signal_connect (G_OBJECT (color_picker), "color_set",
-                      G_CALLBACK (cb_net_out_color_changed), procdata);
+                      G_CALLBACK (cb_net_out_color_changed), app);
     title_text = g_strdup_printf(title_template, _("Sending"));
     gsm_color_button_set_title(GSM_COLOR_BUTTON(color_picker), title_text);
     g_free(title_text);
@@ -312,7 +311,7 @@ create_sys_view (ProcData *procdata, GtkBuilder * builder)
 
     gtk_grid_attach (GTK_GRID (table),  load_graph_get_labels(net_graph)->net_out_total, 6, 1, 1, 1);
 
-    procdata->net_graph = net_graph;
+    app->net_graph = net_graph;
     g_free(title_template);
 
 }
@@ -324,11 +323,11 @@ on_activate_about (GSimpleAction *, GVariant *, gpointer data)
 }
 
 void
-create_main_window (ProcData *procdata, GtkApplication *application)
+create_main_window (ProcmanApp *app)
 {
     gint i;
     gint width, height, xpos, ypos;
-    GtkWidget *app;
+    GtkWidget *main_window;
     GtkAction *action;
     GtkWidget *notebook;
 
@@ -338,102 +337,105 @@ create_main_window (ProcData *procdata, GtkApplication *application)
     gtk_builder_add_from_file (builder, filename, NULL);
     g_free (filename);
 
-    app = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
-    gtk_window_set_application (GTK_WINDOW (app), application);
+    main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
+    gtk_window_set_application (GTK_WINDOW (main_window), app->gobj());
+    gtk_widget_set_name (main_window, "gnome-system-monitor");
 
     GActionEntry win_action_entries[] = {
         { "about", on_activate_about, NULL, NULL, NULL }
     };
 
-    g_action_map_add_action_entries (G_ACTION_MAP (app),
+    g_action_map_add_action_entries (G_ACTION_MAP (main_window),
                                      win_action_entries,
                                      G_N_ELEMENTS (win_action_entries),
-                                     procdata);
+                                     app);
 
-    GdkScreen* screen = gtk_widget_get_screen(app);
+    GdkScreen* screen = gtk_widget_get_screen(main_window);
     GdkVisual* visual = gdk_screen_get_rgba_visual(screen);
 
     /* use visual, if available */
     if (visual)
-        gtk_widget_set_visual(app, visual);
-
-    width = procdata->config.width;
-    height = procdata->config.height;
-    xpos = procdata->config.xpos;
-    ypos = procdata->config.ypos;
-    gtk_window_set_default_size (GTK_WINDOW (app), width, height);
-    gtk_window_move(GTK_WINDOW (app), xpos, ypos);
-    if (procdata->config.maximized) {
-        gtk_window_maximize(GTK_WINDOW(app));
+        gtk_widget_set_visual(main_window, visual);
+
+    width = app->config.width;
+    height = app->config.height;
+    xpos = app->config.xpos;
+    ypos = app->config.ypos;
+    gtk_window_set_default_size (GTK_WINDOW (main_window), width, height);
+    gtk_window_move(GTK_WINDOW (main_window), xpos, ypos);
+    if (app->config.maximized) {
+        gtk_window_maximize(GTK_WINDOW(main_window));
     }
 
-    procdata->uimanager = gtk_ui_manager_new ();
+    app->uimanager = gtk_ui_manager_new ();
 
-    gtk_window_add_accel_group (GTK_WINDOW (app),
-                                gtk_ui_manager_get_accel_group (procdata->uimanager));
+    gtk_window_add_accel_group (GTK_WINDOW (main_window),
+                                gtk_ui_manager_get_accel_group (app->uimanager));
 
     filename = g_build_filename (GSM_DATA_DIR, "popups.ui", NULL);
 
-    if (!gtk_ui_manager_add_ui_from_file (procdata->uimanager,
+    if (!gtk_ui_manager_add_ui_from_file (app->uimanager,
                                             filename,
                                             NULL)) {
         g_error("building menus failed");
     }
     g_free (filename);
-    procdata->action_group = gtk_action_group_new ("ProcmanActions");
-    gtk_action_group_set_translation_domain (procdata->action_group, NULL);
-    gtk_action_group_add_actions (procdata->action_group,
+    app->action_group = gtk_action_group_new ("ProcmanActions");
+    gtk_action_group_set_translation_domain (app->action_group, NULL);
+    gtk_action_group_add_actions (app->action_group,
                                   menu_entries,
                                   G_N_ELEMENTS (menu_entries),
-                                  procdata);
-    gtk_action_group_add_toggle_actions (procdata->action_group,
+                                  app);
+    gtk_action_group_add_toggle_actions (app->action_group,
                                          toggle_menu_entries,
                                          G_N_ELEMENTS (toggle_menu_entries),
-                                         procdata);
+                                         app);
 
-    gtk_action_group_add_radio_actions (procdata->action_group,
+    gtk_action_group_add_radio_actions (app->action_group,
                                         radio_menu_entries,
                                         G_N_ELEMENTS (radio_menu_entries),
-                                        procdata->config.whose_process,
+                                        app->config.whose_process,
                                         G_CALLBACK(cb_radio_processes),
-                                        procdata);
+                                        app);
 
-    gtk_action_group_add_radio_actions (procdata->action_group,
+    gtk_action_group_add_radio_actions (app->action_group,
                                         priority_menu_entries,
                                         G_N_ELEMENTS (priority_menu_entries),
                                         NORMAL_PRIORITY,
                                         G_CALLBACK(cb_renice),
-                                        procdata);
+                                        app);
 
-    gtk_ui_manager_insert_action_group (procdata->uimanager,
-                                        procdata->action_group,
+    gtk_ui_manager_insert_action_group (app->uimanager,
+                                        app->action_group,
                                         0);
 
     /* create the main notebook */
-    procdata->notebook = notebook = GTK_WIDGET (gtk_builder_get_object (builder, "notebook"));
+    app->notebook = notebook = GTK_WIDGET (gtk_builder_get_object (builder, "notebook"));
 
-    create_proc_view(procdata, builder);
 
-    create_sys_view (procdata, builder);
-    
-    create_disk_view (procdata, builder);
+    create_proc_view(app, builder);
+
+    create_sys_view (app, builder);
     
+    create_disk_view (app, builder);
+
+
     g_signal_connect (G_OBJECT (notebook), "switch-page",
-                      G_CALLBACK (cb_switch_page), procdata);
+                      G_CALLBACK (cb_switch_page), app);
     g_signal_connect (G_OBJECT (notebook), "change-current-page",
-                      G_CALLBACK (cb_change_current_page), procdata);
+                      G_CALLBACK (cb_change_current_page), app);
 
     gtk_widget_show_all(notebook); // need to make page switch work
-    gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), procdata->config.current_tab);
-    cb_change_current_page (GTK_NOTEBOOK (notebook), procdata->config.current_tab, procdata);
-    g_signal_connect (G_OBJECT (app), "delete_event",
-                      G_CALLBACK (cb_app_delete),
-                      procdata);
+    gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), app->config.current_tab);
+    cb_change_current_page (GTK_NOTEBOOK (notebook), app->config.current_tab, app);
+    g_signal_connect (G_OBJECT (main_window), "delete_event",
+                      G_CALLBACK (cb_main_window_delete),
+                      app);
 
     GtkAccelGroup *accel_group;
     GClosure *goto_tab_closure[4];
     accel_group = gtk_accel_group_new ();
-    gtk_window_add_accel_group (GTK_WINDOW(app), accel_group);
+    gtk_window_add_accel_group (GTK_WINDOW(main_window), accel_group);
     for (i = 0; i < 4; ++i) {
         goto_tab_closure[i] = g_cclosure_new_swap (G_CALLBACK (cb_proc_goto_tab),
                                                    GINT_TO_POINTER (i), NULL);
@@ -441,21 +443,21 @@ create_main_window (ProcData *procdata, GtkApplication *application)
                                  GDK_MOD1_MASK, GTK_ACCEL_VISIBLE,
                                  goto_tab_closure[i]);
     }
-    action = gtk_action_group_get_action (procdata->action_group, "ShowDependencies");
+    action = gtk_action_group_get_action (app->action_group, "ShowDependencies");
     gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
-                                  procdata->config.show_tree);
+                                  app->config.show_tree);
 
     
     gtk_builder_connect_signals (builder, NULL);
 
-    gtk_widget_show_all(app);
-    procdata->app = app;
+    gtk_widget_show_all(main_window);
+    app->main_window = main_window;
 
     g_object_unref (G_OBJECT (builder));
 }
 
 void
-do_popup_menu (ProcData *procdata, GdkEventButton *event)
+do_popup_menu (ProcmanApp *app, GdkEventButton *event)
 {
     guint button;
     guint32 event_time;
@@ -469,12 +471,12 @@ do_popup_menu (ProcData *procdata, GdkEventButton *event)
         event_time = gtk_get_current_event_time ();
     }
 
-    gtk_menu_popup (GTK_MENU (procdata->popup_menu), NULL, NULL,
+    gtk_menu_popup (GTK_MENU (app->popup_menu), NULL, NULL,
                     NULL, NULL, button, event_time);
 }
 
 void
-update_sensitivity(ProcData *data)
+update_sensitivity(ProcmanApp *app)
 {
     const char * const selected_actions[] = { "StopProcess",
                                               "ContProcess",
@@ -496,43 +498,43 @@ update_sensitivity(ProcData *data)
     gboolean processes_sensitivity, selected_sensitivity;
     GtkAction *action;
 
-    processes_sensitivity = (data->config.current_tab == PROCMAN_TAB_PROCESSES);
-    selected_sensitivity = (processes_sensitivity && data->selected_process != NULL);
+    processes_sensitivity = (app->config.current_tab == PROCMAN_TAB_PROCESSES);
+    selected_sensitivity = (processes_sensitivity && app->selected_process != NULL);
 
-    if(data->endprocessbutton) {
+    if(app->endprocessbutton) {
         /* avoid error on startup if endprocessbutton
            has not been built yet */
-        gtk_widget_set_sensitive(data->endprocessbutton, selected_sensitivity);
+        gtk_widget_set_sensitive(app->endprocessbutton, selected_sensitivity);
     }
 
     for (i = 0; i != G_N_ELEMENTS(processes_actions); ++i) {
-        action = gtk_action_group_get_action(data->action_group,
+        action = gtk_action_group_get_action(app->action_group,
                                              processes_actions[i]);
         gtk_action_set_sensitive(action, processes_sensitivity);
     }
 
     for (i = 0; i != G_N_ELEMENTS(selected_actions); ++i) {
-        action = gtk_action_group_get_action(data->action_group,
+        action = gtk_action_group_get_action(app->action_group,
                                              selected_actions[i]);
         gtk_action_set_sensitive(action, selected_sensitivity);
     }
 }
 
 void
-block_priority_changed_handlers(ProcData *data, bool block)
+block_priority_changed_handlers(ProcmanApp *app, bool block)
 {
     gint i;
     if (block) {
         for (i = 0; i != G_N_ELEMENTS(priority_menu_entries); ++i) {
-            GtkRadioAction *action = GTK_RADIO_ACTION(gtk_action_group_get_action(data->action_group,
+            GtkRadioAction *action = GTK_RADIO_ACTION(gtk_action_group_get_action(app->action_group,
                                              priority_menu_entries[i].name));
-            g_signal_handlers_block_by_func(action, (gpointer)cb_renice, data);
+            g_signal_handlers_block_by_func(action, (gpointer)cb_renice, app);
         }
     } else {
         for (i = 0; i != G_N_ELEMENTS(priority_menu_entries); ++i) {
-            GtkRadioAction *action = GTK_RADIO_ACTION(gtk_action_group_get_action(data->action_group,
+            GtkRadioAction *action = GTK_RADIO_ACTION(gtk_action_group_get_action(app->action_group,
                                              priority_menu_entries[i].name));
-            g_signal_handlers_unblock_by_func(action, (gpointer)cb_renice, data);
+            g_signal_handlers_unblock_by_func(action, (gpointer)cb_renice, app);
         }
     }
 }
@@ -540,11 +542,12 @@ block_priority_changed_handlers(ProcData *data, bool block)
 static void
 cb_toggle_tree (GtkAction *action, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-    GSettings *settings = procdata->settings;       gboolean show;
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    GSettings *settings = app->settings;
+    gboolean show;
 
     show = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
-    if (show == procdata->config.show_tree)
+    if (show == app->config.show_tree)
         return;
 
     g_settings_set_boolean (settings, "show-tree", show);
@@ -553,6 +556,6 @@ cb_toggle_tree (GtkAction *action, gpointer data)
 static void
 cb_proc_goto_tab (gint tab)
 {
-    ProcData *data = ProcData::get_instance ();
-    gtk_notebook_set_current_page (GTK_NOTEBOOK (data->notebook), tab);
+    Glib::RefPtr<ProcmanApp> app = ProcmanApp::get();
+    gtk_notebook_set_current_page (GTK_NOTEBOOK (app->notebook), tab);
 }
diff --git a/src/interface.h b/src/interface.h
index d6bb336..48a4a54 100644
--- a/src/interface.h
+++ b/src/interface.h
@@ -22,12 +22,12 @@
 
 #include <glib.h>
 #include <gtk/gtk.h>
-#include "procman.h"
+#include "procman-app.h"
 
-void            create_main_window (ProcData *data, GtkApplication *application);
-void            update_sensitivity (ProcData *data);
-void            block_priority_changed_handlers(ProcData *data, bool block);
-void            do_popup_menu(ProcData *data, GdkEventButton *event);
+void            create_main_window (ProcmanApp *app);
+void            update_sensitivity (ProcmanApp *app);
+void            block_priority_changed_handlers(ProcmanApp *app, bool block);
+void            do_popup_menu(ProcmanApp *app, GdkEventButton *event);
 GtkWidget *     make_title_label (const char *text);
 
 #endif /* _PROCMAN_INTERFACE_H_ */
diff --git a/src/load-graph.cpp b/src/load-graph.cpp
index c9e3fcd..6a026ec 100644
--- a/src/load-graph.cpp
+++ b/src/load-graph.cpp
@@ -23,7 +23,7 @@
 
 #include <algorithm>
 
-#include "procman.h"
+#include "procman-app.h"
 #include "load-graph.h"
 #include "util.h"
 #include "gsm_color_button.h"
@@ -91,7 +91,7 @@ void draw_background(LoadGraph *graph) {
     cr = cairo_create (graph->background);
 
     // set the background colour
-    GtkStyle *style = gtk_widget_get_style (ProcData::get_instance()->notebook);
+    GtkStyle *style = gtk_widget_get_style (ProcmanApp::get()->notebook);
     gdk_cairo_set_source_color (cr, &style->bg[GTK_STATE_NORMAL]);
     cairo_paint (cr);
 
@@ -443,7 +443,7 @@ net_scale (LoadGraph *graph, guint64 din, guint64 dout)
 
     const guint64 bak_max(new_max);
 
-    if (ProcData::get_instance()->config.network_in_bits) {
+    if (ProcmanApp::get()->config.network_in_bits) {
         // nice number is for the ticks
         unsigned ticks = graph->num_bars();
 
@@ -686,7 +686,7 @@ LoadGraph::LoadGraph(guint type)
     switch (type) {
         case LOAD_GRAPH_CPU:
             memset(&cpu, 0, sizeof cpu);
-            n = ProcData::get_instance()->config.num_cpus;
+            n = ProcmanApp::get()->config.num_cpus;
 
             for(guint i = 0; i < G_N_ELEMENTS(labels.cpu); ++i)
                 labels.cpu[i] = gtk_label_new(NULL);
@@ -720,26 +720,26 @@ LoadGraph::LoadGraph(guint type)
             break;
     }
 
-    speed  = ProcData::get_instance()->config.graph_update_interval;
+    speed  = ProcmanApp::get()->config.graph_update_interval;
 
     colors.resize(n);
 
     switch (type) {
         case LOAD_GRAPH_CPU:
-            memcpy(&colors[0], ProcData::get_instance()->config.cpu_color,
+            memcpy(&colors[0], ProcmanApp::get()->config.cpu_color,
                    n * sizeof colors[0]);
             break;
         case LOAD_GRAPH_MEM:
-            colors[0] = ProcData::get_instance()->config.mem_color;
-            colors[1] = ProcData::get_instance()->config.swap_color;
+            colors[0] = ProcmanApp::get()->config.mem_color;
+            colors[1] = ProcmanApp::get()->config.swap_color;
             mem_color_picker = gsm_color_button_new (&colors[0],
                                                         GSMCP_TYPE_PIE);
             swap_color_picker = gsm_color_button_new (&colors[1],
                                                          GSMCP_TYPE_PIE);
             break;
         case LOAD_GRAPH_NET:
-            colors[0] = ProcData::get_instance()->config.net_in_color;
-            colors[1] = ProcData::get_instance()->config.net_out_color;
+            colors[0] = ProcmanApp::get()->config.net_in_color;
+            colors[1] = ProcmanApp::get()->config.net_out_color;
             break;
     }
 
diff --git a/src/lsof.cpp b/src/lsof.cpp
index 430a080..c9406dc 100644
--- a/src/lsof.cpp
+++ b/src/lsof.cpp
@@ -16,7 +16,7 @@
 
 #include <glibmm/regex.h>
 
-#include "procman.h"
+#include "procman-app.h"
 #include "lsof.h"
 #include "util.h"
 
@@ -89,7 +89,7 @@ namespace
         GtkEntry *entry;
         GtkWindow *window;
         GtkLabel *count;
-        ProcData *procdata;
+        ProcmanApp *app;
         bool case_insensitive;
 
 
@@ -235,7 +235,7 @@ namespace
 
 
 
-void procman_lsof(ProcData *procdata)
+void procman_lsof(ProcmanApp *app)
 {
     GtkListStore *model = \
         gtk_list_store_new(PROCMAN_LSOF_NCOLS,
@@ -312,7 +312,7 @@ void procman_lsof(ProcData *procdata)
 
     dialog = GTK_WIDGET (gtk_builder_get_object (builder, "lsof_dialog"));
 
-    gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(procdata->app));
+    gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(app->main_window));
 
     // entry = sexy_icon_entry_new();
     // sexy_icon_entry_add_clear_button(SEXY_ICON_ENTRY(entry));
@@ -333,7 +333,7 @@ void procman_lsof(ProcData *procdata)
     gtk_container_add(GTK_CONTAINER(scrolled), tree);
 
     GUI *gui = new GUI; // wil be deleted by the close button or delete-event
-    gui->procdata = procdata;
+    gui->app = app;
     gui->model = model;
     gui->window = GTK_WINDOW(dialog);
     gui->entry = GTK_ENTRY(entry);
diff --git a/src/lsof.h b/src/lsof.h
index da420e2..60c4766 100644
--- a/src/lsof.h
+++ b/src/lsof.h
@@ -2,8 +2,8 @@
 #define H_PROCMAN_LSOF_1161179202
 
 #include <glib.h>
-#include "procman.h"
+#include "procman-app.h"
 
-void procman_lsof(ProcData *data);
+void procman_lsof(ProcmanApp *app);
 
 #endif /* H_PROCMAN_LSOF_1161179202 */
diff --git a/src/memmaps.cpp b/src/memmaps.cpp
index 9b5bbb0..49df912 100644
--- a/src/memmaps.cpp
+++ b/src/memmaps.cpp
@@ -14,7 +14,7 @@
 using std::string;
 
 
-#include "procman.h"
+#include "procman-app.h"
 #include "memmaps.h"
 #include "proctable.h"
 #include "util.h"
@@ -329,7 +329,7 @@ dialog_response (GtkDialog * dialog, gint response_id, gpointer data)
 
 
 static MemMapsData*
-create_memmapsdata (ProcData *procdata)
+create_memmapsdata (ProcmanApp *app)
 {
     GtkWidget *tree;
     GtkListStore *model;
@@ -425,7 +425,7 @@ create_memmapsdata (ProcData *procdata)
         }
     }
 
-    return new MemMapsData(tree, procdata->settings);
+    return new MemMapsData(tree, app->settings);
 }
 
 
@@ -448,7 +448,7 @@ static void
 create_single_memmaps_dialog (GtkTreeModel *model, GtkTreePath *path,
                               GtkTreeIter *iter, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
     MemMapsData *mmdata;
     GtkWidget *memmapsdialog;
     GtkWidget *dialog_vbox;
@@ -461,10 +461,10 @@ create_single_memmaps_dialog (GtkTreeModel *model, GtkTreePath *path,
     if (!info)
         return;
 
-    mmdata = create_memmapsdata (procdata);
+    mmdata = create_memmapsdata (app);
     mmdata->info = info;
 
-    memmapsdialog = gtk_dialog_new_with_buttons (_("Memory Maps"), GTK_WINDOW (procdata->app),
+    memmapsdialog = gtk_dialog_new_with_buttons (_("Memory Maps"), GTK_WINDOW (app->main_window),
                                                  GTK_DIALOG_DESTROY_WITH_PARENT,
                                                  GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
                                                  NULL);
@@ -506,9 +506,9 @@ create_single_memmaps_dialog (GtkTreeModel *model, GtkTreePath *path,
 
 
 void
-create_memmaps_dialog (ProcData *procdata)
+create_memmaps_dialog (ProcmanApp *app)
 {
     /* TODO: do we really want to open multiple dialogs ? */
-    gtk_tree_selection_selected_foreach (procdata->selection, create_single_memmaps_dialog,
-                                         procdata);
+    gtk_tree_selection_selected_foreach (app->selection, create_single_memmaps_dialog,
+                                         app);
 }
diff --git a/src/memmaps.h b/src/memmaps.h
index b79476e..014591b 100644
--- a/src/memmaps.h
+++ b/src/memmaps.h
@@ -2,8 +2,8 @@
 #define _PROCMAN_MEMMAPS_H_
 
 #include <glib.h>
-#include "procman.h"
+#include "procman-app.h"
 
-void            create_memmaps_dialog (ProcData *procdata);
+void            create_memmaps_dialog (ProcmanApp *app);
 
 #endif /* _PROCMAN_MEMMAPS_H_ */
diff --git a/src/openfiles.cpp b/src/openfiles.cpp
index 9c4b36f..f9a6877 100644
--- a/src/openfiles.cpp
+++ b/src/openfiles.cpp
@@ -9,7 +9,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
-#include "procman.h"
+#include "procman-app.h"
 #include "openfiles.h"
 #include "proctable.h"
 #include "util.h"
@@ -235,7 +235,7 @@ close_openfiles_dialog (GtkDialog *dialog, gint id, gpointer data)
 
 
 static GtkWidget *
-create_openfiles_tree (ProcData *procdata)
+create_openfiles_tree (ProcmanApp *app)
 {
     GtkWidget *tree;
     GtkListStore *model;
@@ -292,7 +292,7 @@ create_openfiles_tree (ProcData *procdata)
   GTK_SORT_ASCENDING);*/
 #endif
 
-    procman_get_tree_state (procdata->settings, tree, procman::settings::open_files_tree_prefix.c_str());
+    procman_get_tree_state (app->settings, tree, procman::settings::open_files_tree_prefix.c_str());
 
     return tree;
 
@@ -318,7 +318,7 @@ static void
 create_single_openfiles_dialog (GtkTreeModel *model, GtkTreePath *path,
                                 GtkTreeIter *iter, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
     GtkWidget *openfilesdialog;
     GtkWidget *cmd_grid;
     GtkWidget *label;
@@ -351,10 +351,10 @@ create_single_openfiles_dialog (GtkTreeModel *model, GtkTreePath *path,
 
     scrolled = GTK_WIDGET (gtk_builder_get_object (builder, "scrolled"));
 
-    tree = create_openfiles_tree (procdata);
+    tree = create_openfiles_tree (app);
     gtk_container_add (GTK_CONTAINER (scrolled), tree);
     g_object_set_data (G_OBJECT (tree), "selected_info", info);
-    g_object_set_data (G_OBJECT (tree), "settings", procdata->settings);
+    g_object_set_data (G_OBJECT (tree), "settings", app->settings);
 
     g_signal_connect (G_OBJECT (openfilesdialog), "response",
                       G_CALLBACK (close_openfiles_dialog), tree);
@@ -374,8 +374,8 @@ create_single_openfiles_dialog (GtkTreeModel *model, GtkTreePath *path,
 
 
 void
-create_openfiles_dialog (ProcData *procdata)
+create_openfiles_dialog (ProcmanApp *app)
 {
-    gtk_tree_selection_selected_foreach (procdata->selection, create_single_openfiles_dialog,
-                                         procdata);
+    gtk_tree_selection_selected_foreach (app->selection, create_single_openfiles_dialog,
+                                         app);
 }
diff --git a/src/openfiles.h b/src/openfiles.h
index d135942..f5a7e1c 100644
--- a/src/openfiles.h
+++ b/src/openfiles.h
@@ -3,8 +3,8 @@
 
 #include <glib.h>
 
-#include "procman.h"
+#include "procman-app.h"
 
-void            create_openfiles_dialog (ProcData *procdata);
+void            create_openfiles_dialog (ProcmanApp *app);
 
 #endif
diff --git a/src/procactions.cpp b/src/procactions.cpp
index a359d43..db91b2f 100644
--- a/src/procactions.cpp
+++ b/src/procactions.cpp
@@ -26,7 +26,7 @@
 #include <sys/time.h>
 #include <sys/resource.h>
 #include "procactions.h"
-#include "procman.h"
+#include "procman-app.h"
 #include "proctable.h"
 #include "procdialogs.h"
 #include "callbacks.h"
@@ -61,7 +61,7 @@ renice_single_process (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter
         gboolean success;
 
         success = procdialog_create_root_password_dialog (
-            PROCMAN_ACTION_RENICE, args->procdata, info->pid,
+            PROCMAN_ACTION_RENICE, args->app, info->pid,
             args->nice_value);
 
         if(success) return;
@@ -91,24 +91,24 @@ renice_single_process (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter
 
 
 void
-renice (ProcData *procdata, int nice)
+renice (ProcmanApp *app, int nice)
 {
-    struct ReniceArgs args = { procdata, nice };
+    struct ReniceArgs args = { app, nice };
 
     /* EEEK - ugly hack - make sure the table is not updated as a crash
     ** occurs if you first kill a process and the tree node is removed while
     ** still in the foreach function
     */
-    g_source_remove(procdata->timeout);
+    g_source_remove(app->timeout);
 
-    gtk_tree_selection_selected_foreach(procdata->selection, renice_single_process,
+    gtk_tree_selection_selected_foreach(app->selection, renice_single_process,
                                         &args);
 
-    procdata->timeout = g_timeout_add(procdata->config.update_interval,
-                                      cb_timeout,
-                                      procdata);
+    app->timeout = g_timeout_add(app->config.update_interval,
+                                 cb_timeout,
+                                 app);
 
-    proctable_update_all (procdata);
+    proctable_update_all (app);
 }
 
 
@@ -141,7 +141,7 @@ kill_single_process (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
         gboolean success;
 
         success = procdialog_create_root_password_dialog (
-            PROCMAN_ACTION_KILL, args->procdata, info->pid,
+            PROCMAN_ACTION_KILL, args->app, info->pid,
             args->signal);
 
         if(success) return;
@@ -171,21 +171,21 @@ kill_single_process (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
 
 
 void
-kill_process (ProcData *procdata, int sig)
+kill_process (ProcmanApp *app, int sig)
 {
-    struct KillArgs args = { procdata, sig };
+    struct KillArgs args = { app, sig };
 
     /* EEEK - ugly hack - make sure the table is not updated as a crash
     ** occurs if you first kill a process and the tree node is removed while
     ** still in the foreach function
     */
-    g_source_remove (procdata->timeout);
+    g_source_remove (app->timeout);
 
-    gtk_tree_selection_selected_foreach (procdata->selection, kill_single_process,
+    gtk_tree_selection_selected_foreach (app->selection, kill_single_process,
                                          &args);
 
-    procdata->timeout = g_timeout_add (procdata->config.update_interval,
-                                       cb_timeout,
-                                       procdata);
-    proctable_update_all (procdata);
+    app->timeout = g_timeout_add (app->config.update_interval,
+                                  cb_timeout,
+                                  app);
+    proctable_update_all (app);
 }
diff --git a/src/procactions.h b/src/procactions.h
index 95e5ccb..35a9599 100644
--- a/src/procactions.h
+++ b/src/procactions.h
@@ -19,10 +19,10 @@
 #ifndef _PROCACTIONS_H_
 #define _PROCACTIONS_H_
 
-#include "procman.h"
+#include "procman-app.h"
 
-void            renice (ProcData *procdata, int nice);
-void            kill_process (ProcData *procdata, int sig);
+void            renice (ProcmanApp *app, int nice);
+void            kill_process (ProcmanApp *app, int sig);
 
 #endif
 
diff --git a/src/procdialogs.cpp b/src/procdialogs.cpp
index 7e9b1b7..e690e5b 100644
--- a/src/procdialogs.cpp
+++ b/src/procdialogs.cpp
@@ -56,28 +56,28 @@ kill_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
     gtk_widget_destroy (GTK_WIDGET (dialog));
 
     if (id == GTK_RESPONSE_OK)
-        kill_process (kargs->procdata, kargs->signal);
+        kill_process (kargs->app, kargs->signal);
 
     g_free (kargs);
 }
 
 void
-procdialog_create_kill_dialog (ProcData *procdata, int signal)
+procdialog_create_kill_dialog (ProcmanApp *app, int signal)
 {
     GtkWidget *kill_alert_dialog;
     gchar *primary, *secondary, *button_text;
     struct KillArgs *kargs;
 
     kargs = g_new(KillArgs, 1);
-    kargs->procdata = procdata;
+    kargs->app = app;
     kargs->signal = signal;
 
 
     if (signal == SIGKILL) {
         /*xgettext: primary alert message*/
         primary = g_strdup_printf (_("Kill the selected process â%sâ (PID: %u)?"),
-                                   procdata->selected_process->name,
-                                   procdata->selected_process->pid);
+                                   app->selected_process->name,
+                                   app->selected_process->pid);
         /*xgettext: secondary alert message*/
         secondary = _("Killing a process may destroy data, break the "
                       "session or introduce a security risk. "
@@ -87,8 +87,8 @@ procdialog_create_kill_dialog (ProcData *procdata, int signal)
     else {
         /*xgettext: primary alert message*/
         primary = g_strdup_printf (_("End the selected process â%sâ (PID: %u)?"),
-                                   procdata->selected_process->name,
-                                   procdata->selected_process->pid);
+                                   app->selected_process->name,
+                                   app->selected_process->pid);
         /*xgettext: secondary alert message*/
         secondary = _("Ending a process may destroy data, break the "
                       "session or introduce a security risk. "
@@ -96,7 +96,7 @@ procdialog_create_kill_dialog (ProcData *procdata, int signal)
         button_text = _("_End Process");
     }
 
-    kill_alert_dialog = gtk_message_dialog_new (GTK_WINDOW (procdata->app),
+    kill_alert_dialog = gtk_message_dialog_new (GTK_WINDOW (app->main_window),
                                                 static_cast<GtkDialogFlags>(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
                                                 GTK_MESSAGE_WARNING,
                                                 GTK_BUTTONS_NONE,
@@ -137,12 +137,11 @@ renice_scale_changed (GtkAdjustment *adj, gpointer data)
 static void
 renice_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
     if (id == 100) {
         if (new_nice_value == -100)
             return;
-        renice(procdata, new_nice_value);
+        renice(app, new_nice_value);
     }
 
     gtk_widget_destroy (GTK_WIDGET (dialog));
@@ -150,9 +149,9 @@ renice_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
 }
 
 void
-procdialog_create_renice_dialog (ProcData *procdata)
+procdialog_create_renice_dialog (ProcmanApp *app)
 {
-    ProcInfo *info = procdata->selected_process;
+    ProcInfo *info = app->selected_process;
     GtkWidget *label;
     GtkWidget *priority_label;
     GtkAdjustment *renice_adj;
@@ -200,7 +199,7 @@ procdialog_create_renice_dialog (ProcData *procdata)
     g_free (text);
 
     g_signal_connect (G_OBJECT (renice_dialog), "response",
-                      G_CALLBACK (renice_dialog_button_pressed), procdata);
+                      G_CALLBACK (renice_dialog_button_pressed), app);
     g_signal_connect (G_OBJECT (renice_adj), "value_changed",
                       G_CALLBACK (renice_scale_changed), priority_label);
 
@@ -235,8 +234,8 @@ prefs_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
 static void
 show_kill_dialog_toggled (GtkToggleButton *button, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-    GSettings *settings = procdata->settings;
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    GSettings *settings = app->settings;
 
     gboolean toggled;
 
@@ -250,8 +249,8 @@ show_kill_dialog_toggled (GtkToggleButton *button, gpointer data)
 static void
 solaris_mode_toggled(GtkToggleButton *button, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-    GSettings *settings = procdata->settings;
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    GSettings *settings = app->settings;
 
     gboolean toggled;
     toggled = gtk_toggle_button_get_active(button);
@@ -262,8 +261,8 @@ solaris_mode_toggled(GtkToggleButton *button, gpointer data)
 static void
 network_in_bits_toggled(GtkToggleButton *button, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-    GSettings *settings = procdata->settings;
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    GSettings *settings = app->settings;
 
     gboolean toggled;
     toggled = gtk_toggle_button_get_active(button);
@@ -275,8 +274,8 @@ network_in_bits_toggled(GtkToggleButton *button, gpointer data)
 static void
 smooth_refresh_toggled(GtkToggleButton *button, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-    GSettings *settings = procdata->settings;
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    GSettings *settings = app->settings;
 
     gboolean toggled;
 
@@ -290,8 +289,8 @@ smooth_refresh_toggled(GtkToggleButton *button, gpointer data)
 static void
 show_all_fs_toggled (GtkToggleButton *button, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
-    GSettings *settings = procdata->settings;
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    GSettings *settings = app->settings;
 
     gboolean toggled;
 
@@ -322,7 +321,7 @@ private:
     {
         int new_value = int(1000 * gtk_spin_button_get_value(spin));
 
-        g_settings_set_int(ProcData::get_instance()->settings,
+        g_settings_set_int(ProcmanApp::get()->settings,
                            this->key.c_str(), new_value);
 
         procman_debug("set %s to %d", this->key.c_str(), new_value);
@@ -342,7 +341,7 @@ field_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
     GtkTreeIter iter;
     GtkTreeViewColumn *column;
     gboolean toggled;
-    GSettings *settings = g_settings_get_child (ProcData::get_instance()->settings, "proctree");
+    GSettings *settings = g_settings_get_child (ProcmanApp::get()->settings, "proctree");
     gchar *key;
     int id;
 
@@ -443,7 +442,7 @@ create_field_page(GtkBuilder* builder, GtkWidget *tree, const gchar *widgetname)
 }
 
 void
-procdialog_create_preferences_dialog (ProcData *procdata)
+procdialog_create_preferences_dialog (ProcmanApp *app)
 {
     typedef SpinButtonUpdater SBU;
 
@@ -473,7 +472,7 @@ procdialog_create_preferences_dialog (ProcData *procdata)
 
     spin_button = GTK_WIDGET (gtk_builder_get_object (builder, "processes_interval_spinner"));
 
-    update = (gfloat) procdata->config.update_interval;
+    update = (gfloat) app->config.update_interval;
     adjustment = (GtkAdjustment *) gtk_adjustment_new(update / 1000.0,
                                                       MIN_UPDATE_INTERVAL / 1000,
                                                       MAX_UPDATE_INTERVAL / 1000,
@@ -487,27 +486,27 @@ procdialog_create_preferences_dialog (ProcData *procdata)
 
     smooth_button = GTK_WIDGET (gtk_builder_get_object (builder, "smooth_button"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(smooth_button),
-                                 g_settings_get_boolean(procdata->settings,
+                                 g_settings_get_boolean(app->settings,
                                                         SmoothRefresh::KEY.c_str()));
     g_signal_connect(G_OBJECT(smooth_button), "toggled",
-                     G_CALLBACK(smooth_refresh_toggled), procdata);
+                     G_CALLBACK(smooth_refresh_toggled), app);
 
     check_button = GTK_WIDGET (gtk_builder_get_object (builder, "check_button"));
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
-                                  procdata->config.show_kill_warning);
+                                  app->config.show_kill_warning);
     g_signal_connect (G_OBJECT (check_button), "toggled",
-                      G_CALLBACK (show_kill_dialog_toggled), procdata);
+                      G_CALLBACK (show_kill_dialog_toggled), app);
 
     GtkWidget *solaris_button = GTK_WIDGET (gtk_builder_get_object (builder, "solaris_button"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(solaris_button),
-                                 g_settings_get_boolean(procdata->settings,
+                                 g_settings_get_boolean(app->settings,
                                                         procman::settings::solaris_mode.c_str()));
     g_signal_connect(G_OBJECT(solaris_button), "toggled",
-                     G_CALLBACK(solaris_mode_toggled), procdata);
+                     G_CALLBACK(solaris_mode_toggled), app);
 
-    create_field_page (builder, procdata->tree, "processes_columns_treeview");
+    create_field_page (builder, app->tree, "processes_columns_treeview");
 
-    update = (gfloat) procdata->config.graph_update_interval;
+    update = (gfloat) app->config.graph_update_interval;
     adjustment = (GtkAdjustment *) gtk_adjustment_new(update / 1000.0, 0.25,
                                                       100.0, 0.25, 1.0, 0);
     spin_button = GTK_WIDGET (gtk_builder_get_object (builder, "resources_interval_spinner"));
@@ -519,12 +518,12 @@ procdialog_create_preferences_dialog (ProcData *procdata)
     GtkWidget *bits_button = GTK_WIDGET (gtk_builder_get_object (builder, "bits_button"));
 
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bits_button),
-                                 g_settings_get_boolean(procdata->settings,
+                                 g_settings_get_boolean(app->settings,
                                                         procman::settings::network_in_bits.c_str()));
     g_signal_connect(G_OBJECT(bits_button), "toggled",
-                     G_CALLBACK(network_in_bits_toggled), procdata);
+                     G_CALLBACK(network_in_bits_toggled), app);
 
-    update = (gfloat) procdata->config.disks_update_interval;
+    update = (gfloat) app->config.disks_update_interval;
     adjustment = (GtkAdjustment *) gtk_adjustment_new (update / 1000.0, 1.0,
                                                        100.0, 1.0, 1.0, 0);
     spin_button = GTK_WIDGET (gtk_builder_get_object (builder, "devices_interval_spinner"));
@@ -536,17 +535,17 @@ procdialog_create_preferences_dialog (ProcData *procdata)
 
     check_button = GTK_WIDGET (gtk_builder_get_object (builder, "all_devices_check"));
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
-                                  procdata->config.show_all_fs);
+                                  app->config.show_all_fs);
     g_signal_connect (G_OBJECT (check_button), "toggled",
-                      G_CALLBACK (show_all_fs_toggled), procdata);
+                      G_CALLBACK (show_all_fs_toggled), app);
 
-    create_field_page (builder, procdata->disk_list, "devices_columns_treeview");
+    create_field_page (builder, app->disk_list, "devices_columns_treeview");
 
     gtk_widget_show_all (prefs_dialog);
     g_signal_connect (G_OBJECT (prefs_dialog), "response",
-                      G_CALLBACK (prefs_dialog_button_pressed), procdata);
+                      G_CALLBACK (prefs_dialog_button_pressed), app);
 
-    switch (procdata->config.current_tab) {
+    switch (app->config.current_tab) {
         case PROCMAN_TAB_SYSINFO:
         case PROCMAN_TAB_PROCESSES:
             gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
@@ -589,7 +588,7 @@ procman_action_to_command(ProcmanActionType type,
  */
 gboolean
 procdialog_create_root_password_dialog(ProcmanActionType type,
-                                       ProcData *procdata,
+                                       ProcmanApp *app,
                                        gint pid,
                                        gint extra_value)
 {
diff --git a/src/procdialogs.h b/src/procdialogs.h
index 752fa35..1b8c130 100644
--- a/src/procdialogs.h
+++ b/src/procdialogs.h
@@ -21,7 +21,7 @@
 
 
 #include <glib.h>
-#include "procman.h"
+#include "procman-app.h"
 
 /* These are the actual range of settable values. Values outside this range
    are scaled back to these limits. So show these limits in the slider
@@ -42,13 +42,13 @@ typedef enum
 } ProcmanActionType;
 
 
-void                    procdialog_create_kill_dialog (ProcData *data, int signal);
-void                    procdialog_create_renice_dialog (ProcData *data);
+void                    procdialog_create_kill_dialog (ProcmanApp *app, int signal);
+void                    procdialog_create_renice_dialog (ProcmanApp *app);
 gboolean                procdialog_create_root_password_dialog (ProcmanActionType type,
-                                                                ProcData *procdata,
+                                                                ProcmanApp *app,
                                                                 gint pid, gint extra_value);
-void                    procdialog_create_memmaps_dialog (ProcData *data);
-void                    procdialog_create_preferences_dialog (ProcData *data);
+void                    procdialog_create_memmaps_dialog (ProcmanApp *app);
+void                    procdialog_create_preferences_dialog (ProcmanApp *app);
 
 #endif
 
diff --git a/src/procman-app.cpp b/src/procman-app.cpp
index 9215cc6..1a6ef38 100644
--- a/src/procman-app.cpp
+++ b/src/procman-app.cpp
@@ -5,7 +5,6 @@
 #include <glibtop/close.h>
 
 #include "procman-app.h"
-#include "procman.h"
 #include "interface.h"
 #include "proctable.h"
 #include "callbacks.h"
@@ -15,124 +14,124 @@
 #include "util.h"
 
 static void
-mount_changed(const Glib::RefPtr<Gio::Mount>&)
+mount_changed(const Glib::RefPtr<Gio::Mount>&, ProcmanApp *app)
 {
-    cb_update_disks(ProcData::get_instance());
+    cb_update_disks(app);
 }
 
 
 static void
-init_volume_monitor(ProcData *procdata)
+init_volume_monitor(ProcmanApp *app)
 {
     using namespace Gio;
     using namespace Glib;
 
     RefPtr<VolumeMonitor> monitor = VolumeMonitor::get();
 
-    monitor->signal_mount_added().connect(sigc::ptr_fun(&mount_changed));
-    monitor->signal_mount_changed().connect(sigc::ptr_fun(&mount_changed));
-    monitor->signal_mount_removed().connect(sigc::ptr_fun(&mount_changed));
+    monitor->signal_mount_added().connect(sigc::bind<ProcmanApp *>(sigc::ptr_fun(&mount_changed), app));
+    monitor->signal_mount_changed().connect(sigc::bind<ProcmanApp *>(sigc::ptr_fun(&mount_changed), app));
+    monitor->signal_mount_removed().connect(sigc::bind<ProcmanApp *>(sigc::ptr_fun(&mount_changed), app));
 }
 
 static void
 tree_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
-    procdata->config.show_tree = g_settings_get_boolean(settings, key);
+    app->config.show_tree = g_settings_get_boolean(settings, key);
 
-    g_object_set(G_OBJECT(procdata->tree),
-                 "show-expanders", procdata->config.show_tree,
+    g_object_set(G_OBJECT(app->tree),
+                 "show-expanders", app->config.show_tree,
                  NULL);
 
-    proctable_clear_tree (procdata);
-    proctable_update_all (procdata);
+    proctable_clear_tree (app);
+    proctable_update_all (app);
 }
 
 static void
 solaris_mode_changed_cb(GSettings *settings, const gchar *key, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
-    procdata->config.solaris_mode = g_settings_get_boolean(settings, key);
-    proctable_update_all (procdata);
+    app->config.solaris_mode = g_settings_get_boolean(settings, key);
+    proctable_update_all (app);
 }
 
 
 static void
 network_in_bits_changed_cb(GSettings *settings, const gchar *key, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
-    procdata->config.network_in_bits = g_settings_get_boolean(settings, key);
+    app->config.network_in_bits = g_settings_get_boolean(settings, key);
     // force scale to be redrawn
-    procdata->net_graph->clear_background();
+    app->net_graph->clear_background();
 }
 
 static void
 view_as_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
-    procdata->config.whose_process = g_settings_get_int (settings, key);
-    procdata->config.whose_process = CLAMP (procdata->config.whose_process, 0, 2);
-    proctable_clear_tree (procdata);
-    proctable_update_all (procdata);
+    app->config.whose_process = g_settings_get_int (settings, key);
+    app->config.whose_process = CLAMP (app->config.whose_process, 0, 2);
+    proctable_clear_tree (app);
+    proctable_update_all (app);
 }
 
 static void
 warning_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
     if (g_str_equal (key, "kill-dialog")) {
-        procdata->config.show_kill_warning = g_settings_get_boolean (settings, key);
+        app->config.show_kill_warning = g_settings_get_boolean (settings, key);
     }
 }
 
 static void
 timeouts_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
     if (g_str_equal (key, "update-interval")) {
-        procdata->config.update_interval = g_settings_get_int (settings, key);
-        procdata->config.update_interval =
-            MAX (procdata->config.update_interval, 1000);
+        app->config.update_interval = g_settings_get_int (settings, key);
+        app->config.update_interval =
+            MAX (app->config.update_interval, 1000);
 
-        procdata->smooth_refresh->reset();
+        app->smooth_refresh->reset();
 
-        if(procdata->timeout) {
-            g_source_remove (procdata->timeout);
-            procdata->timeout = g_timeout_add (procdata->config.update_interval,
-                                               cb_timeout,
-                                               procdata);
+        if(app->timeout) {
+            g_source_remove (app->timeout);
+            app->timeout = g_timeout_add (app->config.update_interval,
+                                          cb_timeout,
+                                          app);
         }
     }
     else if (g_str_equal (key, "graph-update-interval")){
-        procdata->config.graph_update_interval = g_settings_get_int (settings, key);
-        procdata->config.graph_update_interval =
-            MAX (procdata->config.graph_update_interval,
+        app->config.graph_update_interval = g_settings_get_int (settings, key);
+        app->config.graph_update_interval =
+            MAX (app->config.graph_update_interval,
                  250);
-        load_graph_change_speed(procdata->cpu_graph,
-                                procdata->config.graph_update_interval);
-        load_graph_change_speed(procdata->mem_graph,
-                                procdata->config.graph_update_interval);
-        load_graph_change_speed(procdata->net_graph,
-                                procdata->config.graph_update_interval);
+        load_graph_change_speed(app->cpu_graph,
+                                app->config.graph_update_interval);
+        load_graph_change_speed(app->mem_graph,
+                                app->config.graph_update_interval);
+        load_graph_change_speed(app->net_graph,
+                                app->config.graph_update_interval);
     }
     else if (g_str_equal(key, "disks-interval")) {
 
-        procdata->config.disks_update_interval = g_settings_get_int (settings, key);
-        procdata->config.disks_update_interval =
-            MAX (procdata->config.disks_update_interval, 1000);
+        app->config.disks_update_interval = g_settings_get_int (settings, key);
+        app->config.disks_update_interval =
+            MAX (app->config.disks_update_interval, 1000);
 
-        if(procdata->disk_timeout) {
-            g_source_remove (procdata->disk_timeout);
-            procdata->disk_timeout = \
-                g_timeout_add (procdata->config.disks_update_interval,
+        if(app->disk_timeout) {
+            g_source_remove (app->disk_timeout);
+            app->disk_timeout = \
+                g_timeout_add (app->config.disks_update_interval,
                                cb_update_disks,
-                               procdata);
+                               app);
         }
     }
     else {
@@ -141,8 +140,10 @@ timeouts_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 }
 
 static void
-apply_cpu_color_settings(GSettings *settings, ProcData * const procdata)
+apply_cpu_color_settings(GSettings *settings, gpointer data)
 {
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+
     GVariant *cpu_colors_var = g_settings_get_value(settings, "cpu-colors");
     gsize n = g_variant_n_children(cpu_colors_var);
 
@@ -155,7 +156,7 @@ apply_cpu_color_settings(GSettings *settings, ProcData * const procdata)
 
     g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
 
-    for (guint i = 0; i < static_cast<guint>(procdata->config.num_cpus); i++) {
+    for (guint i = 0; i < static_cast<guint>(app->config.num_cpus); i++) {
         if(i < n) {
             child = g_variant_get_child_value ( cpu_colors_var, i );
             g_variant_get_child( child, 1, "s", &color);
@@ -164,12 +165,12 @@ apply_cpu_color_settings(GSettings *settings, ProcData * const procdata)
             color = g_strdup ("#f25915e815e8");
             g_variant_builder_add(&builder, "(us)", i, color);
         }
-        gdk_color_parse(color, &procdata->config.cpu_color[i]);
+        gdk_color_parse(color, &app->config.cpu_color[i]);
         g_free (color);
     }
     full = g_variant_builder_end(&builder);
     // if the user has more cores than colors stored in the gsettings, store the newly built gvariant in gsettings
-    if (n < static_cast<guint>(procdata->config.num_cpus)) {
+    if (n < static_cast<guint>(app->config.num_cpus)) {
         g_settings_set_value(settings, "cpu-colors", full);
     }
 }
@@ -177,13 +178,13 @@ apply_cpu_color_settings(GSettings *settings, ProcData * const procdata)
 static void
 color_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
     if (g_str_equal (key, "cpu-colors")) {
-        apply_cpu_color_settings(settings, procdata);
-        for (int i = 0; i < procdata->config.num_cpus; i++) {
-            if(!gdk_color_equal(&procdata->cpu_graph->colors[i], &procdata->config.cpu_color[i])) {
-                procdata->cpu_graph->colors[i] = procdata->config.cpu_color[i];
+        apply_cpu_color_settings(settings, app);
+        for (int i = 0; i < app->config.num_cpus; i++) {
+            if(!gdk_color_equal(&app->cpu_graph->colors[i], &app->config.cpu_color[i])) {
+                app->cpu_graph->colors[i] = app->config.cpu_color[i];
                 break;
             }
         }
@@ -192,20 +193,20 @@ color_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 
     const gchar *color = g_settings_get_string (settings, key);
     if (g_str_equal (key, "mem-color")) {
-        gdk_color_parse (color, &procdata->config.mem_color);
-        procdata->mem_graph->colors.at(0) = procdata->config.mem_color;
+        gdk_color_parse (color, &app->config.mem_color);
+        app->mem_graph->colors.at(0) = app->config.mem_color;
     }
     else if (g_str_equal (key, "swap-color")) {
-        gdk_color_parse (color, &procdata->config.swap_color);
-        procdata->mem_graph->colors.at(1) = procdata->config.swap_color;
+        gdk_color_parse (color, &app->config.swap_color);
+        app->mem_graph->colors.at(1) = app->config.swap_color;
     }
     else if (g_str_equal (key, "net-in-color")) {
-        gdk_color_parse (color, &procdata->config.net_in_color);
-        procdata->net_graph->colors.at(0) = procdata->config.net_in_color;
+        gdk_color_parse (color, &app->config.net_in_color);
+        app->net_graph->colors.at(0) = app->config.net_in_color;
     }
     else if (g_str_equal (key, "net-out-color")) {
-        gdk_color_parse (color, &procdata->config.net_out_color);
-        procdata->net_graph->colors.at(1) = procdata->config.net_out_color;
+        gdk_color_parse (color, &app->config.net_out_color);
+        app->net_graph->colors.at(1) = app->config.net_out_color;
     }
     else {
         g_assert_not_reached();
@@ -215,84 +216,83 @@ color_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 static void
 show_all_fs_changed_cb (GSettings *settings, const gchar *key, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
-    procdata->config.show_all_fs = g_settings_get_boolean (settings, key);
+    app->config.show_all_fs = g_settings_get_boolean (settings, key);
 
-    cb_update_disks (data);
+    cb_update_disks (app);
 }
 
-static ProcData *
-procman_data_new (GSettings *settings)
+void
+ProcmanApp::load_settings()
 {
-    ProcData *pd;
     gchar *color;
     gint swidth, sheight;
     gint i;
     glibtop_cpu cpu;
 
-    pd = ProcData::get_instance();
+    settings = g_settings_new (GSM_GSETTINGS_SCHEMA);
 
-    pd->config.width = g_settings_get_int (settings, "width");
-    pd->config.height = g_settings_get_int (settings, "height");
-    pd->config.xpos = g_settings_get_int (settings, "x-position");
-    pd->config.ypos = g_settings_get_int (settings, "y-position");
-    pd->config.maximized = g_settings_get_boolean (settings, "maximized");
+    config.width = g_settings_get_int (settings, "width");
+    config.height = g_settings_get_int (settings, "height");
+    config.xpos = g_settings_get_int (settings, "x-position");
+    config.ypos = g_settings_get_int (settings, "y-position");
+    config.maximized = g_settings_get_boolean (settings, "maximized");
 
-    pd->config.show_tree = g_settings_get_boolean (settings, "show-tree");
-    g_signal_connect (G_OBJECT(settings), "changed::show-tree", G_CALLBACK(tree_changed_cb), pd);
+    config.show_tree = g_settings_get_boolean (settings, "show-tree");
+    g_signal_connect (G_OBJECT(settings), "changed::show-tree", G_CALLBACK(tree_changed_cb), this);
 
-    pd->config.solaris_mode = g_settings_get_boolean(settings, procman::settings::solaris_mode.c_str());
+    config.solaris_mode = g_settings_get_boolean(settings, procman::settings::solaris_mode.c_str());
     std::string detail_string("changed::" + procman::settings::solaris_mode);
-    g_signal_connect(G_OBJECT(settings), detail_string.c_str(), G_CALLBACK(solaris_mode_changed_cb), pd);
+    g_signal_connect(G_OBJECT(settings), detail_string.c_str(), G_CALLBACK(solaris_mode_changed_cb), this);
 
-    pd->config.network_in_bits = g_settings_get_boolean(settings, procman::settings::network_in_bits.c_str());
+    config.network_in_bits = g_settings_get_boolean(settings, procman::settings::network_in_bits.c_str());
     detail_string = "changed::" + procman::settings::network_in_bits;
-    g_signal_connect(G_OBJECT(settings), detail_string.c_str(), G_CALLBACK(network_in_bits_changed_cb), pd);
+    g_signal_connect(G_OBJECT(settings), detail_string.c_str(), G_CALLBACK(network_in_bits_changed_cb), this);
 
-    pd->config.show_kill_warning = g_settings_get_boolean (settings, "kill-dialog");
-    g_signal_connect (G_OBJECT(settings), "changed::kill-dialog", G_CALLBACK(warning_changed_cb), pd);
-    pd->config.update_interval = g_settings_get_int (settings, "update-interval");
-    g_signal_connect (G_OBJECT(settings), "changed::update-interval", G_CALLBACK(timeouts_changed_cb), pd);
-    pd->config.graph_update_interval = g_settings_get_int (settings,
+    config.show_kill_warning = g_settings_get_boolean (settings, "kill-dialog");
+    g_signal_connect (G_OBJECT(settings), "changed::kill-dialog", G_CALLBACK(warning_changed_cb), this);
+    config.update_interval = g_settings_get_int (settings, "update-interval");
+    g_signal_connect (G_OBJECT(settings), "changed::update-interval", G_CALLBACK(timeouts_changed_cb), this);
+    config.graph_update_interval = g_settings_get_int (settings,
                                                            "graph-update-interval");
     g_signal_connect (G_OBJECT(settings), "changed::graph-update-interval",
-                      G_CALLBACK(timeouts_changed_cb), pd);
-    pd->config.disks_update_interval = g_settings_get_int (settings, "disks-interval");
-    g_signal_connect (G_OBJECT(settings), "changed::disks-interval", G_CALLBACK(timeouts_changed_cb), pd);
+                      G_CALLBACK(timeouts_changed_cb), this);
+    config.disks_update_interval = g_settings_get_int (settings, "disks-interval");
+    g_signal_connect (G_OBJECT(settings), "changed::disks-interval", G_CALLBACK(timeouts_changed_cb), this);
 
 
     /* show_all_fs */
-    pd->config.show_all_fs = g_settings_get_boolean (settings, "show-all-fs");
-    g_signal_connect (settings, "changed::show-all-fs", G_CALLBACK(show_all_fs_changed_cb), pd);
+    config.show_all_fs = g_settings_get_boolean (settings, "show-all-fs");
+    g_signal_connect (settings, "changed::show-all-fs", G_CALLBACK(show_all_fs_changed_cb), this);
 
 
-    pd->config.whose_process = g_settings_get_int (settings, "view-as");
-    g_signal_connect (G_OBJECT(settings), "changed::view-as", G_CALLBACK(view_as_changed_cb),pd);
-    pd->config.current_tab = g_settings_get_int (settings, "current-tab");
+    config.whose_process = g_settings_get_int (settings, "view-as");
+    g_signal_connect (G_OBJECT(settings), "changed::view-as", G_CALLBACK(view_as_changed_cb), this);
+    config.current_tab = g_settings_get_int (settings, "current-tab");
 
     /* Determine number of cpus since libgtop doesn't really tell you*/
-    pd->config.num_cpus = 0;
+    config.num_cpus = 0;
     glibtop_get_cpu (&cpu);
-    pd->frequency = cpu.frequency;
+    frequency = cpu.frequency;
     i=0;
     while (i < GLIBTOP_NCPU && cpu.xcpu_total[i] != 0) {
-        pd->config.num_cpus ++;
+        config.num_cpus ++;
         i++;
     }
-    if (pd->config.num_cpus == 0)
-        pd->config.num_cpus = 1;
+    if (config.num_cpus == 0)
+        config.num_cpus = 1;
 
-    apply_cpu_color_settings(settings, pd);
+    apply_cpu_color_settings(settings, this);
     g_signal_connect (G_OBJECT(settings), "changed::cpu-colors",
-                      G_CALLBACK(color_changed_cb), pd);
+                      G_CALLBACK(color_changed_cb), this);
 
     color = g_settings_get_string (settings, "mem-color");
     if (!color)
         color = g_strdup ("#000000ff0082");
     g_signal_connect (G_OBJECT(settings), "changed::mem-color",
-                      G_CALLBACK(color_changed_cb), pd);
-    gdk_color_parse(color, &pd->config.mem_color);
+                      G_CALLBACK(color_changed_cb), this);
+    gdk_color_parse(color, &config.mem_color);
 
     g_free (color);
 
@@ -300,77 +300,219 @@ procman_data_new (GSettings *settings)
     if (!color)
         color = g_strdup ("#00b6000000ff");
     g_signal_connect (G_OBJECT(settings), "changed::swap-color",
-                      G_CALLBACK(color_changed_cb), pd);
-    gdk_color_parse(color, &pd->config.swap_color);
+                      G_CALLBACK(color_changed_cb), this);
+    gdk_color_parse(color, &config.swap_color);
     g_free (color);
 
     color = g_settings_get_string (settings, "net-in-color");
     if (!color)
         color = g_strdup ("#000000f200f2");
     g_signal_connect (G_OBJECT(settings), "changed::net-in-color",
-                      G_CALLBACK(color_changed_cb), pd);
-    gdk_color_parse(color, &pd->config.net_in_color);
+                      G_CALLBACK(color_changed_cb), this);
+    gdk_color_parse(color, &config.net_in_color);
     g_free (color);
 
     color = g_settings_get_string (settings, "net-out-color");
     if (!color)
         color = g_strdup ("#00f2000000c1");
     g_signal_connect (G_OBJECT(settings), "changed::net-out-color",
-                      G_CALLBACK(color_changed_cb), pd);
-    gdk_color_parse(color, &pd->config.net_out_color);
+                      G_CALLBACK(color_changed_cb), this);
+    gdk_color_parse(color, &config.net_out_color);
     g_free (color);
 
     /* Sanity checks */
     swidth = gdk_screen_width ();
     sheight = gdk_screen_height ();
-    pd->config.width = CLAMP (pd->config.width, 50, swidth);
-    pd->config.height = CLAMP (pd->config.height, 50, sheight);
-    pd->config.update_interval = MAX (pd->config.update_interval, 1000);
-    pd->config.graph_update_interval = MAX (pd->config.graph_update_interval, 250);
-    pd->config.disks_update_interval = MAX (pd->config.disks_update_interval, 1000);
-    pd->config.whose_process = CLAMP (pd->config.whose_process, 0, 2);
-    pd->config.current_tab = CLAMP(pd->config.current_tab,
-                                   PROCMAN_TAB_SYSINFO,
-                                   PROCMAN_TAB_DISKS);
-
-    // delayed initialization as SmoothRefresh() needs ProcData
-    // i.e. we can't call ProcData::get_instance
-    pd->smooth_refresh = new SmoothRefresh(settings);
+    config.width = CLAMP (config.width, 50, swidth);
+    config.height = CLAMP (config.height, 50, sheight);
+    config.update_interval = MAX (config.update_interval, 1000);
+    config.graph_update_interval = MAX (config.graph_update_interval, 250);
+    config.disks_update_interval = MAX (config.disks_update_interval, 1000);
+    config.whose_process = CLAMP (config.whose_process, 0, 2);
+    config.current_tab = CLAMP(config.current_tab,
+                               PROCMAN_TAB_SYSINFO,
+                               PROCMAN_TAB_DISKS);
+}
 
-    pd->terminating = FALSE;
+ProcmanApp::ProcmanApp() : Gtk::Application("org.gnome.SystemMonitor", Gio::APPLICATION_HANDLES_COMMAND_LINE)
+{
+    Glib::set_application_name(_("System Monitor"));
+}
 
-    return pd;
+Glib::RefPtr<ProcmanApp> ProcmanApp::get ()
+{
+    static Glib::RefPtr<ProcmanApp> singleton;
 
+    if (!singleton) {
+        singleton = Glib::RefPtr<ProcmanApp>(new ProcmanApp());
+    }
+    return singleton;
 }
 
-static void
-procman_free_data (ProcData *procdata)
+void ProcmanApp::on_activate()
 {
-
-    proctable_free_table (procdata);
-    delete procdata->smooth_refresh;
+    gtk_window_present (GTK_WINDOW (main_window));
 }
 
-ProcmanApp::ProcmanApp() : Gtk::Application("org.gnome.SystemMonitor", Gio::APPLICATION_HANDLES_COMMAND_LINE)
+static void
+set_tab(GtkNotebook* notebook, gint tab, ProcmanApp *app)
 {
-    Glib::set_application_name(_("System Monitor"));
+    gtk_notebook_set_current_page(notebook, tab);
+    cb_change_current_page(notebook, tab, app);
 }
 
-Glib::RefPtr<ProcmanApp> ProcmanApp::create ()
+gboolean
+procman_get_tree_state (GSettings *settings, GtkWidget *tree, const gchar *child_schema)
 {
-    return Glib::RefPtr<ProcmanApp>(new ProcmanApp());
+    GtkTreeModel *model;
+    GList *columns, *it;
+    gint sort_col;
+    GtkSortType order;
+
+    g_assert(tree);
+    g_assert(child_schema);
+
+    GSettings *pt_settings = g_settings_get_child (settings, child_schema);
+
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree));
+
+    sort_col = g_settings_get_int (pt_settings, "sort-col");
+
+    order = static_cast<GtkSortType>(g_settings_get_int (pt_settings, "sort-order"));
+
+    if (sort_col != -1)
+        gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
+                                              sort_col,
+                                              order);
+
+    columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (tree));
+
+    if(!g_strcmp0(child_schema, "proctree"))
+    {
+        for(it = columns; it; it = it->next)
+        {
+            GtkTreeViewColumn *column;
+            gint width;
+            gboolean visible;
+            int id;
+            gchar *key;
+
+            column = static_cast<GtkTreeViewColumn*>(it->data);
+            id = gtk_tree_view_column_get_sort_column_id (column);
+
+            key = g_strdup_printf ("col-%d-width", id);
+            g_settings_get (pt_settings, key, "i", &width);
+            g_free (key);
+
+            key = g_strdup_printf ("col-%d-visible", id);
+            visible = g_settings_get_boolean (pt_settings, key);
+            g_free (key);
+
+            column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree), id);
+            if(!column) continue;
+            gtk_tree_view_column_set_visible (column, visible);
+            if (visible) {
+                /* ensure column is really visible */
+                width = MAX(width, 10);
+                gtk_tree_view_column_set_fixed_width(column, width);
+            }
+        }
+    }
+
+    if(!g_strcmp0(child_schema, "proctree") ||
+       !g_strcmp0(child_schema, "disktreenew"))
+    {
+        GVariant     *value;
+        GVariantIter iter;
+        int          sortIndex;
+
+        GSList *order = NULL;
+
+        value = g_settings_get_value(pt_settings, "columns-order");
+        g_variant_iter_init(&iter, value);
+
+        while (g_variant_iter_loop (&iter, "i", &sortIndex))
+            order = g_slist_append(order, GINT_TO_POINTER(sortIndex));
+
+        proctable_set_columns_order(GTK_TREE_VIEW(tree), order);
+
+        g_slist_free(order);
+    }
+
+    g_object_unref(pt_settings);
+    pt_settings = NULL;
+
+    g_list_free(columns);
+
+    return TRUE;
 }
 
-void ProcmanApp::on_activate()
+void
+procman_save_tree_state (GSettings *settings, GtkWidget *tree, const gchar *child_schema)
 {
-    gtk_window_present (GTK_WINDOW (procdata->app));
+    GtkTreeModel *model;
+    GList *columns;
+    gint sort_col;
+    GtkSortType order;
+
+    g_assert(tree);
+    g_assert(child_schema);
+
+    GSettings *pt_settings = g_settings_get_child (settings, child_schema);
+
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree));
+    if (gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model), &sort_col,
+                                              &order)) {
+        g_settings_set_int (pt_settings, "sort-col", sort_col);
+        g_settings_set_int (pt_settings, "sort-order", order);
+    }
+
+    columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (tree));
+
+    if(!g_strcmp0(child_schema, "proctree") || !g_strcmp0(child_schema, "disktreenew"))
+    {
+        GSList *order;
+        GSList *order_node;
+        GVariantBuilder *builder;
+        GVariant *order_variant;
+
+        order = proctable_get_columns_order(GTK_TREE_VIEW(tree));
+
+        builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
+
+        for(order_node = order; order_node; order_node = order_node->next)
+            g_variant_builder_add(builder, "i", GPOINTER_TO_INT(order_node->data));
+
+        order_variant = g_variant_new("ai", builder);
+        g_settings_set_value(pt_settings, "columns-order", order_variant);
+
+        g_slist_free(order);
+    }
+
+    g_list_free(columns);
 }
 
-static void
-set_tab(GtkNotebook* notebook, gint tab, ProcData* procdata)
+void
+ProcmanApp::save_config ()
 {
-    gtk_notebook_set_current_page(notebook, tab);
-    cb_change_current_page(notebook, tab, procdata);
+    procman_save_tree_state (settings, tree, "proctree");
+    procman_save_tree_state (settings, disk_list, "disktreenew");
+
+    config.width  = gdk_window_get_width (gtk_widget_get_window (main_window));
+    config.height = gdk_window_get_height(gtk_widget_get_window (main_window));
+    gtk_window_get_position(GTK_WINDOW(main_window), &config.xpos, &config.ypos);
+
+    config.maximized = gdk_window_get_state(gtk_widget_get_window (main_window)) & GDK_WINDOW_STATE_MAXIMIZED;
+
+    g_settings_set_int (settings, "width", config.width);
+    g_settings_set_int (settings, "height", config.height);
+    g_settings_set_int (settings, "x-position", config.xpos);
+    g_settings_set_int (settings, "y-position", config.ypos);
+    g_settings_set_boolean (settings, "maximized", config.maximized);
+
+    g_settings_set_int (settings, "current-tab", config.current_tab);
+
+    g_settings_sync ();
 }
 
 int ProcmanApp::on_command_line(const Glib::RefPtr<Gio::ApplicationCommandLine>& command_line)
@@ -392,16 +534,16 @@ int ProcmanApp::on_command_line(const Glib::RefPtr<Gio::ApplicationCommandLine>&
 
     if (option_group.show_system_tab) {
         procman_debug("Starting with PROCMAN_TAB_SYSINFO by commandline request");
-        set_tab(GTK_NOTEBOOK(procdata->notebook), PROCMAN_TAB_SYSINFO, procdata);
+        set_tab(GTK_NOTEBOOK(notebook), PROCMAN_TAB_SYSINFO, this);
     } else if (option_group.show_processes_tab) {
         procman_debug("Starting with PROCMAN_TAB_PROCESSES by commandline request");
-        set_tab(GTK_NOTEBOOK(procdata->notebook), PROCMAN_TAB_PROCESSES, procdata);
+        set_tab(GTK_NOTEBOOK(notebook), PROCMAN_TAB_PROCESSES, this);
     } else if (option_group.show_resources_tab) {
         procman_debug("Starting with PROCMAN_TAB_RESOURCES by commandline request");
-        set_tab(GTK_NOTEBOOK(procdata->notebook), PROCMAN_TAB_RESOURCES, procdata);
+        set_tab(GTK_NOTEBOOK(notebook), PROCMAN_TAB_RESOURCES, this);
     } else if (option_group.show_file_systems_tab) {
         procman_debug("Starting with PROCMAN_TAB_DISKS by commandline request");
-        set_tab(GTK_NOTEBOOK(procdata->notebook), PROCMAN_TAB_DISKS, procdata);
+        set_tab(GTK_NOTEBOOK(notebook), PROCMAN_TAB_DISKS, this);
     }
 
     on_activate ();
@@ -412,27 +554,45 @@ int ProcmanApp::on_command_line(const Glib::RefPtr<Gio::ApplicationCommandLine>&
 void
 ProcmanApp::on_help_activate(const Glib::VariantBase&)
 {
-    cb_help_contents (NULL, NULL);
+    cb_help_contents (NULL, this);
 }
 
 void
 ProcmanApp::on_lsof_activate(const Glib::VariantBase&)
 {
-    cb_show_lsof (NULL, procdata);
+    cb_show_lsof (NULL, this);
 }
 
 void
 ProcmanApp::on_preferences_activate(const Glib::VariantBase&)
 {
-    cb_edit_preferences (NULL, procdata);
+    cb_edit_preferences (NULL, this);
 }
 
 void
 ProcmanApp::on_quit_activate(const Glib::VariantBase&)
 {
-    this->quit();
+    shutdown ();
 }
 
+void
+ProcmanApp::shutdown()
+{
+    save_config ();
+
+    if (timeout)
+        g_source_remove (timeout);
+    if (disk_timeout)
+        g_source_remove (disk_timeout);
+
+    proctable_free_table (this);
+    delete smooth_refresh;
+    delete pretty_table;
+
+    glibtop_close();
+
+    quit();
+}
 
 void ProcmanApp::on_startup()
 {
@@ -463,26 +623,19 @@ void ProcmanApp::on_startup()
     Glib::RefPtr<Gio::Menu> menu = Glib::RefPtr<Gio::Menu>::cast_static(builder->get_object ("app-menu"));
     set_app_menu (menu);
 
-    GSettings *settings;
-
     Gtk::Window::set_default_icon_name ("utilities-system-monitor");
 
-    settings = g_settings_new (GSM_GSETTINGS_SCHEMA);
-
     glibtop_init ();
 
-    procdata = procman_data_new (settings);
-    procdata->settings = g_settings_new(GSM_GSETTINGS_SCHEMA);
+    load_settings ();
 
-    create_main_window (procdata, this->gobj());
-    init_volume_monitor (procdata);
+    pretty_table = new PrettyTable();
+    smooth_refresh = new SmoothRefresh(settings);
 
-    gtk_widget_show (procdata->app);
-    gtk_widget_set_name (procdata->app, "gnome-system-monitor");
-}
+    create_main_window (this);
 
-void ProcmanApp::on_shutdown()
-{
-    procman_free_data(procdata);
-    glibtop_close();
+    init_volume_monitor (this);
+
+    gtk_widget_show (main_window);
 }
+
diff --git a/src/procman-app.h b/src/procman-app.h
index b1e24e7..280bca4 100644
--- a/src/procman-app.h
+++ b/src/procman-app.h
@@ -2,13 +2,173 @@
 #define _PROCMAN_PROCMAN_APP_H_
 
 #include <gtkmm.h>
+#include <glibtop/cpu.h>
+
+struct ProcInfo;
+struct LoadGraph;
+
+#include "smooth_refresh.h"
+#include "prettytable.h"
+
+#define GSM_GSETTINGS_SCHEMA "org.gnome.gnome-system-monitor"
+
+enum
+{
+    ALL_PROCESSES,
+    MY_PROCESSES,
+    ACTIVE_PROCESSES
+};
+
+enum
+{
+    VERY_HIGH_PRIORITY,
+    HIGH_PRIORITY,
+    NORMAL_PRIORITY,
+    LOW_PRIORITY,
+    VERY_LOW_PRIORITY,
+    CUSTOM_PRIORITY
+};
+
+static const unsigned MIN_UPDATE_INTERVAL =   1 * 1000;
+static const unsigned MAX_UPDATE_INTERVAL = 100 * 1000;
+
+
+enum ProcmanTab
+{
+    PROCMAN_TAB_SYSINFO,
+    PROCMAN_TAB_PROCESSES,
+    PROCMAN_TAB_RESOURCES,
+    PROCMAN_TAB_DISKS
+};
+
+
+struct ProcConfig
+{
+    gint            width;
+    gint            height;
+    gint            xpos;
+    gint            ypos;
+    gboolean        maximized;
+    gboolean        show_kill_warning;
+    gboolean        show_tree;
+    gboolean        show_all_fs;
+    int             update_interval;
+    int             graph_update_interval;
+    int             disks_update_interval;
+    gint            whose_process;
+    gint            current_tab;
+    GdkColor        cpu_color[GLIBTOP_NCPU];
+    GdkColor        mem_color;
+    GdkColor        swap_color;
+    GdkColor        net_in_color;
+    GdkColor        net_out_color;
+    GdkColor        bg_color;
+    GdkColor        frame_color;
+    gint            num_cpus;
+    bool solaris_mode;
+    bool network_in_bits;
+};
+
+
+
+struct MutableProcInfo
+{
+MutableProcInfo()
+: status(0)
+    { }
+
+    std::string user;
+
+    gchar wchan[40];
+
+    // all these members are filled with libgtop which uses
+    // guint64 (to have fixed size data) but we don't need more
+    // than an unsigned long (even for 32bit apps on a 64bit
+    // kernel) as these data are amounts, not offsets.
+    gulong vmsize;
+    gulong memres;
+    gulong memshared;
+    gulong memwritable;
+    gulong mem;
+
+    // wnck gives an unsigned long
+    gulong memxserver;
+
+    gulong start_time;
+    guint64 cpu_time;
+    guint status;
+    guint pcpu;
+    gint nice;
+    gchar *cgroup_name;
+
+    gchar *unit;
+    gchar *session;
+    gchar *seat;
+
+    std::string owner;
+};
+
+
+class ProcInfo
+: public MutableProcInfo
+{
+    /* undefined */ ProcInfo& operator=(const ProcInfo&);
+    /* undefined */ ProcInfo(const ProcInfo&);
+
+    typedef std::map<guint, std::string> UserMap;
+    /* cached username */
+    static UserMap users;
+
+  public:
+
+    // TODO: use a set instead
+    // sorted by pid. The map has a nice property : it is sorted
+    // by pid so this helps a lot when looking for the parent node
+    // as ppid is nearly always < pid.
+    typedef std::map<pid_t, ProcInfo*> List;
+    typedef List::iterator Iterator;
+
+    static List all;
+
+    static ProcInfo* find(pid_t pid);
+    static Iterator begin() { return ProcInfo::all.begin(); }
+    static Iterator end() { return ProcInfo::all.end(); }
+
+
+    ProcInfo(pid_t pid);
+    ~ProcInfo();
+    // adds one more ref to icon
+    void set_icon(Glib::RefPtr<Gdk::Pixbuf> icon);
+    void set_user(guint uid);
+    std::string lookup_user(guint uid);
+
+    GtkTreeIter     node;
+    Glib::RefPtr<Gdk::Pixbuf> pixbuf;
+    gchar           *tooltip;
+    gchar           *name;
+    gchar           *arguments;
+
+    gchar           *security_context;
+
+    const guint     pid;
+    guint           ppid;
+    guint           uid;
+
+// private:
+    // tracks cpu time per process keeps growing because if a
+    // ProcInfo is deleted this does not mean that the process is
+    // not going to be recreated on the next update.  For example,
+    // if dependencies + (My or Active), the proclist is cleared
+    // on each update.  This is a workaround
+    static std::map<pid_t, guint64> cpu_times;
+};
+
 
-#include "procman.h"
 
 class ProcmanApp : public Gtk::Application
 {
 private:
-    ProcData *procdata;
+    void load_settings();
 
     void on_preferences_activate(const Glib::VariantBase&);
     void on_lsof_activate(const Glib::VariantBase&);
@@ -17,12 +177,66 @@ private:
 protected:
     ProcmanApp();
 public:
-    static Glib::RefPtr<ProcmanApp> create ();
+    static Glib::RefPtr<ProcmanApp> get ();
+
+    void save_config();
+    void shutdown();
+
+    GtkUIManager     *uimanager;
+    GtkActionGroup   *action_group;
+    GtkWidget        *tree;
+    GtkWidget        *loadavg;
+    GtkWidget        *endprocessbutton;
+    GtkWidget        *popup_menu;
+    GtkWidget        *disk_list;
+    GtkWidget        *notebook;
+    ProcConfig        config;
+    LoadGraph        *cpu_graph;
+    LoadGraph        *mem_graph;
+    LoadGraph        *net_graph;
+    gint              cpu_label_fixed_width;
+    gint              net_label_fixed_width;
+    ProcInfo         *selected_process;
+    GtkTreeSelection *selection;
+    guint             timeout;
+    guint             disk_timeout;
+
+    PrettyTable      *pretty_table;
+
+    GSettings        *settings;
+    GtkWidget        *main_window;
+    GtkUIManager     *menu;
+
+    unsigned         frequency;
+
+    SmoothRefresh    *smooth_refresh;
+
+    guint64           cpu_total_time;
+    guint64           cpu_total_time_last;
+
 protected:
     virtual void on_activate();
     virtual int on_command_line(const Glib::RefPtr<Gio::ApplicationCommandLine>& command_line);
     virtual void on_startup();
-    virtual void on_shutdown();
 };
 
+struct ReniceArgs
+{
+    ProcmanApp *app;
+    int nice_value;
+};
+
+
+struct KillArgs
+{
+    ProcmanApp *app;
+    int signal;
+};
+
+
+void            procman_save_tree_state (GSettings *settings, GtkWidget *tree, const gchar *prefix);
+gboolean        procman_get_tree_state (GSettings *settings, GtkWidget *tree, const gchar *prefix);
+
+
+
 #endif  /* _PROCMAN_PROCMAN_APP_H_ */
diff --git a/src/procman.cpp b/src/procman.cpp
index 33f4093..a4dee1e 100644
--- a/src/procman.cpp
+++ b/src/procman.cpp
@@ -27,192 +27,6 @@
 #include <glib/gi18n.h>
 
 #include "procman-app.h"
-#include "procman.h"
-#include "proctable.h"
-
-ProcData::ProcData()
-    : tree(NULL),
-      cpu_graph(NULL),
-      mem_graph(NULL),
-      net_graph(NULL),
-      selected_process(NULL),
-      timeout(0),
-      disk_timeout(0),
-      cpu_total_time(1),
-      cpu_total_time_last(1)
-{ }
-
-
-ProcData* ProcData::get_instance()
-{
-    static ProcData instance;
-    return &instance;
-}
-
-gboolean
-procman_get_tree_state (GSettings *settings, GtkWidget *tree, const gchar *child_schema)
-{
-    GtkTreeModel *model;
-    GList *columns, *it;
-    gint sort_col;
-    GtkSortType order;
-
-    g_assert(tree);
-    g_assert(child_schema);
-
-    GSettings *pt_settings = g_settings_get_child (settings, child_schema);
-
-    model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree));
-
-    sort_col = g_settings_get_int (pt_settings, "sort-col");
-
-    order = static_cast<GtkSortType>(g_settings_get_int (pt_settings, "sort-order"));
-
-    if (sort_col != -1)
-        gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
-                                              sort_col,
-                                              order);
-
-    columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (tree));
-
-    if(!g_strcmp0(child_schema, "proctree"))
-    {
-        for(it = columns; it; it = it->next)
-        {
-            GtkTreeViewColumn *column;
-            gint width;
-            gboolean visible;
-            int id;
-            gchar *key;
-
-            column = static_cast<GtkTreeViewColumn*>(it->data);
-            id = gtk_tree_view_column_get_sort_column_id (column);
-
-            key = g_strdup_printf ("col-%d-width", id);
-            g_settings_get (pt_settings, key, "i", &width);
-            g_free (key);
-
-            key = g_strdup_printf ("col-%d-visible", id);
-            visible = g_settings_get_boolean (pt_settings, key);
-            g_free (key);
-
-            column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree), id);
-            if(!column) continue;
-            gtk_tree_view_column_set_visible (column, visible);
-            if (visible) {
-                /* ensure column is really visible */
-                width = MAX(width, 10);
-                gtk_tree_view_column_set_fixed_width(column, width);
-            }
-        }
-    }
-
-    if(!g_strcmp0(child_schema, "proctree") ||
-       !g_strcmp0(child_schema, "disktreenew"))
-    {
-        GVariant     *value;
-        GVariantIter iter;
-        int          sortIndex;
-
-        GSList *order = NULL;
-
-        value = g_settings_get_value(pt_settings, "columns-order");
-        g_variant_iter_init(&iter, value);
-
-        while (g_variant_iter_loop (&iter, "i", &sortIndex))
-            order = g_slist_append(order, GINT_TO_POINTER(sortIndex));
-
-        proctable_set_columns_order(GTK_TREE_VIEW(tree), order);
-
-        g_slist_free(order);
-    }
-
-    g_object_unref(pt_settings);
-    pt_settings = NULL;
-
-    g_list_free(columns);
-
-    return TRUE;
-}
-
-void
-procman_save_tree_state (GSettings *settings, GtkWidget *tree, const gchar *child_schema)
-{
-    GtkTreeModel *model;
-    GList *columns;
-    gint sort_col;
-    GtkSortType order;
-
-   if (ProcData::get_instance()->terminating)
-        return;
-
-    g_assert(tree);
-    g_assert(child_schema);
-
-    GSettings *pt_settings = g_settings_get_child (settings, child_schema);
-
-    model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree));
-    if (gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model), &sort_col,
-                                              &order)) {
-        g_settings_set_int (pt_settings, "sort-col", sort_col);
-        g_settings_set_int (pt_settings, "sort-order", order);
-    }
-
-    columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (tree));
-
-    if(!g_strcmp0(child_schema, "proctree") || !g_strcmp0(child_schema, "disktreenew"))
-    {
-        GSList *order;
-        GSList *order_node;
-        GVariantBuilder *builder;
-        GVariant *order_variant;
-
-        order = proctable_get_columns_order(GTK_TREE_VIEW(tree));
-
-        builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
-
-        for(order_node = order; order_node; order_node = order_node->next)
-            g_variant_builder_add(builder, "i", GPOINTER_TO_INT(order_node->data));
-
-        order_variant = g_variant_new("ai", builder);
-        g_settings_set_value(pt_settings, "columns-order", order_variant);
-
-        g_slist_free(order);
-    }
-
-    g_list_free(columns);
-}
-
-void
-procman_save_config (ProcData *data)
-{
-    GSettings *settings = data->settings;
-
-    g_assert(data);
-
-    procman_save_tree_state (data->settings, data->tree, "proctree");
-    procman_save_tree_state (data->settings, data->disk_list, "disktreenew");
-
-    data->config.maximized = gdk_window_get_state(gtk_widget_get_window (data->app)) & GDK_WINDOW_STATE_MAXIMIZED;
-
-    if (!data->config.maximized) {
-        // we only want to store/overwrite size and position info with non-maximized state info
-        data->config.width  = gdk_window_get_width (gtk_widget_get_window (data->app));
-        data->config.height = gdk_window_get_height(gtk_widget_get_window (data->app));
-
-        gtk_window_get_position(GTK_WINDOW(data->app), &data->config.xpos, &data->config.ypos);
-
-        g_settings_set_int (settings, "width", data->config.width);
-        g_settings_set_int (settings, "height", data->config.height);
-        g_settings_set_int (settings, "x-position", data->config.xpos);
-        g_settings_set_int (settings, "y-position", data->config.ypos);
-    }
-    g_settings_set_boolean (settings, "maximized", data->config.maximized);
-
-    g_settings_set_int (settings, "current-tab", data->config.current_tab);
-
-    g_settings_sync ();
-}
 
 
 int
@@ -223,7 +37,7 @@ main (int argc, char *argv[])
     textdomain (GETTEXT_PACKAGE);
     setlocale (LC_ALL, "");
 
-    Glib::RefPtr<ProcmanApp> application = ProcmanApp::create();
+    Glib::RefPtr<ProcmanApp> application = ProcmanApp::get();
     return application->run (argc, argv);
 }
 
diff --git a/src/procman_gksu.cpp b/src/procman_gksu.cpp
index 58faa0c..6ee6693 100644
--- a/src/procman_gksu.cpp
+++ b/src/procman_gksu.cpp
@@ -1,6 +1,6 @@
 #include <config.h>
 
-#include "procman.h"
+#include "procman-app.h"
 #include "procman_gksu.h"
 #include "util.h"
 
diff --git a/src/procman_gnomesu.cpp b/src/procman_gnomesu.cpp
index 42f891c..c096dac 100644
--- a/src/procman_gnomesu.cpp
+++ b/src/procman_gnomesu.cpp
@@ -2,7 +2,7 @@
 
 #include <glib.h>
 
-#include "procman.h"
+#include "procman-app.h"
 #include "procman_gnomesu.h"
 #include "util.h"
 
diff --git a/src/procman_pkexec.cpp b/src/procman_pkexec.cpp
index 70c3090..4dc4e67 100644
--- a/src/procman_pkexec.cpp
+++ b/src/procman_pkexec.cpp
@@ -1,6 +1,6 @@
 #include <config.h>
 
-#include "procman.h"
+#include "procman-app.h"
 #include "procman_pkexec.h"
 #include "util.h"
 
diff --git a/src/procproperties.cpp b/src/procproperties.cpp
index c61f1b9..ea64148 100644
--- a/src/procproperties.cpp
+++ b/src/procproperties.cpp
@@ -31,7 +31,7 @@
 #include <sys/sysctl.h>
 #endif
 
-#include "procman.h"
+#include "procman-app.h"
 #include "procproperties.h"
 #include "proctable.h"
 #include "util.h"
@@ -188,7 +188,7 @@ close_procprop_dialog (GtkDialog *dialog, gint id, gpointer data)
 }
 
 static GtkWidget *
-create_procproperties_tree (ProcData *procdata)
+create_procproperties_tree (ProcmanApp *app)
 {
     GtkWidget *tree;
     GtkListStore *model;
@@ -217,7 +217,7 @@ create_procproperties_tree (ProcData *procdata)
     }
 
     gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(tree), FALSE);
-    fill_proc_properties(tree, procdata->selected_process);
+    fill_proc_properties(tree, app->selected_process);
 
     return tree;
 }
@@ -240,7 +240,8 @@ static void
 create_single_procproperties_dialog (GtkTreeModel *model, GtkTreePath *path,
                                      GtkTreeIter *iter, gpointer data)
 {
-    ProcData *procdata = static_cast<ProcData*>(data);
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+
     GtkWidget *procpropdialog;
     GtkWidget *dialog_vbox, *vbox;
     GtkWidget *cmd_hbox;
@@ -288,7 +289,7 @@ create_single_procproperties_dialog (GtkTreeModel *model, GtkTreePath *path,
     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled),
                                          GTK_SHADOW_IN);
 
-    tree = create_procproperties_tree (procdata);
+    tree = create_procproperties_tree (app);
     gtk_container_add (GTK_CONTAINER (scrolled), tree);
     g_object_set_data (G_OBJECT (tree), "selected_info", info);
 
@@ -307,8 +308,8 @@ create_single_procproperties_dialog (GtkTreeModel *model, GtkTreePath *path,
 }
 
 void
-create_procproperties_dialog (ProcData *procdata)
+create_procproperties_dialog (ProcmanApp *app)
 {
-    gtk_tree_selection_selected_foreach (procdata->selection, create_single_procproperties_dialog,
-                                         procdata);
+    gtk_tree_selection_selected_foreach (app->selection, create_single_procproperties_dialog,
+                                         app);
 }
diff --git a/src/procproperties.h b/src/procproperties.h
index ca1103c..28b3958 100644
--- a/src/procproperties.h
+++ b/src/procproperties.h
@@ -23,9 +23,9 @@
 
 #include <glib.h>
 
-#include "procman.h"
+#include "procman-app.h"
 
-void create_procproperties_dialog (ProcData *procdata);
+void create_procproperties_dialog (ProcmanApp *app);
 
 #endif
 
diff --git a/src/proctable.cpp b/src/proctable.cpp
index 96f6bee..97da46f 100644
--- a/src/proctable.cpp
+++ b/src/proctable.cpp
@@ -49,7 +49,7 @@
 #include <systemd/sd-login.h>
 #endif
 
-#include "procman.h"
+#include "procman-app.h"
 #include "selection.h"
 #include "proctable.h"
 #include "callbacks.h"
@@ -73,12 +73,12 @@ ProcInfo* ProcInfo::find(pid_t pid)
 
 
 static void
-set_proctree_reorderable(ProcData *procdata)
+set_proctree_reorderable(ProcmanApp *app)
 {
     GList *columns, *col;
     GtkTreeView *proctree;
 
-    proctree = GTK_TREE_VIEW(procdata->tree);
+    proctree = GTK_TREE_VIEW(app->tree);
 
     columns = gtk_tree_view_get_columns (proctree);
 
@@ -90,11 +90,11 @@ set_proctree_reorderable(ProcData *procdata)
 
 
 static void
-cb_columns_changed(GtkTreeView *treeview, gpointer user_data)
+cb_columns_changed(GtkTreeView *treeview, gpointer data)
 {
-    ProcData * const procdata = static_cast<ProcData*>(user_data);
+    ProcmanApp * const app = static_cast<ProcmanApp *>(data);
 
-    procman_save_tree_state(procdata->settings,
+    procman_save_tree_state(app->settings,
                             GTK_WIDGET(treeview),
                             "proctree");
 }
@@ -183,7 +183,7 @@ cb_proctable_column_resized(GtkWidget *widget)
     GSettings *settings;
     gint saved_width;
 
-    settings = g_settings_get_child (ProcData::get_instance()->settings, "proctree");
+    settings = g_settings_get_child (ProcmanApp::get()->settings, "proctree");
     id = gtk_tree_view_column_get_sort_column_id (column);
     width = gtk_tree_view_column_get_width (column);
     key = g_strdup_printf ("col-%d-width", id);
@@ -221,10 +221,14 @@ search_equal_func(GtkTreeModel *model,
     return found;
 }
 
-
+static void
+cb_proctree_destroying (GtkTreeView *self, gpointer data)
+{
+    g_signal_handlers_disconnect_by_func(self, (gpointer) cb_columns_changed, data);
+}
 
 GtkWidget *
-proctable_new (ProcData * const procdata)
+proctable_new (ProcmanApp * const app)
 {
     GtkWidget *proctree;
     GtkTreeStore *model;
@@ -297,7 +301,7 @@ proctable_new (ProcData * const procdata)
     proctree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
     gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (proctree), COL_TOOLTIP);
     g_object_set(G_OBJECT(proctree),
-                 "show-expanders", procdata->config.show_tree,
+                 "show-expanders", app->config.show_tree,
                  NULL);
     gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (proctree),
                                          search_equal_func,
@@ -450,11 +454,11 @@ proctable_new (ProcData * const procdata)
         }
     }
 
-    procdata->tree = proctree;
+    app->tree = proctree;
 
-    set_proctree_reorderable(procdata);
+    set_proctree_reorderable(app);
 
-    procman_get_tree_state (procdata->settings, proctree, "proctree");
+    procman_get_tree_state (app->settings, proctree, "proctree");
 
     /* Override column settings by hiding this column if it's meaningless: */
     if (!can_show_security_context_column ()) {
@@ -484,14 +488,18 @@ proctable_new (ProcData * const procdata)
 
     g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (proctree))),
                       "changed",
-                      G_CALLBACK (cb_row_selected), procdata);
+                      G_CALLBACK (cb_row_selected), app);
     g_signal_connect (G_OBJECT (proctree), "popup_menu",
-                      G_CALLBACK (cb_tree_popup_menu), procdata);
+                      G_CALLBACK (cb_tree_popup_menu), app);
     g_signal_connect (G_OBJECT (proctree), "button_press_event",
-                      G_CALLBACK (cb_tree_button_pressed), procdata);
+                      G_CALLBACK (cb_tree_button_pressed), app);
+
+    g_signal_connect (G_OBJECT(proctree), "destroy",
+                      G_CALLBACK(cb_proctree_destroying),
+                      app);
 
     g_signal_connect (G_OBJECT(proctree), "columns-changed",
-                      G_CALLBACK(cb_columns_changed), procdata);
+                      G_CALLBACK(cb_columns_changed), app);
 
     return proctree;
 }
@@ -625,9 +633,8 @@ get_process_memory_info(ProcInfo *info)
 static void
 update_info_mutable_cols(ProcInfo *info)
 {
-    ProcData * const procdata = ProcData::get_instance();
     GtkTreeModel *model;
-    model = gtk_tree_view_get_model(GTK_TREE_VIEW(procdata->tree));
+    model = gtk_tree_view_get_model(GTK_TREE_VIEW(ProcmanApp::get()->tree));
 
     using procman::tree_store_update;
 
@@ -654,13 +661,13 @@ update_info_mutable_cols(ProcInfo *info)
 
 
 static void
-insert_info_to_tree (ProcInfo *info, ProcData *procdata, bool forced = false)
+insert_info_to_tree (ProcInfo *info, ProcmanApp *app, bool forced = false)
 {
     GtkTreeModel *model;
 
-    model = gtk_tree_view_get_model (GTK_TREE_VIEW (procdata->tree));
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW (app->tree));
 
-    if (procdata->config.show_tree) {
+    if (app->config.show_tree) {
 
         ProcInfo *parent = 0;
 
@@ -671,13 +678,13 @@ insert_info_to_tree (ProcInfo *info, ProcData *procdata, bool forced = false)
             GtkTreePath *parent_node = gtk_tree_model_get_path(model, &parent->node);
             gtk_tree_store_insert(GTK_TREE_STORE(model), &info->node, &parent->node, 0);
 
-            if (!gtk_tree_view_row_expanded(GTK_TREE_VIEW(procdata->tree), parent_node)
+            if (!gtk_tree_view_row_expanded(GTK_TREE_VIEW(app->tree), parent_node)
 #ifdef __linux__
                 // on linuxes we don't want to expand kthreadd by default (always has pid 2)
                 && (parent->pid != 2)
 #endif
             )
-                gtk_tree_view_expand_row(GTK_TREE_VIEW(procdata->tree), parent_node, FALSE);
+                gtk_tree_view_expand_row(GTK_TREE_VIEW(app->tree), parent_node, FALSE);
             gtk_tree_path_free(parent_node);
         } else
             gtk_tree_store_insert(GTK_TREE_STORE(model), &info->node, NULL, 0);
@@ -694,7 +701,7 @@ insert_info_to_tree (ProcInfo *info, ProcData *procdata, bool forced = false)
                         COL_SECURITYCONTEXT, info->security_context,
                         -1);
 
-    procdata->pretty_table.set_icon(*info);
+    app->pretty_table->set_icon(*info);
 
     procman_debug("inserted %d%s", info->pid, (forced ? " (forced)" : ""));
 }
@@ -705,7 +712,7 @@ insert_info_to_tree (ProcInfo *info, ProcData *procdata, bool forced = false)
 */
 template<typename List>
 static void
-remove_info_from_tree (ProcData *procdata, GtkTreeModel *model,
+remove_info_from_tree (ProcmanApp *app, GtkTreeModel *model,
                        ProcInfo *current, List &orphans, unsigned lvl = 0)
 {
     GtkTreeIter child_node;
@@ -725,13 +732,13 @@ remove_info_from_tree (ProcData *procdata, GtkTreeModel *model,
     while (gtk_tree_model_iter_children(model, &child_node, &current->node)) {
         ProcInfo *child = 0;
         gtk_tree_model_get(model, &child_node, COL_POINTER, &child, -1);
-        remove_info_from_tree(procdata, model, child, orphans, lvl + 1);
+        remove_info_from_tree(app, model, child, orphans, lvl + 1);
     }
 
     g_assert(not gtk_tree_model_iter_has_child(model, &current->node));
 
-    if (procdata->selected_process == current)
-        procdata->selected_process = NULL;
+    if (app->selected_process == current)
+        app->selected_process = NULL;
 
     orphans.push_back(current);
     gtk_tree_store_remove(GTK_TREE_STORE(model), &current->node);
@@ -769,7 +776,7 @@ get_process_systemd_info(ProcInfo *info)
 }
 
 static void
-update_info (ProcData *procdata, ProcInfo *info)
+update_info (ProcmanApp *app, ProcInfo *info)
 {
     glibtop_proc_state procstate;
     glibtop_proc_uid procuid;
@@ -789,11 +796,11 @@ update_info (ProcData *procdata, ProcInfo *info)
 
     info->set_user(procstate.uid);
 
-    info->pcpu = (proctime.rtime - info->cpu_time) * 100 / procdata->cpu_total_time;
+    info->pcpu = (proctime.rtime - info->cpu_time) * 100 / app->cpu_total_time;
     info->pcpu = MIN(info->pcpu, 100);
 
-    if (not procdata->config.solaris_mode)
-        info->pcpu *= procdata->config.num_cpus;
+    if (not app->config.solaris_mode)
+        info->pcpu *= app->config.num_cpus;
 
     ProcInfo::cpu_times[info->pid] = info->cpu_time = proctime.rtime;
     info->nice = procuid.nice;
@@ -855,12 +862,12 @@ ProcInfo::ProcInfo(pid_t pid)
 }
 
 static void
-refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
+refresh_list (ProcmanApp *app, const pid_t* pid_list, const guint n)
 {
     typedef std::list<ProcInfo*> ProcList;
     ProcList addition;
 
-    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (procdata->tree));
+    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (app->tree));
     guint i;
 
     // Add or update processes in the process list
@@ -873,7 +880,7 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
             addition.push_back(info);
         }
 
-        update_info (procdata, info);
+        update_info (app, info);
     }
 
 
@@ -892,7 +899,7 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
 
         if (pids.find(info->pid) == pids.end()) {
             procman_debug("ripping %d", info->pid);
-            remove_info_from_tree(procdata, model, info, addition);
+            remove_info_from_tree(app, model, info, addition);
             addition.remove(info);
             ProcInfo::all.erase(it);
             delete info;
@@ -905,7 +912,7 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
     // pid_list == ProcInfo::all + addition
 
 
-    if (procdata->config.show_tree) {
+    if (app->config.show_tree) {
 
         // insert process in the tree. walk through the addition list
         // (new process + process that have a new parent). This loop
@@ -942,7 +949,7 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
 
 
                 if ((*it)->ppid == 0 or in_tree.find((*it)->ppid) != in_tree.end()) {
-                    insert_info_to_tree(*it, procdata);
+                    insert_info_to_tree(*it, app);
                     in_tree.insert((*it)->pid);
                     it = addition.erase(it);
                     continue;
@@ -952,7 +959,7 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
                 // if the parent is unreachable
                 if (not parent) {
                     // or std::find(addition.begin(), addition.end(), parent) == addition.end()) {
-                    insert_info_to_tree(*it, procdata, true);
+                    insert_info_to_tree(*it, app, true);
                     in_tree.insert((*it)->pid);
                     it = addition.erase(it);
                     continue;
@@ -965,7 +972,7 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
     else {
         // don't care of the tree
         for (ProcList::iterator it(addition.begin()); it != addition.end(); ++it)
-            insert_info_to_tree(*it, procdata);
+            insert_info_to_tree(*it, app);
     }
 
 
@@ -975,7 +982,7 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
 
 
 void
-proctable_update_list (ProcData * const procdata)
+proctable_update_list (ProcmanApp *app)
 {
     pid_t* pid_list;
     glibtop_proclist proclist;
@@ -983,7 +990,7 @@ proctable_update_list (ProcData * const procdata)
     gint which, arg;
     procman::SelectionMemento selection;
 
-    switch (procdata->config.whose_process) {
+    switch (app->config.whose_process) {
         case ALL_PROCESSES:
             which = GLIBTOP_KERN_PROC_ALL;
             arg = 0;
@@ -992,18 +999,18 @@ proctable_update_list (ProcData * const procdata)
         case ACTIVE_PROCESSES:
             which = GLIBTOP_KERN_PROC_ALL | GLIBTOP_EXCLUDE_IDLE;
             arg = 0;
-            if (procdata->config.show_tree)
+            if (app->config.show_tree)
             {
-                selection.save(procdata->tree);
+                selection.save(app->tree);
             }
             break;
 
         default:
             which = GLIBTOP_KERN_PROC_UID;
             arg = getuid ();
-            if (procdata->config.show_tree)
+            if (app->config.show_tree)
             {
-                selection.save(procdata->tree);
+                selection.save(app->tree);
             }
             break;
     }
@@ -1013,12 +1020,12 @@ proctable_update_list (ProcData * const procdata)
     /* FIXME: total cpu time elapsed should be calculated on an individual basis here
     ** should probably have a total_time_last gint in the ProcInfo structure */
     glibtop_get_cpu (&cpu);
-    procdata->cpu_total_time = MAX(cpu.total - procdata->cpu_total_time_last, 1);
-    procdata->cpu_total_time_last = cpu.total;
+    app->cpu_total_time = MAX(cpu.total - app->cpu_total_time_last, 1);
+    app->cpu_total_time_last = cpu.total;
 
-    refresh_list (procdata, pid_list, proclist.number);
+    refresh_list (app, pid_list, proclist.number);
 
-    selection.restore(procdata->tree);
+    selection.restore(app->tree);
 
     g_free (pid_list);
 
@@ -1027,35 +1034,35 @@ proctable_update_list (ProcData * const procdata)
 
 
 void
-proctable_update_all (ProcData * const procdata)
+proctable_update_all (ProcmanApp * const app)
 {
     char* string;
 
     string = make_loadavg_string();
-    gtk_label_set_text (GTK_LABEL(procdata->loadavg), string);
+    gtk_label_set_text (GTK_LABEL(app->loadavg), string);
     g_free (string);
 
-    proctable_update_list (procdata);
+    proctable_update_list (app);
 }
 
 
 void
-proctable_clear_tree (ProcData * const procdata)
+proctable_clear_tree (ProcmanApp * const app)
 {
     GtkTreeModel *model;
 
-    model = gtk_tree_view_get_model (GTK_TREE_VIEW (procdata->tree));
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW (app->tree));
 
     gtk_tree_store_clear (GTK_TREE_STORE (model));
 
-    proctable_free_table (procdata);
+    proctable_free_table (app);
 
-    update_sensitivity(procdata);
+    update_sensitivity(app);
 }
 
 
 void
-proctable_free_table (ProcData * const procdata)
+proctable_free_table (ProcmanApp * const app)
 {
     for (ProcInfo::Iterator it(ProcInfo::begin()); it != ProcInfo::end(); ++it)
         delete it->second;
@@ -1088,7 +1095,7 @@ ProcInfo::set_icon(Glib::RefPtr<Gdk::Pixbuf> icon)
     this->pixbuf = icon;
 
     GtkTreeModel *model;
-    model = gtk_tree_view_get_model(GTK_TREE_VIEW(ProcData::get_instance()->tree));
+    model = gtk_tree_view_get_model(GTK_TREE_VIEW(ProcmanApp::get()->tree));
     gtk_tree_store_set(GTK_TREE_STORE(model), &this->node,
                        COL_PIXBUF, (this->pixbuf ? this->pixbuf->gobj() : NULL),
                        -1);
diff --git a/src/proctable.h b/src/proctable.h
index dbfeada..e6b01ab 100644
--- a/src/proctable.h
+++ b/src/proctable.h
@@ -22,7 +22,7 @@
 
 #include <glib.h>
 #include <gtk/gtk.h>
-#include "procman.h"
+#include "procman-app.h"
 
 enum
 {
@@ -56,12 +56,12 @@ enum
 };
 
 
-GtkWidget*      proctable_new (ProcData *data);
-void            proctable_update_table (ProcData *data);
-void            proctable_update_list (ProcData *data);
-void            proctable_update_all (ProcData *data);
-void            proctable_clear_tree (ProcData *data);
-void            proctable_free_table (ProcData *data);
+GtkWidget*      proctable_new (ProcmanApp *app);
+void            proctable_update_table (ProcmanApp *app);
+void            proctable_update_list (ProcmanApp *app);
+void            proctable_update_all (ProcmanApp *app);
+void            proctable_clear_tree (ProcmanApp *app);
+void            proctable_free_table (ProcmanApp *app);
 
 GSList*         proctable_get_columns_order(GtkTreeView *treeview);
 void            proctable_set_columns_order(GtkTreeView *treeview, GSList *order);
diff --git a/src/selinux.cpp b/src/selinux.cpp
index f9eaddf..2115453 100644
--- a/src/selinux.cpp
+++ b/src/selinux.cpp
@@ -3,7 +3,7 @@
 #include <glib.h>
 
 #include "selinux.h"
-#include "procman.h"
+#include "procman-app.h"
 #include "util.h"
 
 
diff --git a/src/selinux.h b/src/selinux.h
index be79ce9..6e099f2 100644
--- a/src/selinux.h
+++ b/src/selinux.h
@@ -3,7 +3,7 @@
 
 #include <glib.h>
 
-#include "procman.h"
+#include "procman-app.h"
 
 void
 get_process_selinux_context (ProcInfo *info);
diff --git a/src/smooth_refresh.cpp b/src/smooth_refresh.cpp
index f3ef70e..32d719d 100644
--- a/src/smooth_refresh.cpp
+++ b/src/smooth_refresh.cpp
@@ -11,7 +11,7 @@
 #include <algorithm>
 
 #include "smooth_refresh.h"
-#include "procman.h"
+#include "procman-app.h"
 #include "util.h"
 
 
@@ -83,7 +83,7 @@ void SmoothRefresh::reset()
     glibtop_get_cpu(&cpu);
     glibtop_get_proc_time(&proctime, getpid());
 
-    this->interval = ProcData::get_instance()->config.update_interval;
+    this->interval = ProcmanApp::get()->config.update_interval;
     this->last_pcpu = PCPU_LO;
     this->last_total_time = cpu.total;
     this->last_cpu_time = proctime.rtime;
@@ -102,7 +102,7 @@ SmoothRefresh::~SmoothRefresh()
 bool
 SmoothRefresh::get(guint &new_interval)
 {
-    const unsigned config_interval = ProcData::get_instance()->config.update_interval;
+    const unsigned config_interval = ProcmanApp::get()->config.update_interval;
 
     g_assert(this->interval >= config_interval);
 
diff --git a/src/sysinfo.cpp b/src/sysinfo.cpp
index 5a0169a..041569d 100644
--- a/src/sysinfo.cpp
+++ b/src/sysinfo.cpp
@@ -28,7 +28,7 @@
 #include <sys/utsname.h>
 
 #include "sysinfo.h"
-#include "procman.h"
+#include "procman-app.h"
 #include "util.h"
 
 
@@ -797,9 +797,8 @@ namespace procman
         static GtkWidget* ui;
 
         if (!ui) {
-            ProcData* procdata = ProcData::get_instance();
             ui = procman_create_sysinfo_view();
-            GtkBox* box = GTK_BOX(gtk_notebook_get_nth_page(GTK_NOTEBOOK(procdata->notebook),
+            GtkBox* box = GTK_BOX(gtk_notebook_get_nth_page(GTK_NOTEBOOK(ProcmanApp::get()->notebook),
                                                             PROCMAN_TAB_SYSINFO));
             gtk_box_pack_start(box, ui, TRUE, TRUE, 0);
             gtk_widget_show_all(ui);
diff --git a/src/util.cpp b/src/util.cpp
index 660664d..8532e13 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -12,7 +12,7 @@
 #include <cstring>
 
 #include "util.h"
-#include "procman.h"
+#include "procman-app.h"
 
 extern "C" {
 #include "e_date.h"
@@ -470,7 +470,7 @@ namespace procman
 
         g_value_unset(&value);
 
-        time = 100 * time / ProcData::get_instance()->frequency;
+        time = 100 * time / ProcmanApp::get()->frequency;
         char *str = format_duration_for_display(time);
         g_object_set(renderer, "text", str, NULL);
         g_free(str);
@@ -604,13 +604,13 @@ namespace procman
 
     std::string format_network(guint64 rate, guint64 max_rate)
     {
-        return procman::format_size(rate, max_rate, ProcData::get_instance()->config.network_in_bits);
+        return procman::format_size(rate, max_rate, ProcmanApp::get()->config.network_in_bits);
     }
 
 
     std::string format_network_rate(guint64 rate, guint64 max_rate)
     {
-        return procman::format_rate(rate, max_rate, ProcData::get_instance()->config.network_in_bits);
+        return procman::format_rate(rate, max_rate, ProcmanApp::get()->config.network_in_bits);
     }
 
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]