diff --git a/CMakeLists.txt b/CMakeLists.txt
index 20e68d9..7a4e426 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -289,12 +289,8 @@
    src/utils/files.h
    src/utils/files.cpp
    ${GIT_REVISION_OUTPUT_FILE}
-   src/utils/menus.h
-   src/utils/menus.cpp
    src/utils/accounts.h
    src/utils/accounts.cpp
-   src/contactpopover.h
-   src/contactpopover.cpp
    src/choosecontactview.h
    src/choosecontactview.cpp
    src/editcontactview.h
@@ -303,8 +299,6 @@
    src/native/dbuserrorhandler.cpp
    src/ringwelcomeview.h
    src/ringwelcomeview.cpp
-   src/recentcontactsview.h
-   src/recentcontactsview.cpp
    src/webkitchatcontainer.h
    src/webkitchatcontainer.cpp
    src/chatview.h
@@ -313,25 +307,19 @@
    src/avatarmanipulation.cpp
    src/accountimportexportview.h
    src/accountimportexportview.cpp
-   src/contactpopupmenu.h
-   src/contactpopupmenu.cpp
    src/cc-crop-area.h
    src/cc-crop-area.c
    src/models/namenumberfilterproxymodel.h
    src/models/namenumberfilterproxymodel.cpp
-   src/pendingcontactrequests.h
-   src/pendingcontactrequests.cpp
-   src/contactrequestcontentview.h
-   src/contactrequestcontentview.cpp
    src/accountbanstab.h
    src/accountbanstab.cpp
    src/bannedcontactsview.h
    src/bannedcontactsview.cpp
-   src/accountcontainer.h
-   src/conversationpopupmenu.h
-   src/conversationpopupmenu.cpp
    src/conversationsview.h
    src/conversationsview.cpp
+   src/conversationpopupmenu.h
+   src/conversationpopupmenu.cpp
+   src/accountcontainer.h
 )
 
 # compile glib resource files to c code
diff --git a/src/contactpopover.cpp b/src/contactpopover.cpp
deleted file mode 100644
index c2ff0c8..0000000
--- a/src/contactpopover.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (C) 2015-2017 Savoir-faire Linux Inc.
- *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#include "contactpopover.h"
-
-#include <contactmethod.h>
-#include "choosecontactview.h"
-#include "editcontactview.h"
-
-struct _ContactPopover
-{
-#if GTK_CHECK_VERSION(3,12,0)
-    GtkPopover parent;
-#else
-    GtkWindow parent;
-#endif
-};
-
-struct _ContactPopoverClass
-{
-#if GTK_CHECK_VERSION(3,12,0)
-    GtkPopoverClass parent_class;
-#else
-    GtkWindowClass parent_class;
-#endif
-};
-
-typedef struct _ContactPopoverPrivate ContactPopoverPrivate;
-
-struct _ContactPopoverPrivate
-{
-    GtkWidget *choosecontactview;
-    GtkWidget *editcontactview;
-
-    ContactMethod *cm;
-};
-
-#if GTK_CHECK_VERSION(3,12,0)
-    G_DEFINE_TYPE_WITH_PRIVATE(ContactPopover, contact_popover, GTK_TYPE_POPOVER);
-#else
-    G_DEFINE_TYPE_WITH_PRIVATE(ContactPopover, contact_popover, GTK_TYPE_WINDOW);
-#endif
-
-
-#define CONTACT_POPOVER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CONTACT_POPOVER_TYPE, ContactPopoverPrivate))
-
-#if !GTK_CHECK_VERSION(3,12,0)
-static gboolean
-contact_popover_button_release(GtkWidget *self, GdkEventButton *event)
-{
-    auto child = gtk_bin_get_child(GTK_BIN(self));
-
-    auto event_widget = gtk_get_event_widget((GdkEvent *) event);
-
-    GtkAllocation child_alloc;
-
-    gtk_widget_get_allocation(child, &child_alloc);
-
-    if (event->x < child_alloc.x ||
-        event->x > child_alloc.x + child_alloc.width ||
-        event->y < child_alloc.y ||
-        event->y > child_alloc.y + child_alloc.height)
-        gtk_widget_destroy(self);
-    else if (!gtk_widget_is_ancestor(event_widget, self))
-        gtk_widget_destroy(self);
-
-    return GDK_EVENT_PROPAGATE;
-}
-
-static gboolean
-contact_popover_key_press(GtkWidget *self, GdkEventKey *event)
-{
-    if (event->keyval == GDK_KEY_Escape) {
-        gtk_widget_destroy(self);
-        return GDK_EVENT_STOP;
-    }
-
-    return GDK_EVENT_PROPAGATE;
-}
-#endif
-
-static void
-contact_popover_init(ContactPopover *self)
-{
-#if GTK_CHECK_VERSION(3,12,0)
-    /* for now, destroy the popover on close, as we will construct a new one
-     * each time we need it */
-    g_signal_connect(self, "closed", G_CALLBACK(gtk_widget_destroy), NULL);
-#else
-    /* destroy the window on ESC, or when the user clicks outside of it */
-    g_signal_connect(self, "button_release_event", G_CALLBACK(contact_popover_button_release), NULL);
-    g_signal_connect(self, "key_press_event", G_CALLBACK(contact_popover_key_press), NULL);
-#endif
-}
-
-static void
-contact_popover_dispose(GObject *object)
-{
-    G_OBJECT_CLASS(contact_popover_parent_class)->dispose(object);
-}
-
-static void
-contact_popover_finalize(GObject *object)
-{
-    G_OBJECT_CLASS(contact_popover_parent_class)->finalize(object);
-}
-static void
-contact_popover_class_init(ContactPopoverClass *klass)
-{
-    G_OBJECT_CLASS(klass)->finalize = contact_popover_finalize;
-    G_OBJECT_CLASS(klass)->dispose = contact_popover_dispose;
-}
-
-static void
-construct_edit_contact_view(ContactPopover *self, Person *p)
-{
-    g_return_if_fail(IS_CONTACT_POPOVER(self));
-    ContactPopoverPrivate *priv = CONTACT_POPOVER_GET_PRIVATE(self);
-
-    priv->editcontactview = edit_contact_view_new(priv->cm, p);
-    g_object_add_weak_pointer(G_OBJECT(priv->editcontactview), (gpointer *)&priv->editcontactview);
-
-    gtk_container_remove(GTK_CONTAINER(self), priv->choosecontactview);
-    gtk_container_add(GTK_CONTAINER(self), priv->editcontactview);
-
-#if !GTK_CHECK_VERSION(3,12,0)
-    /* resize the window to shrink to the new view */
-    gtk_window_resize(GTK_WINDOW(self), 1, 1);
-#endif
-
-    /* destroy this popover when the contact is saved */
-    g_signal_connect_swapped(priv->editcontactview, "person-saved", G_CALLBACK(gtk_widget_destroy), self);
-}
-
-static void
-new_person_clicked(ContactPopover *self)
-{
-    g_return_if_fail(IS_CONTACT_POPOVER(self));
-    construct_edit_contact_view(self, NULL);
-}
-
-static void
-person_selected(ContactPopover *self, Person *p)
-{
-    g_return_if_fail(IS_CONTACT_POPOVER(self));
-    construct_edit_contact_view(self, p);
-}
-
-/**
- * For gtk+ >= 3.12 this will create a GtkPopover pointing to the parent and if
- * given, the GdkRectangle. Otherwise, this will create an undecorated GtkWindow
- * which will be centered on the toplevel window of the given parent.
- * This is to ensure cmpatibility with gtk+3.10.
- */
-GtkWidget *
-contact_popover_new(ContactMethod *cm, GtkWidget *parent,
-#if !GTK_CHECK_VERSION(3,12,0)
-                    G_GNUC_UNUSED
-#endif
-                    GdkRectangle *rect)
-{
-    g_return_val_if_fail(cm, NULL);
-
-#if GTK_CHECK_VERSION(3,12,0)
-    gpointer self = g_object_new(CONTACT_POPOVER_TYPE,
-                                 "relative-to", parent,
-                                 "position", GTK_POS_RIGHT,
-                                 NULL);
-
-    if (rect)
-        gtk_popover_set_pointing_to(GTK_POPOVER(self), rect);
-#else
-    /* get the toplevel parent and try to center on it */
-    if (parent && GTK_IS_WIDGET(parent)) {
-        parent = gtk_widget_get_toplevel(GTK_WIDGET(parent));
-        if (!gtk_widget_is_toplevel(parent)) {
-            parent = NULL;
-            g_debug("could not get top level parent");
-        }
-    }
-
-    gpointer self = g_object_new(CONTACT_POPOVER_TYPE,
-                                 "modal", TRUE,
-                                 "transient-for", parent,
-                                 "window-position", GTK_WIN_POS_CENTER_ON_PARENT,
-                                 "decorated", FALSE,
-                                 "resizable", FALSE,
-                                 NULL);
-#endif
-
-    ContactPopoverPrivate *priv = CONTACT_POPOVER_GET_PRIVATE(self);
-    priv->cm = cm;
-
-    priv->choosecontactview = choose_contact_view_new(cm);
-    gtk_container_add(GTK_CONTAINER(self), priv->choosecontactview);
-    g_object_add_weak_pointer(G_OBJECT(priv->choosecontactview), (gpointer *)&priv->choosecontactview);
-
-    g_signal_connect_swapped(priv->choosecontactview, "new-person-clicked", G_CALLBACK(new_person_clicked), self);
-    g_signal_connect_swapped(priv->choosecontactview, "person-selected", G_CALLBACK(person_selected), self);
-
-    return (GtkWidget *)self;
-}
diff --git a/src/contactpopover.h b/src/contactpopover.h
deleted file mode 100644
index 28c17b1..0000000
--- a/src/contactpopover.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (C) 2015-2017 Savoir-faire Linux Inc.
- *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#ifndef _CONTACTPOPOVER_H
-#define _CONTACTPOPOVER_H
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-class ContactMethod;
-
-#define CONTACT_POPOVER_TYPE            (contact_popover_get_type ())
-#define CONTACT_POPOVER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CONTACT_POPOVER_TYPE, ContactPopover))
-#define CONTACT_POPOVER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), CONTACT_POPOVER_TYPE, ContactPopoverClass))
-#define IS_CONTACT_POPOVER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), CONTACT_POPOVER_TYPE))
-#define IS_CONTACT_POPOVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), CONTACT_POPOVER_TYPE))
-
-typedef struct _ContactPopover      ContactPopover;
-typedef struct _ContactPopoverClass ContactPopoverClass;
-
-GType      contact_popover_get_type  (void) G_GNUC_CONST;
-
-/**
- * For gtk+ >= 3.12 this will create a GtkPopover pointing to the parent and if
- * given, the GdkRectangle. Otherwise, this will create an undecorated GtkWindow
- * which will be centered on the toplevel window of the given parent.
- * This is to ensure cmpatibility with gtk+3.10.
- */
-GtkWidget *contact_popover_new       (ContactMethod *cm, GtkWidget *parent, GdkRectangle *rect);
-
-G_END_DECLS
-
-#endif /* _CONTACTPOPOVER_H */
diff --git a/src/contactpopupmenu.cpp b/src/contactpopupmenu.cpp
deleted file mode 100644
index 7dc4a7c..0000000
--- a/src/contactpopupmenu.cpp
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
- *  Copyright (C) 2016-2017 Savoir-faire Linux Inc.
- *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#include "contactpopupmenu.h"
-#include "utils/accounts.h"
-
-// GTK+ related
-#include <glib/gi18n.h>
-
-// LRC
-#include <contactmethod.h>
-#include <person.h>
-#include <personmodel.h>
-#include <numbercategory.h>
-#include <call.h>
-#include <account.h>
-
-// Ring client
-#include "utils/calling.h"
-#include "models/gtkqtreemodel.h"
-#include "utils/menus.h"
-
-static constexpr const char* COPY_DATA_KEY = "copy_data";
-
-struct _ContactPopupMenu
-{
-    GtkMenu parent;
-};
-
-struct _ContactPopupMenuClass
-{
-    GtkMenuClass parent_class;
-};
-
-typedef struct _ContactPopupMenuPrivate ContactPopupMenuPrivate;
-
-struct _ContactPopupMenuPrivate
-{
-    GtkTreeView *treeview;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE(ContactPopupMenu, contact_popup_menu, GTK_TYPE_MENU);
-
-#define CONTACT_POPUP_MENU_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CONTACT_POPUP_MENU_TYPE, ContactPopupMenuPrivate))
-
-static void
-copy_contact_info(GtkWidget *item, G_GNUC_UNUSED gpointer user_data)
-{
-    gpointer data = g_object_get_data(G_OBJECT(item), COPY_DATA_KEY);
-    g_return_if_fail(data);
-    gchar* text = (gchar *)data;
-    GtkClipboard* clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
-    gtk_clipboard_set_text(clip, text, -1);
-}
-
-static void
-call_contactmethod(G_GNUC_UNUSED GtkWidget *item, ContactMethod *cm)
-{
-    g_return_if_fail(cm);
-    place_new_call(cm);
-}
-
-static void
-add_daemon_contact(G_GNUC_UNUSED GtkWidget *item, ContactMethod *cm)
-{
-    // get the choosen account
-    auto account = cm->account();
-    if (not account) {
-        account = get_active_ring_account();
-
-        if (not account) {
-            g_warning("invalid account, cannot send invitation!");
-            return;
-        }
-    }
-
-    // Send a request to the new contact
-    if (not account->sendContactRequest(cm))
-        g_warning("contact request not forwarded, cannot send invitation!");
-}
-
-static void
-add_contact(G_GNUC_UNUSED GtkWidget *item, ContactMethod *cm)
-{
-    const auto& collections = PersonModel::instance().enabledCollections();
-    CollectionInterface* collection = nullptr;
-    for (const auto c : collections) {
-        if (c->id() == QByteArray("ppc")) {
-            collection = c;
-        }
-    }
-
-    if (collection) {
-        // Create a new Person in PeerProfileCollection
-        auto person = new Person(collection);
-        person->setFormattedName(cm->bestName());
-
-        Person::ContactMethods numbers;
-        numbers << cm;
-        person->setContactMethods(numbers);
-
-        PersonModel::instance().addPeerProfile(person);
-        person->save();
-    } else {
-        g_warning("Can't find PeerProfileCollection");
-    }
-
-    // And add it in Daemon Contacts
-    add_daemon_contact(item, cm);
-}
-
-static void
-rm_daemon_contact(G_GNUC_UNUSED GtkWidget *item, ContactMethod *cm)
-{
-    // get the choosen account
-    auto account = cm->account();
-    if (not account) {
-
-        account = get_active_ring_account();
-
-        if (not account) {
-            g_warning("invalid account, cannot send invitation!");
-            return;
-        }
-    }
-
-    if (not account->removeContact(cm))
-        g_warning("contact request not forwarded, cannot send invitation!");
-}
-
-static void
-remove_contact(GtkWidget *item, Person *person)
-{
-    // Remove the Person from PeerProfileCollection
-    person->remove();
-    // And the cm from Daemon Contacts
-    for ( const auto cm : person->phoneNumbers() ) {
-        rm_daemon_contact(item, cm);
-    }
-}
-
-/**
- * Update the menu when the selected item in the treeview changes.
- */
-static void
-update(GtkTreeSelection *selection, ContactPopupMenu *self)
-{
-    ContactPopupMenuPrivate *priv = CONTACT_POPUP_MENU_GET_PRIVATE(self);
-
-    /* clear the current menu */
-    gtk_container_forall(GTK_CONTAINER(self), (GtkCallback)gtk_widget_destroy, nullptr);
-
-    /* we always build a menu, however in some cases some or all of the items will be deactivated;
-     * we prefer this to having an empty menu because GTK+ behaves weird in the empty menu case
-     */
-    auto call_item = gtk_menu_item_new_with_mnemonic(_("_Call"));
-    gtk_widget_set_sensitive(GTK_WIDGET(call_item), FALSE);
-    gtk_menu_shell_append(GTK_MENU_SHELL(self), call_item);
-    auto copy_name_item = gtk_menu_item_new_with_mnemonic(_("_Copy name"));
-    gtk_widget_set_sensitive(GTK_WIDGET(copy_name_item), FALSE);
-    gtk_menu_shell_append(GTK_MENU_SHELL(self), copy_name_item);
-    auto copy_number_item = gtk_menu_item_new_with_mnemonic(_("_Copy number"));
-    gtk_widget_set_sensitive(GTK_WIDGET(copy_number_item), FALSE);
-    gtk_menu_shell_append(GTK_MENU_SHELL(self), copy_number_item);
-    auto add_to_contact_item = gtk_menu_item_new_with_mnemonic(_("_Add to contact"));
-    gtk_widget_set_sensitive(GTK_WIDGET(add_to_contact_item), FALSE);
-    gtk_menu_shell_append(GTK_MENU_SHELL(self), add_to_contact_item);
-    auto remove_contact_item = gtk_menu_item_new_with_mnemonic(_("_Remove contact"));
-    gtk_widget_set_sensitive(GTK_WIDGET(remove_contact_item), FALSE);
-    gtk_menu_shell_append(GTK_MENU_SHELL(self), remove_contact_item);
-
-    /* show all items */
-    gtk_widget_show_all(GTK_WIDGET(self));
-
-    GtkTreeIter iter;
-    GtkTreeModel *model;
-    if (!gtk_tree_selection_get_selected(selection, &model, &iter))
-        return;
-
-    QModelIndex idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), &iter);
-
-    auto type = idx.data(static_cast<int>(Ring::Role::ObjectType));
-    auto object = idx.data(static_cast<int>(Ring::Role::Object));
-    if (!type.isValid() || !object.isValid())
-        return; // not a valid Ring::Role::Object, so nothing to do
-
-    /* call */
-    switch (type.value<Ring::ObjectType>()) {
-        case Ring::ObjectType::Person:
-        {
-            /* possiblity for multiple numbers */
-            auto cms = object.value<Person *>()->phoneNumbers();
-            if (cms.size() == 1) {
-                gtk_widget_set_sensitive(GTK_WIDGET(call_item), TRUE);
-                g_signal_connect(call_item,
-                                 "activate",
-                                 G_CALLBACK(call_contactmethod),
-                                 cms.at(0));
-            } else if (cms.size() > 1) {
-                gtk_widget_set_sensitive(GTK_WIDGET(call_item), TRUE);
-                auto call_menu = gtk_menu_new();
-                gtk_menu_item_set_submenu(GTK_MENU_ITEM(call_item), call_menu);
-                for (int i = 0; i < cms.size(); ++i) {
-                    gchar *number = nullptr;
-                    if (cms.at(i)->category()) {
-                        // try to get the number category, eg: "home"
-                        number = g_strdup_printf("(%s) %s", cms.at(i)->category()->name().toUtf8().constData(),
-                                                          cms.at(i)->uri().toUtf8().constData());
-                    } else {
-                        number = g_strdup_printf("%s", cms.at(i)->uri().toUtf8().constData());
-                    }
-                    auto item = gtk_menu_item_new_with_label(number);
-                    g_free(number);
-                    gtk_menu_shell_append(GTK_MENU_SHELL(call_menu), item);
-                    g_signal_connect(item,
-                                     "activate",
-                                     G_CALLBACK(call_contactmethod),
-                                     cms.at(i));
-                }
-            }
-        }
-        break;
-        case Ring::ObjectType::ContactMethod:
-        {
-            gtk_widget_set_sensitive(GTK_WIDGET(call_item), TRUE);
-            auto cm = object.value<ContactMethod *>();
-            g_signal_connect(call_item,
-                             "activate",
-                             G_CALLBACK(call_contactmethod),
-                             cm);
-        }
-        break;
-        case Ring::ObjectType::Call:
-        {
-            gtk_widget_set_sensitive(GTK_WIDGET(call_item), TRUE);
-            auto call = object.value<Call *>();
-            g_signal_connect(call_item,
-                             "activate",
-                             G_CALLBACK(call_contactmethod),
-                             call->peerContactMethod());
-        }
-        break;
-        case Ring::ObjectType::Media:
-        case Ring::ObjectType::Certificate:
-        case Ring::ObjectType::ContactRequest:
-        // nothing to do for now
-        case Ring::ObjectType::COUNT__:
-        break;
-    }
-
-    /* copy name */
-    QVariant name_var = idx.data(static_cast<int>(Ring::Role::Name));
-    if (name_var.isValid()) {
-        gtk_widget_set_sensitive(GTK_WIDGET(copy_name_item), TRUE);
-        gchar *name = g_strdup_printf("%s", name_var.value<QString>().toUtf8().constData());
-        g_object_set_data_full(G_OBJECT(copy_name_item), COPY_DATA_KEY, name, (GDestroyNotify)g_free);
-        g_signal_connect(copy_name_item,
-                         "activate",
-                         G_CALLBACK(copy_contact_info),
-                         NULL);
-    }
-
-    /* copy number(s) */
-    switch (type.value<Ring::ObjectType>()) {
-        case Ring::ObjectType::Person:
-        {
-            /* possiblity for multiple numbers */
-            auto cms = object.value<Person *>()->phoneNumbers();
-            if (cms.size() == 1) {
-                gtk_widget_set_sensitive(GTK_WIDGET(copy_number_item), TRUE);
-                gchar *number = g_strdup_printf("%s",cms.at(0)->uri().toUtf8().constData());
-                g_object_set_data_full(G_OBJECT(copy_number_item), COPY_DATA_KEY, number, (GDestroyNotify)g_free);
-                g_signal_connect(copy_number_item,
-                                 "activate",
-                                 G_CALLBACK(copy_contact_info),
-                                 NULL);
-            } else if (cms.size() > 1) {
-                gtk_widget_set_sensitive(GTK_WIDGET(copy_number_item), TRUE);
-                auto copy_menu = gtk_menu_new();
-                gtk_menu_item_set_submenu(GTK_MENU_ITEM(copy_number_item), copy_menu);
-                for (int i = 0; i < cms.size(); ++i) {
-                    auto number = g_strdup_printf("%s",cms.at(i)->uri().toUtf8().constData());
-                    gchar *category_number = nullptr;
-                    if (cms.at(i)->category()) {
-                        // try to get the number category, eg: "home"
-                        category_number = g_strdup_printf("(%s) %s",
-                                                          cms.at(i)->category()->name().toUtf8().constData(),
-                                                          number);
-                    } else {
-                        category_number = g_strdup_printf("%s", number);
-                    }
-                    auto item = gtk_menu_item_new_with_label(category_number);
-                    g_free(category_number);
-                    gtk_menu_shell_append(GTK_MENU_SHELL(copy_menu), item);
-                    g_object_set_data_full(G_OBJECT(item), COPY_DATA_KEY, number, (GDestroyNotify)g_free);
-                    g_signal_connect(item,
-                                     "activate",
-                                     G_CALLBACK(copy_contact_info),
-                                     NULL);
-                }
-            }
-        }
-        break;
-        case Ring::ObjectType::ContactMethod:
-        case Ring::ObjectType::Call:
-        {
-            QVariant number_var = idx.data(static_cast<int>(Ring::Role::Number));
-            if (number_var.isValid()) {
-                gtk_widget_set_sensitive(GTK_WIDGET(copy_number_item), TRUE);
-                gchar *number = g_strdup_printf("%s", number_var.value<QString>().toUtf8().constData());
-                g_object_set_data_full(G_OBJECT(copy_number_item), COPY_DATA_KEY, number, (GDestroyNotify)g_free);
-                g_signal_connect(copy_number_item,
-                                 "activate",
-                                 G_CALLBACK(copy_contact_info),
-                                 NULL);
-            }
-        }
-        break;
-        case Ring::ObjectType::Media:
-        case Ring::ObjectType::Certificate:
-        case Ring::ObjectType::ContactRequest:
-        // nothing to do
-        case Ring::ObjectType::COUNT__:
-        break;
-    }
-
-    /* get rectangle to know where to draw the add to contact popup */
-    GdkRectangle rect;
-    auto path = gtk_tree_model_get_path(model, &iter);
-    auto column = gtk_tree_view_get_column(priv->treeview, 0);
-    gtk_tree_view_get_cell_area(priv->treeview, path, column, &rect);
-    gtk_tree_view_convert_bin_window_to_widget_coords(priv->treeview, rect.x, rect.y, &rect.x, &rect.y);
-    gtk_tree_path_free(path);
-
-    // Get the current cm
-    ContactMethod* cm = nullptr;
-    switch (type.value<Ring::ObjectType>()) {
-        case Ring::ObjectType::Person:
-        {
-            auto cms = object.value<Person *>()->phoneNumbers();
-            if (cms.size() > 0)
-                cm = cms.at(0);
-        }
-        break;
-        case Ring::ObjectType::ContactMethod:
-            cm = object.value<ContactMethod *>();
-        break;
-        case Ring::ObjectType::Call:
-            cm = object.value<Call *>()->peerContactMethod();
-        break;
-        case Ring::ObjectType::Media:
-        case Ring::ObjectType::Certificate:
-        case Ring::ObjectType::ContactRequest:
-        case Ring::ObjectType::COUNT__:
-            // nothing to do
-        break;
-    }
-
-    auto account = cm->account();
-    if (not account) {
-        account = get_active_ring_account();
-    }
-
-    switch (type.value<Ring::ObjectType>()) {
-        case Ring::ObjectType::Person:
-        {
-            auto person = object.value<Person *>();
-            gtk_widget_set_sensitive(GTK_WIDGET(remove_contact_item), true);
-            // Remove to PeerProfileCollection and Daemon Contacts
-            g_signal_connect(remove_contact_item,
-                            "activate",
-                            G_CALLBACK(remove_contact),
-                            person);
-        }
-        break;
-        case Ring::ObjectType::ContactMethod:
-        case Ring::ObjectType::Call:
-        {
-            // Check if it's a daemon contact
-            auto isADaemonContact = false;
-            if (account) {
-                auto contacts = account->getContacts();
-                isADaemonContact = contacts.indexOf(cm) != -1;
-            }
-            gtk_widget_set_sensitive(GTK_WIDGET(add_to_contact_item), !isADaemonContact);
-            gtk_widget_set_sensitive(GTK_WIDGET(remove_contact_item), isADaemonContact);
-            // Add to PeerProfileCollection and Daemon Contacts
-            g_signal_connect(add_to_contact_item,
-                             "activate",
-                             G_CALLBACK(add_contact),
-                             cm);
-            // Remove from Daemon Contacts (it's not in PeerProfileCollection)
-            g_signal_connect(remove_contact_item,
-                             "activate",
-                             G_CALLBACK(rm_daemon_contact),
-                             cm);
-        }
-        break;
-        case Ring::ObjectType::Media:
-        case Ring::ObjectType::Certificate:
-        case Ring::ObjectType::ContactRequest:
-        case Ring::ObjectType::COUNT__:
-        {
-            // No CM to add or remove
-            gtk_widget_set_sensitive(GTK_WIDGET(add_to_contact_item), false);
-            gtk_widget_set_sensitive(GTK_WIDGET(remove_contact_item), false);
-        }
-        break;
-    }
-
-    /* show all items */
-    gtk_widget_show_all(GTK_WIDGET(self));
-}
-
-static void
-contact_popup_menu_init(G_GNUC_UNUSED ContactPopupMenu *self)
-{
-    // nothing to do
-}
-
-static void
-contact_popup_menu_dispose(GObject *object)
-{
-    G_OBJECT_CLASS(contact_popup_menu_parent_class)->dispose(object);
-}
-
-static void
-contact_popup_menu_finalize(GObject *object)
-{
-    G_OBJECT_CLASS(contact_popup_menu_parent_class)->finalize(object);
-}
-
-static void
-contact_popup_menu_class_init(ContactPopupMenuClass *klass)
-{
-    G_OBJECT_CLASS(klass)->finalize = contact_popup_menu_finalize;
-    G_OBJECT_CLASS(klass)->dispose = contact_popup_menu_dispose;
-}
-
-GtkWidget *
-contact_popup_menu_new(GtkTreeView *treeview)
-{
-    gpointer self = g_object_new(CONTACT_POPUP_MENU_TYPE, NULL);
-    ContactPopupMenuPrivate *priv = CONTACT_POPUP_MENU_GET_PRIVATE(self);
-
-    priv->treeview = treeview;
-    GtkTreeSelection *selection = gtk_tree_view_get_selection(priv->treeview);
-    g_signal_connect(selection, "changed", G_CALLBACK(update), self);
-
-    // build the menu for the first time
-    update(selection, CONTACT_POPUP_MENU(self));
-
-    return (GtkWidget *)self;
-}
-
-gboolean
-contact_popup_menu_show(ContactPopupMenu *self, GdkEventButton *event)
-{
-    /* check for right click */
-    if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_SECONDARY ) {
-        /* the menu will automatically get updated when the selection changes */
-        gtk_menu_popup(GTK_MENU(self), NULL, NULL, NULL, NULL, event->button, event->time);
-    }
-
-    return GDK_EVENT_PROPAGATE; /* so that the item selection changes */
-}
diff --git a/src/contactpopupmenu.h b/src/contactpopupmenu.h
deleted file mode 100644
index d525db7..0000000
--- a/src/contactpopupmenu.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (C) 2016-2017 Savoir-faire Linux Inc.
- *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#pragma once
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define CONTACT_POPUP_MENU_TYPE            (contact_popup_menu_get_type ())
-#define CONTACT_POPUP_MENU(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CONTACT_POPUP_MENU_TYPE, ContactPopupMenu))
-#define CONTACT_POPUP_MENU_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), CONTACT_POPUP_MENU_TYPE, ContactPopupMenuClass))
-#define IS_CONTACT_POPUP_MENU(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), CONTACT_POPUP_MENU_TYPE))
-#define IS_CONTACT_POPUP_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), CONTACT_POPUP_MENU_TYPE))
-
-typedef struct _ContactPopupMenu      ContactPopupMenu;
-typedef struct _ContactPopupMenuClass ContactPopupMenuClass;
-
-GType      contact_popup_menu_get_type (void) G_GNUC_CONST;
-GtkWidget *contact_popup_menu_new      (GtkTreeView *treeview);
-gboolean   contact_popup_menu_show     (ContactPopupMenu *self, GdkEventButton *event);
-
-G_END_DECLS
diff --git a/src/contactrequestcontentview.cpp b/src/contactrequestcontentview.cpp
deleted file mode 100644
index 530b0d9..0000000
--- a/src/contactrequestcontentview.cpp
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- *  Copyright (C) 2017 Savoir-faire Linux Inc.
- *  Author: Author: Nicolas Jäger <nicolas.jager@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-// Client
-#include "contactrequestcontentview.h"
-#include "native/pixbufmanipulator.h"
-
-// System
-#include <gtk/gtk.h>
-
-// LRC
-#include <accountmodel.h>
-#include <certificate.h>
-#include <contactmethod.h>
-#include <contactrequest.h>
-#include <globalinstances.h>
-#include <pendingcontactrequestmodel.h>
-#include <person.h>
-
-/**
- * gtk structure
- */
-struct _ContactRequestContentView
-{
-    GtkBox parent;
-};
-
-/**
- * signals
- */
-
-enum {
-    HIDE_VIEW_CLICKED,
-    LAST_SIGNAL
-};
-
-guint contact_request_content_view_signals[LAST_SIGNAL];
-
-/**
- * gtk class structure
- */
-struct _ContactRequestContentViewClass
-{
-    GtkBoxClass parent_class;
-};
-
-typedef struct _ContactRequestContentViewPrivate ContactRequestContentViewPrivate;
-
-/**
- * gtk private structure
- */
-struct _ContactRequestContentViewPrivate
-{
-    ContactRequest* contactRequest;
-    Account*      account;
-
-    GtkWidget*    label_peer;
-    GtkWidget*    button_ignore_contact_request;
-    GtkWidget*    button_accept_contact_request;
-    GtkWidget*    button_close_contact_request_content_view;
-    GtkWidget*    button_block_contact_request;
-    GtkWidget*    image_peer;
-    GtkWidget*    label_bestId;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE(ContactRequestContentView, contact_request_content_view, GTK_TYPE_BOX);
-
-#define CONTACT_REQUEST_CONTENT_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CONTACT_REQUEST_CONTENT_VIEW_TYPE, ContactRequestContentViewPrivate))
-
-/**
- * gtk dispose function
- */
-static void
-contact_request_content_view_dispose(GObject *object)
-{
-    G_OBJECT_CLASS(contact_request_content_view_parent_class)->dispose(object);
-}
-
-/**
- * gtk clicked callback to ignore contact request
- */
-static void
-button_ignore_contact_request_clicked(G_GNUC_UNUSED GtkWidget *widget, ContactRequestContentView *self)
-{
-    auto priv = CONTACT_REQUEST_CONTENT_VIEW_GET_PRIVATE(self);
-
-    priv->contactRequest->discard();
-
-}
-
-/**
- * gtk clicked callback to accept contact request
- */
-static void
-button_accept_contact_request_clicked(G_GNUC_UNUSED GtkWidget *widget, ContactRequestContentView *self)
-{
-    auto priv = CONTACT_REQUEST_CONTENT_VIEW_GET_PRIVATE(self);
-
-    priv->contactRequest->accept();
-}
-
-/**
- * gtk clicked callback to close the view
- */
-static void
-button_close_contact_request_content_view_clicked(G_GNUC_UNUSED GtkWidget *widget, ContactRequestContentView *self)
-{
-    g_signal_emit(G_OBJECT(self), contact_request_content_view_signals[HIDE_VIEW_CLICKED], 0);
-}
-
-/**
- * gtk clicked callback to block contact request
- */
-static void
-button_block_contact_request_clicked(G_GNUC_UNUSED GtkWidget *widget, ContactRequestContentView *self)
-{
-    auto priv = CONTACT_REQUEST_CONTENT_VIEW_GET_PRIVATE(self);
-
-    priv->contactRequest->block();
-}
-
-/**
- * gtk init function
- */
-static void
-contact_request_content_view_init(ContactRequestContentView *self)
-{
-    gtk_widget_init_template(GTK_WIDGET(self));
-
-    auto priv = CONTACT_REQUEST_CONTENT_VIEW_GET_PRIVATE(self);
-
-
-        // CSS styles
-        auto provider = gtk_css_provider_new();
-        gtk_css_provider_load_from_data(provider,
-            ".flat-button { border: 0; border-radius: 5px; transition: all 0.3s ease; color: white; padding: 10px 20px 10px 20px; vertical-align: middle; } \
-            .button-green { background: #27ae60; } \
-            .button-green:hover { background: #219d55; } \
-            .button-red {background: #dc3a37; } \
-            .button-red:hover { background: #dc2719; } \
-            ",
-            -1, nullptr
-        );
-        gtk_style_context_add_provider_for_screen(gdk_display_get_default_screen(gdk_display_get_default()),
-                                                  GTK_STYLE_PROVIDER(provider),
-                                                  GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-
-    g_signal_connect(priv->button_ignore_contact_request, "clicked", G_CALLBACK(button_ignore_contact_request_clicked), self);
-    g_signal_connect(priv->button_accept_contact_request, "clicked", G_CALLBACK(button_accept_contact_request_clicked), self);
-    g_signal_connect(priv->button_block_contact_request, "clicked", G_CALLBACK(button_block_contact_request_clicked), self);
-    g_signal_connect(priv->button_close_contact_request_content_view, "clicked", G_CALLBACK(button_close_contact_request_content_view_clicked), self);
-}
-
-static void
-contact_request_content_view_class_init(ContactRequestContentViewClass *klass)
-{
-    G_OBJECT_CLASS(klass)->dispose = contact_request_content_view_dispose;
-
-    gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS (klass),
-                                                "/cx/ring/RingGnome/contactrequestcontentview.ui");
-
-    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), ContactRequestContentView, label_peer);
-    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), ContactRequestContentView, button_ignore_contact_request);
-    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), ContactRequestContentView, button_accept_contact_request);
-    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), ContactRequestContentView, button_block_contact_request);
-    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), ContactRequestContentView, button_close_contact_request_content_view);
-    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), ContactRequestContentView, image_peer);
-    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), ContactRequestContentView, label_bestId);
-
-    contact_request_content_view_signals[HIDE_VIEW_CLICKED] = g_signal_new (
-        "hide-view-clicked",
-        G_TYPE_FROM_CLASS(klass),
-        (GSignalFlags) (G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
-        0,
-        nullptr,
-        nullptr,
-        g_cclosure_marshal_VOID__VOID,
-        G_TYPE_NONE, 0);
-
-}
-
-/**
- * gtk build function
- */
-void
-build_contact_request_content(ContactRequestContentView *self, ContactRequest *contact_request)
-{
-    auto priv = CONTACT_REQUEST_CONTENT_VIEW_GET_PRIVATE(self);
-    priv->contactRequest = contact_request;
-    auto person = contact_request->peer();
-
-    /* get photo */
-    QVariant photo = GlobalInstances::pixmapManipulator().contactPhoto(person, QSize(110, 110), false);
-    std::shared_ptr<GdkPixbuf> image = photo.value<std::shared_ptr<GdkPixbuf>>();
-    gtk_image_set_from_pixbuf(GTK_IMAGE(priv->image_peer), image.get());
-
-    /* get name */
-    auto name_std = person->formattedName().toStdString();
-    gtk_label_set_text(GTK_LABEL(priv->label_peer), name_std.c_str());
-
-    /* get contact best id, if different from name */
-    auto contactId_std = person->phoneNumbers()[0]->bestId().toStdString();
-    if (name_std != contactId_std) {
-        gtk_label_set_text(GTK_LABEL(priv->label_bestId), contactId_std.c_str());
-        gtk_widget_show(priv->label_bestId);
-    }
-}
-
-/**
- * gtk new function
- */
-GtkWidget*
-contact_request_content_view_new(ContactRequest *contact_request)
-{
-    auto self = GTK_WIDGET(g_object_new(CONTACT_REQUEST_CONTENT_VIEW_TYPE, nullptr));
-
-    build_contact_request_content(CONTACT_REQUEST_CONTENT_VIEW(self), contact_request);
-
-    return self;
-}
diff --git a/src/contactrequestcontentview.h b/src/contactrequestcontentview.h
deleted file mode 100644
index 41433f8..0000000
--- a/src/contactrequestcontentview.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (C) 2017 Savoir-faire Linux Inc.
- *  Author: Author: Nicolas Jäger <nicolas.jager@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#pragma once
-
-#include <gtk/gtk.h>
-
-class ContactRequest;
-
-G_BEGIN_DECLS
-
-#define CONTACT_REQUEST_CONTENT_VIEW_TYPE            (contact_request_content_view_get_type ())
-#define CONTACT_REQUEST_CONTENT_VIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CONTACT_REQUEST_CONTENT_VIEW_TYPE, ContactRequestContentView))
-#define CONTACT_REQUEST_CONTENT_VIEW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), CONTACT_REQUEST_CONTENT_VIEW_TYPE, ContactRequestContentViewClass))
-#define IS_CONTACT_REQUEST_CONTENT_VIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), CONTACT_REQUEST_CONTENT_VIEW_TYPE))
-#define IS_CONTACT_REQUEST_CONTENT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), CONTACT_REQUEST_CONTENT_VIEW_TYPE))
-
-typedef struct _ContactRequestContentView      ContactRequestContentView;
-typedef struct _ContactRequestContentViewClass ContactRequestContentViewClass;
-
-
-GType          contact_request_content_view_get_type   (void) G_GNUC_CONST;
-GtkWidget*     contact_request_content_view_new (ContactRequest* contact_request);
-
-G_END_DECLS
diff --git a/src/pendingcontactrequests.cpp b/src/pendingcontactrequests.cpp
deleted file mode 100644
index b625813..0000000
--- a/src/pendingcontactrequests.cpp
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- *  Copyright (C) 2017 Savoir-faire Linux Inc.
- *  Author: Nicolas Jäger <nicolas.jager@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-// Client
-#include "pendingcontactrequests.h"
-#include "models/gtkqtreemodel.h"
-#include "native/pixbufmanipulator.h"
-#include "utils/accounts.h"
-
-// LRC
-#include <recentmodel.h>
-#include <accountmodel.h>
-#include <pendingcontactrequestmodel.h>
-#include <account.h>
-#include <availableaccountmodel.h>
-#include <globalinstances.h>
-#include <contactrequest.h>
-
-// Gtk
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-
-// Qt
-#include <QtCore/QDateTime>
-#include <QtCore/QSize>
-#include <QtCore/QLocale>
-
-/**
- * gtk structure
- */
-struct _PendingContactRequestsView
-{
-    GtkTreeView parent;
-};
-
-/**
- * gtk class structure
- */
-struct _PendingContactRequestsViewClass
-{
-    GtkTreeViewClass parent_class;
-};
-
-typedef struct _PendingContactRequestsViewPrivate PendingContactRequestsViewPrivate;
-
-/**
- * gtk private structure
- */
-struct _PendingContactRequestsViewPrivate
-{
-    GtkWidget *treeview_pending_contact_request_list;
-    QSortFilterProxyModel* myProxy;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE(PendingContactRequestsView, pending_contact_requests_view, GTK_TYPE_TREE_VIEW);
-
-#define PENDING_CONTACT_REQUESTS_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), PENDING_CONTACT_REQUESTS_VIEW_TYPE, PendingContactRequestsViewPrivate))
-
-/**
- * callback function for rendering the contact photo
- */
-static void
-render_contact_photo(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
-                     GtkCellRenderer *cell,
-                     GtkTreeModel *model,
-                     GtkTreeIter *iter,
-                     G_GNUC_UNUSED gpointer data)
-{
-    QModelIndex idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), iter);
-
-    std::shared_ptr<GdkPixbuf> image;
-    QVariant object = idx.data(static_cast<int>(Ring::Role::Object));
-
-    if (idx.isValid() && object.isValid()) {
-        QVariant var_photo;
-        if (auto cr = object.value<ContactRequest *>()) {
-            if (cr->peer())
-                var_photo = GlobalInstances::pixmapManipulator().contactPhoto(cr->peer(), QSize(50, 50), false);
-        }
-        if (var_photo.isValid())
-            image = var_photo.value<std::shared_ptr<GdkPixbuf>>();
-
-        g_object_set(G_OBJECT(cell), "height", 50, NULL);
-        g_object_set(G_OBJECT(cell), "width", 50, NULL);
-        g_object_set(G_OBJECT(cell), "pixbuf", image.get(), NULL);
-    }
-}
-
-/**
- * callback function for rendering the best id of the peer and the date.
- */
-static void
-render_name_and_info(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
-                     GtkCellRenderer *cell,
-                     GtkTreeModel *model,
-                     GtkTreeIter *iter,
-                     GtkTreeView *treeview)
-{
-    auto idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), iter);
-
-    if (not idx.isValid()) {
-        g_warning("could not get index for contact request");
-        return;
-    }
-
-    // check if this iter is selected
-    gboolean is_selected = FALSE;
-    if (GTK_IS_TREE_VIEW(treeview)) {
-        auto selection = gtk_tree_view_get_selection(treeview);
-        is_selected = gtk_tree_selection_iter_is_selected(selection, iter);
-    }
-
-    /* best id */
-    auto uri_qstring = idx.data(static_cast<int>(Qt::DisplayRole)).value<QString>();
-    auto uri_std = uri_qstring.toStdString();
-
-    /* profile name */
-    auto qt_model = idx.model();
-    auto idx_formatted_name = qt_model->index(idx.row(), static_cast<int>(PendingContactRequestModel::Columns::FORMATTED_NAME));
-    auto formatted_name_qstring = idx_formatted_name.data(static_cast<int>(Qt::DisplayRole)).value<QString>();
-    auto formatted_name_std = formatted_name_qstring.toStdString();
-
-    /* date */
-    auto idx_date = qt_model->index(idx.row(), static_cast<int>(PendingContactRequestModel::Columns::TIME));
-    auto date_q_date_time = idx_date.data(static_cast<int>(Qt::DisplayRole)).value<QDateTime>();
-    auto date_q_string = QLocale::system().toString(date_q_date_time.time(), QLocale::ShortFormat);
-    auto date_std = date_q_string.toStdString();
-
-    gchar *text = nullptr;
-
-    if(is_selected) // print in default color
-        text = g_markup_printf_escaped("<span font_weight=\"bold\">%s</span>\n%s\n"
-                                        "<span size=\"smaller\">%s</span>", formatted_name_std.c_str(),
-                                                                            uri_std.c_str(),
-                                                                            date_std.c_str());
-    else // use our colors
-        text = g_markup_printf_escaped("<span font_weight=\"bold\">%s</span>\n<span color=\"gray\">%s\n"
-                                        "<span size=\"smaller\">%s</span></span>", formatted_name_std.c_str(),
-                                                                                   uri_std.c_str(),
-                                                                                   date_std.c_str());
-
-    g_object_set(G_OBJECT(cell), "markup", text, nullptr);
-    g_free(text);
-}
-
-/**
- * bind Account::pendingContactRequestModel() to pending_contact_requests_model
- */
-static void
-bind_models(PendingContactRequestsView *self, Account* account)
-{
-    if (not account) {
-        g_warning("invalid account, cannot bind models.");
-        return;
-    }
-
-    auto pending_contact_requests_model = gtk_q_tree_model_new(account->pendingContactRequestModel(),
-                                                               1/*nmbr. of cols.*/,
-                                                               0,
-                                                               Qt::DisplayRole,
-                                                               G_TYPE_STRING);
-
-    gtk_tree_view_set_model(GTK_TREE_VIEW(self), GTK_TREE_MODEL(pending_contact_requests_model));
-}
-
-/**
- * gtk init function
- */
-static void
-pending_contact_requests_view_init(PendingContactRequestsView *self)
-{
-    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(self), FALSE);
-    gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(self), FALSE);
-    gtk_tree_view_set_enable_search(GTK_TREE_VIEW(self), FALSE);
-
-    // the next signal is used to set the model in function of the selection of the account
-    QObject::connect(
-        AvailableAccountModel::instance().selectionModel(),
-        &QItemSelectionModel::currentChanged,
-        [self] (const QModelIndex& idx) {
-            bind_models(self, idx.data(static_cast<int>(Account::Role::Object)).value<Account*>());
-        }
-    );
-
-    /* photo and name/contact method column */
-    GtkCellArea *area = gtk_cell_area_box_new();
-    GtkTreeViewColumn *column = gtk_tree_view_column_new_with_area(area);
-
-    /* photo renderer */
-    GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new();
-    gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(area), renderer, FALSE, FALSE, FALSE);
-
-    /* get the photo */
-    gtk_tree_view_column_set_cell_data_func(
-      column,
-      renderer,
-      (GtkTreeCellDataFunc)render_contact_photo,
-      NULL,
-      NULL);
-
-    /* name and info renderer */
-    renderer = gtk_cell_renderer_text_new();
-    g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-    gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(area), renderer, FALSE, FALSE, FALSE);
-
-    gtk_tree_view_column_set_cell_data_func(
-      column,
-      renderer,
-      (GtkTreeCellDataFunc)render_name_and_info,
-      self,
-      NULL);
-
-    gtk_tree_view_append_column(GTK_TREE_VIEW(self), column);
-    gtk_tree_view_column_set_resizable(column, TRUE);
-    gtk_tree_view_column_set_expand(column, TRUE);
-    gtk_tree_view_expand_all(GTK_TREE_VIEW(self));
-
-    /* init the model */
-    bind_models(self, get_active_ring_account());
-
-    gtk_widget_show_all(GTK_WIDGET(self));
-}
-
-/**
- * gtk dispose function
- */
-static void
-pending_contact_requests_view_dispose(GObject *object)
-{
-    G_OBJECT_CLASS(pending_contact_requests_view_parent_class)->dispose(object);
-}
-
-/**
- * gtk finalize function
- */
-static void
-pending_contact_requests_view_finalize(GObject *object)
-{
-    G_OBJECT_CLASS(pending_contact_requests_view_parent_class)->finalize(object);
-}
-
-/**
- * gtk class init function
- */
-static void
-pending_contact_requests_view_class_init(PendingContactRequestsViewClass *klass)
-{
-    G_OBJECT_CLASS(klass)->finalize = pending_contact_requests_view_finalize;
-    G_OBJECT_CLASS(klass)->dispose = pending_contact_requests_view_dispose;
-}
-
-/**
- * gtk new function
- */
-GtkWidget *
-pending_contact_requests_view_new()
-{
-    gpointer self = g_object_new(PENDING_CONTACT_REQUESTS_VIEW_TYPE, NULL);
-
-    return (GtkWidget *)self;
-}
diff --git a/src/pendingcontactrequests.h b/src/pendingcontactrequests.h
deleted file mode 100644
index 585b4cc..0000000
--- a/src/pendingcontactrequests.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (C) 2017 Savoir-faire Linux Inc.
- *  Author: Nicolas Jäger <nicolas.jager@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#pragma once
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define PENDING_CONTACT_REQUESTS_VIEW_TYPE            (pending_contact_requests_view_get_type ())
-#define PENDING_CONTACT_REQUESTS_VIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), PENDING_CONTACT_REQUESTS_VIEW_TYPE, PendingContactRequestsView))
-#define PENDING_CONTACT_REQUESTS_VIEW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), PENDING_CONTACT_REQUESTS_VIEW_TYPE, PendingContactRequestsViewClass))
-#define IS_PENDING_CONTACT_REQUESTS_VIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), PENDING_CONTACT_REQUESTS_VIEW_TYPE))
-#define IS_PENDING_CONTACT_REQUESTS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PENDING_CONTACT_REQUESTS_VIEW_TYPE))
-
-typedef struct _PendingContactRequestsView      PendingContactRequestsView;
-typedef struct _PendingContactRequestsViewClass PendingContactRequestsViewClass;
-
-GType      pending_contact_requests_view_get_type (void) G_GNUC_CONST;
-GtkWidget *pending_contact_requests_view_new      (void);
-
-G_END_DECLS
diff --git a/src/recentcontactsview.cpp b/src/recentcontactsview.cpp
deleted file mode 100644
index b620f69..0000000
--- a/src/recentcontactsview.cpp
+++ /dev/null
@@ -1,774 +0,0 @@
-/*
- *  Copyright (C) 2015-2017 Savoir-faire Linux Inc.
- *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#include "recentcontactsview.h"
-
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include "models/gtkqtreemodel.h"
-#include "utils/calling.h"
-#include <memory>
-#include <globalinstances.h>
-#include "native/pixbufmanipulator.h"
-#include <contactmethod.h>
-#include "defines.h"
-#include "utils/models.h"
-#include <recentmodel.h>
-#include <call.h>
-#include "utils/menus.h"
-#include <itemdataroles.h>
-#include <callmodel.h>
-#include <QtCore/QItemSelectionModel>
-#include <historytimecategorymodel.h>
-#include <QtCore/QDateTime>
-#include <QtCore/QMimeData>
-#include "utils/drawing.h"
-#include <numbercategory.h>
-#include "contactpopupmenu.h"
-
-static constexpr const char* CALL_TARGET    = "CALL_TARGET";
-static constexpr int         CALL_TARGET_ID = 0;
-
-struct _RecentContactsView
-{
-    GtkTreeView parent;
-};
-
-struct _RecentContactsViewClass
-{
-    GtkTreeViewClass parent_class;
-};
-
-typedef struct _RecentContactsViewPrivate RecentContactsViewPrivate;
-
-struct _RecentContactsViewPrivate
-{
-    GtkWidget *popup_menu;
-
-    QMetaObject::Connection selection_updated;
-    QMetaObject::Connection layout_changed;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE(RecentContactsView, recent_contacts_view, GTK_TYPE_TREE_VIEW);
-
-#define RECENT_CONTACTS_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), RECENT_CONTACTS_VIEW_TYPE, RecentContactsViewPrivate))
-
-static void
-update_selection(GtkTreeSelection *selection)
-{
-    if (gtk_q_tree_model_ignore_selection_change(selection)) return;
-
-    auto current_proxy = get_index_from_selection(selection);
-    auto current = RecentModel::instance().peopleProxy()->mapToSource(current_proxy);
-
-    RecentModel::instance().selectionModel()->setCurrentIndex(current, QItemSelectionModel::ClearAndSelect);
-
-    // update the CallModel selection since we rely on the UserActionModel
-    if (auto call_to_select = RecentModel::instance().getActiveCall(current)) {
-        CallModel::instance().selectCall(call_to_select);
-    } else {
-        CallModel::instance().selectionModel()->clearCurrentIndex();
-    }
-}
-
-static void
-render_contact_photo(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
-                     GtkCellRenderer *cell,
-                     GtkTreeModel *model,
-                     GtkTreeIter *iter,
-                     G_GNUC_UNUSED gpointer data)
-{
-    QModelIndex idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), iter);
-
-    std::shared_ptr<GdkPixbuf> image;
-    /* we only want to render a photo for the top nodes: Person, ContactMethod (, later Conference) */
-    QVariant object = idx.data(static_cast<int>(Ring::Role::Object));
-    if (idx.isValid() && object.isValid()) {
-        QVariant var_photo;
-        if (auto person = object.value<Person *>()) {
-            var_photo = GlobalInstances::pixmapManipulator().contactPhoto(person, QSize(50, 50), true);
-        } else if (auto cm = object.value<ContactMethod *>()) {
-            /* get photo, note that this should in all cases be the fallback avatar, since there
-             * shouldn't be a person associated with this contact method */
-            var_photo = GlobalInstances::pixmapManipulator().callPhoto(cm, QSize(50, 50), true);
-        } else if (auto call = object.value<Call *>()) {
-            if (call->type() == Call::Type::CONFERENCE) {
-                var_photo = GlobalInstances::pixmapManipulator().callPhoto(call, QSize(50, 50), true);
-            }
-        }
-        image = var_photo.value<std::shared_ptr<GdkPixbuf>>();
-    }
-
-    // set the width of the cell rendered to the width of the photo
-    // so that the other renderers are shifted to the right
-    g_object_set(G_OBJECT(cell), "width", 50, NULL);
-    g_object_set(G_OBJECT(cell), "pixbuf", image.get(), NULL);
-}
-
-/**
- * This is the 2nd column in the treeview; for Person and ContactMethod items we want to DisplayRole
- * the name in the first row and the number (Ring registered name or URI) in the second row. for
- * Conferences we simply display the name, and for calls we simply display the Call status (note:
- * that if the item is a Call, it is not a top level item)
- */
-static void
-render_name_and_number(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
-                       GtkCellRenderer *cell,
-                       GtkTreeModel *model,
-                       GtkTreeIter *iter,
-                       GtkTreeView *treeview)
-{
-    gchar *text = nullptr;
-
-    QModelIndex idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), iter);
-
-    // check if this iter is selected
-    gboolean is_selected = FALSE;
-    if (GTK_IS_TREE_VIEW(treeview)) {
-        auto selection = gtk_tree_view_get_selection(treeview);
-        is_selected = gtk_tree_selection_iter_is_selected(selection, iter);
-    }
-
-    auto type = idx.data(static_cast<int>(Ring::Role::ObjectType));
-    if (idx.isValid() && type.isValid()) {
-        switch (type.value<Ring::ObjectType>()) {
-            case Ring::ObjectType::Person:
-            case Ring::ObjectType::ContactMethod:
-            {
-                auto name = idx.data(static_cast<int>(Ring::Role::Name)).toString();
-                auto number = idx.data(static_cast<int>(Ring::Role::Number)).toString();
-
-                /* we want the color of the status text to be the default color if this iter is
-                 * selected so that the treeview is able to invert it against the selection color */
-                if (is_selected) {
-                     text = g_markup_printf_escaped(
-                         "<span font_weight=\"bold\">%s</span>\n<span size=\"smaller\">%s</span>",
-                        // "%s\n<span size=\"smaller\">%s</span>",
-                         name.toUtf8().constData(),
-                         number.toUtf8().constData()
-                     );
-                } else {
-                     text = g_markup_printf_escaped(
-                         "<span font_weight=\"bold\">%s</span>\n<span color=\"gray\" size=\"smaller\">%s</span>",
-                        //  "%s\n<span color=\"gray\" size=\"smaller\">%s</span>",
-                         name.toUtf8().constData(),
-                         number.toUtf8().constData()
-                     );
-                 }
-            }
-            break;
-            case Ring::ObjectType::Call:
-            {
-                // check if it is a conference
-                auto idx_source = RecentModel::instance().peopleProxy()->mapToSource(idx);
-                auto is_conference = RecentModel::instance().isConference(idx_source);
-
-                if (is_conference) {
-                    auto var_name = idx.data(static_cast<int>(Ring::Role::Name));
-                    text = g_markup_escape_text(var_name.value<QString>().toUtf8().constData(), -1);
-                } else {
-                    auto parent_source = RecentModel::instance().peopleProxy()->mapToSource(idx.parent());
-                    if (RecentModel::instance().isConference(parent_source)) {
-                        // part of conference, simply display the name
-                        auto var_name = idx.data(static_cast<int>(Ring::Role::Name));
-
-                        /* we want the color of the name text to be the default color if this iter is
-                         * selected so that the treeview is able to invert it against the selection color */
-                        if (is_selected) {
-                            text = g_markup_printf_escaped("<span size=\"smaller\">%s</span>",
-                                                           var_name.value<QString>().toUtf8().constData());
-                        } else {
-                            text = g_markup_printf_escaped("<span size=\"smaller\" color=\"gray\">%s</span>",
-                                                           var_name.value<QString>().toUtf8().constData());
-                        }
-                    } else {
-                        // just a call, so display the state
-                        auto var_status = idx.data(static_cast<int>(Ring::Role::FormattedState));
-
-                        QString status;
-
-                        if (var_status.isValid())
-                            status += var_status.value<QString>();
-
-                        /* we want the color of the status text to be the default color if this iter is
-                         * selected so that the treeview is able to invert it against the selection color */
-                        if (is_selected) {
-                            text = g_markup_printf_escaped("<span size=\"smaller\">%s</span>",
-                                                           status.toUtf8().constData());
-                        } else {
-                            text = g_markup_printf_escaped("<span size=\"smaller\" color=\"gray\">%s</span>",
-                                                           status.toUtf8().constData());
-                        }
-                    }
-                }
-            }
-            break;
-            case Ring::ObjectType::Media:
-            case Ring::ObjectType::Certificate:
-            case Ring::ObjectType::ContactRequest:
-            // nothing to do for now
-            case Ring::ObjectType::COUNT__:
-            break;
-        }
-    }
-
-    g_object_set(G_OBJECT(cell), "markup", text, NULL);
-    g_free(text);
-}
-
-/**
- * This is the 3rd column in the treeview. For Person and ContactMethod items we want to display
- * in the first row the call status or else the last used date. In the second row we want to display
- * either the call duration or else the number of unread messages. In the case of a Call item we
- * simply display the call duration.
- */
-static void
-render_info(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
-            GtkCellRenderer *cell,
-            GtkTreeModel *model,
-            GtkTreeIter *iter,
-            GtkTreeView *treeview)
-{
-    gchar *text = nullptr;
-
-    QModelIndex idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), iter);
-
-    // check if this iter is selected
-    gboolean is_selected = FALSE;
-    if (GTK_IS_TREE_VIEW(treeview)) {
-        auto selection = gtk_tree_view_get_selection(treeview);
-        is_selected = gtk_tree_selection_iter_is_selected(selection, iter);
-    }
-
-    auto type = idx.data(static_cast<int>(Ring::Role::ObjectType));
-    if (idx.isValid() && type.isValid()) {
-        switch (type.value<Ring::ObjectType>()) {
-            case Ring::ObjectType::Person:
-            case Ring::ObjectType::ContactMethod:
-            {
-                gchar *row0 = nullptr; // either call status or last used
-                gchar *row1 = nullptr; // either call duration or unread msg count
-
-                QString status;
-                auto var_status = idx.data(static_cast<int>(Ring::Role::FormattedState));
-                auto var_lastused = idx.data(static_cast<int>(Ring::Role::LastUsed));
-
-                // show the status if there is a call, otherwise the last used date/time
-                if (var_status.isValid()) {
-                    status = var_status.value<QString>();
-                } else if (var_lastused.isValid()) {
-                    auto date_time = var_lastused.value<QDateTime>();
-                    auto category = HistoryTimeCategoryModel::timeToHistoryConst(date_time.toTime_t());
-
-                    /* If it is 'today', then we show the time; otherwise we will show date category
-                     * (the day or long ago it was). The day and the time together take up too much
-                     * space */
-                    if (category == HistoryTimeCategoryModel::HistoryConst::Today) {
-                        status = QLocale::system().toString(date_time.time(), QLocale::ShortFormat);
-                    } else {
-                        status = HistoryTimeCategoryModel::timeToHistoryCategory(date_time.toTime_t());
-                    }
-                }
-
-                if (is_selected) {
-                    row0 = g_markup_printf_escaped(
-                        "<span size=\"smaller\">%s</span>",
-                        status.toUtf8().constData()
-                    );
-                } else {
-                    row0 = g_markup_printf_escaped(
-                        "<span size=\"smaller\" color=\"gray\">%s</span>",
-                        status.toUtf8().constData()
-                    );
-                }
-
-                // check if there are any children (calls); we need to convert to source model in
-                // case there is only one
-                auto idx_source = RecentModel::instance().peopleProxy()->mapToSource(idx);
-                auto duration = idx.data(static_cast<int>(Ring::Role::Length));
-                if (idx_source.isValid()
-                    && (idx_source.model()->rowCount(idx_source) == 1)
-                    && duration.isValid())
-                {
-                    row1 = g_markup_printf_escaped("%s", duration.toString().toUtf8().constData());
-                }
-                else
-                {
-                    auto unread = idx.data(static_cast<int>(Ring::Role::UnreadTextMessageCount)).toInt();
-                    if (unread > 0) {
-                        if (is_selected) {
-                            row1 = g_markup_printf_escaped(
-                                "<span font_weight=\"bold\">%d</span>",
-                                unread
-                            );
-                        } else {
-                            row1 = g_markup_printf_escaped(
-                                "<span color=\"red\" font_weight=\"bold\">%d</span>",
-                                unread
-                            );
-                        }
-                    }
-                }
-
-                text = g_strconcat(row0, "\n", row1, nullptr);
-                g_free(row0);
-                g_free(row1);
-            }
-            break;
-            case Ring::ObjectType::Call:
-            {
-                // do not display the duration if the call is part of a conference
-                auto parent_source = RecentModel::instance().peopleProxy()->mapToSource(idx.parent());
-                auto in_conference = RecentModel::instance().isConference(parent_source);
-
-                if (!in_conference) {
-                    auto duration = idx.data(static_cast<int>(Ring::Role::Length));
-
-                    if (duration.isValid())
-                        text = g_markup_escape_text(duration.value<QString>().toUtf8().constData(), -1);
-                }
-            }
-            break;
-            case Ring::ObjectType::Media:
-            case Ring::ObjectType::Certificate:
-            case Ring::ObjectType::ContactRequest:
-            // nothing to do for now
-            case Ring::ObjectType::COUNT__:
-            break;
-        }
-    }
-
-    g_object_set(G_OBJECT(cell), "markup", text, NULL);
-    g_free(text);
-}
-
-static void
-activate_item(GtkTreeView *tree_view,
-              GtkTreePath *path,
-              G_GNUC_UNUSED GtkTreeViewColumn *column,
-              G_GNUC_UNUSED gpointer user_data)
-{
-    auto model = gtk_tree_view_get_model(tree_view);
-    GtkTreeIter iter;
-    if (gtk_tree_model_get_iter(model, &iter, path)) {
-        QModelIndex idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), &iter);
-        auto type = idx.data(static_cast<int>(Ring::Role::ObjectType));
-        if (idx.isValid() && type.isValid()) {
-            switch (type.value<Ring::ObjectType>()) {
-                case Ring::ObjectType::Person:
-                {
-                    // call the last used contact method
-                    // TODO: if no contact methods have been used, offer a popup to Choose
-                    auto p_var = idx.data(static_cast<int>(Ring::Role::Object));
-                    if (p_var.isValid()) {
-                        auto person = p_var.value<Person *>();
-                        auto cms = person->phoneNumbers();
-
-                        if (!cms.isEmpty()) {
-                            auto last_used_cm = cms.at(0);
-                            for (int i = 1; i < cms.size(); ++i) {
-                                auto new_cm = cms.at(i);
-                                if (difftime(new_cm->lastUsed(), last_used_cm->lastUsed()) > 0)
-                                    last_used_cm = new_cm;
-                            }
-
-                            place_new_call(last_used_cm);
-                        }
-                    }
-                }
-                break;
-                case Ring::ObjectType::ContactMethod:
-                {
-                    // call the contact method
-                    auto cm = idx.data(static_cast<int>(Ring::Role::Object));
-                    if (cm.isValid())
-                        place_new_call(cm.value<ContactMethod *>());
-                }
-                break;
-                case Ring::ObjectType::Call:
-                case Ring::ObjectType::Media:
-                case Ring::ObjectType::Certificate:
-                case Ring::ObjectType::ContactRequest:
-                // nothing to do for now
-                case Ring::ObjectType::COUNT__:
-                break;
-            }
-        }
-    }
-}
-
-static void
-expand_if_child(G_GNUC_UNUSED GtkTreeModel *tree_model,
-                GtkTreePath  *path,
-                G_GNUC_UNUSED GtkTreeIter  *iter,
-                GtkTreeView  *treeview)
-{
-    if (gtk_tree_path_get_depth(path) > 1)
-        gtk_tree_view_expand_to_path(treeview, path);
-}
-
-static void
-scroll_to_selection(GtkTreeSelection *selection)
-{
-    auto treeview = gtk_tree_selection_get_tree_view(selection);
-    auto model = gtk_tree_view_get_model(treeview);
-    if (gtk_q_tree_model_is_layout_changing(GTK_Q_TREE_MODEL(model))) {
-        /* during a layout change, the GtkTreeModel items will be removed, so the GTK selection will
-         * be empty, we want to ignore this */
-        return;
-    }
-
-    GtkTreeIter iter;
-    if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
-        auto path = gtk_tree_model_get_path(model, &iter);
-        auto treeview = gtk_tree_selection_get_tree_view(selection);
-        gtk_tree_view_scroll_to_cell(treeview, path, nullptr, FALSE, 0.0, 0.0);
-    }
-}
-
-static void
-on_drag_data_get(GtkWidget        *treeview,
-                 G_GNUC_UNUSED GdkDragContext *context,
-                 GtkSelectionData *data,
-                 G_GNUC_UNUSED guint info,
-                 G_GNUC_UNUSED guint time,
-                 G_GNUC_UNUSED gpointer user_data)
-{
-    g_return_if_fail(IS_RECENT_CONTACTS_VIEW(treeview));
-
-    /* we always drag the selected row */
-    auto selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
-    GtkTreeModel *model = NULL;
-    GtkTreeIter iter;
-
-    if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
-        auto path_str = gtk_tree_model_get_string_from_iter(model, &iter);
-
-        gtk_selection_data_set(data,
-                               gdk_atom_intern_static_string(CALL_TARGET),
-                               8, /* bytes */
-                               (guchar *)path_str,
-                               strlen(path_str) + 1);
-
-        g_free(path_str);
-    } else {
-        g_warning("drag selection not valid");
-    }
-}
-
-static gboolean
-on_drag_drop(GtkWidget      *treeview,
-             GdkDragContext *context,
-             gint            x,
-             gint            y,
-             guint           time,
-             G_GNUC_UNUSED gpointer user_data)
-{
-    g_return_val_if_fail(IS_RECENT_CONTACTS_VIEW(treeview), FALSE);
-
-    GtkTreePath *path = NULL;
-    GtkTreeViewDropPosition drop_pos;
-
-    if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(treeview),
-                                          x, y, &path, &drop_pos)) {
-
-        GdkAtom target_type = gtk_drag_dest_find_target(treeview, context, NULL);
-
-        if (target_type != GDK_NONE) {
-            g_debug("can drop");
-            gtk_drag_get_data(treeview, context, target_type, time);
-            return TRUE;
-        }
-
-        gtk_tree_path_free(path);
-    }
-
-    return FALSE;
-}
-
-static gboolean
-on_drag_motion(GtkWidget      *treeview,
-               GdkDragContext *context,
-               gint            x,
-               gint            y,
-               guint           time,
-               G_GNUC_UNUSED gpointer user_data)
-{
-    g_return_val_if_fail(IS_RECENT_CONTACTS_VIEW(treeview), FALSE);
-
-    GtkTreePath *path = NULL;
-    GtkTreeViewDropPosition drop_pos;
-
-    if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(treeview),
-                                          x, y, &path, &drop_pos)) {
-        // we only want to drop on a row, not before or after
-        if (drop_pos == GTK_TREE_VIEW_DROP_BEFORE) {
-            gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW(treeview), path, GTK_TREE_VIEW_DROP_INTO_OR_BEFORE);
-        } else if (drop_pos == GTK_TREE_VIEW_DROP_AFTER) {
-            gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW(treeview), path, GTK_TREE_VIEW_DROP_INTO_OR_AFTER);
-        }
-        gdk_drag_status(context, gdk_drag_context_get_suggested_action(context), time);
-        return TRUE;
-    } else {
-        // not a row in the treeview, so we cannot drop
-        return FALSE;
-    }
-}
-
-static void
-on_drag_data_received(GtkWidget        *treeview,
-                      GdkDragContext   *context,
-                      gint              x,
-                      gint              y,
-                      GtkSelectionData *data,
-                      G_GNUC_UNUSED guint info,
-                      guint             time,
-                      G_GNUC_UNUSED gpointer user_data)
-{
-    g_return_if_fail(IS_RECENT_CONTACTS_VIEW(treeview));
-
-    gboolean success = FALSE;
-
-    /* get the source and destination calls */
-    auto path_str_source = (gchar *)gtk_selection_data_get_data(data);
-    auto type = gtk_selection_data_get_data_type(data);
-    g_debug("data type: %s", gdk_atom_name(type));
-    if (path_str_source && strlen(path_str_source) > 0) {
-        g_debug("source path: %s", path_str_source);
-
-        /* get the destination path */
-        GtkTreePath *dest_path = NULL;
-        if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(treeview), x, y, &dest_path, NULL)) {
-            auto model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
-
-            GtkTreeIter source;
-            gtk_tree_model_get_iter_from_string(model, &source, path_str_source);
-            auto idx_source_proxy = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), &source);
-
-            GtkTreeIter dest;
-            gtk_tree_model_get_iter(model, &dest, dest_path);
-            auto idx_dest_proxy = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), &dest);
-
-            // get call objects and indeces from RecentModel indeces being drag and dropped
-            auto idx_source = RecentModel::instance().peopleProxy()->mapToSource(idx_source_proxy);
-            auto idx_dest = RecentModel::instance().peopleProxy()->mapToSource(idx_dest_proxy);
-            auto call_source = RecentModel::instance().getActiveCall(idx_source);
-            auto call_dest = RecentModel::instance().getActiveCall(idx_dest);
-            auto idx_call_source = CallModel::instance().getIndex(call_source);
-            auto idx_call_dest = CallModel::instance().getIndex(call_dest);
-
-            if (idx_call_source.isValid() && idx_call_dest.isValid()) {
-                QModelIndexList source_list;
-                source_list << idx_call_source;
-                auto mimeData = CallModel::instance().mimeData(source_list);
-                auto action = Call::DropAction::Conference;
-                mimeData->setProperty("dropAction", action);
-
-                if (CallModel::instance().dropMimeData(mimeData, Qt::MoveAction, idx_call_dest.row(), idx_call_dest.column(), idx_call_dest.parent())) {
-                    success = TRUE;
-                } else {
-                    g_warning("could not drop mime data");
-                }
-            } else {
-                g_warning("source or dest call not valid");
-            }
-
-            gtk_tree_path_free(dest_path);
-        }
-    }
-
-    gtk_drag_finish(context, success, FALSE, time);
-}
-
-static gboolean
-synchronize_selection(RecentContactsView *self)
-{
-    auto idx = RecentModel::instance().selectionModel()->currentIndex();
-    auto selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
-    auto model = gtk_tree_view_get_model(GTK_TREE_VIEW(self));
-
-    if (gtk_q_tree_model_is_layout_changing(GTK_Q_TREE_MODEL(model))) {
-        /* during a layout change, the GtkTreeModel items will be removed, so the GTK selection will
-         * be empty, we want to avoid trying to sync during this time, and reschedule it to try
-         * again later */
-        return G_SOURCE_CONTINUE;
-    }
-
-    auto idx_proxy = RecentModel::instance().peopleProxy()->mapFromSource(idx);
-
-    if (idx_proxy.isValid()) {
-        /* select the current */
-        GtkTreeIter iter;
-        if (gtk_q_tree_model_source_index_to_iter(GTK_Q_TREE_MODEL(model), idx_proxy, &iter)) {
-            gtk_tree_selection_select_iter(selection, &iter);
-        }
-    } else {
-        gtk_tree_selection_unselect_all(selection);
-    }
-
-    return G_SOURCE_REMOVE;
-}
-
-static void
-recent_contacts_view_init(RecentContactsView *self)
-{
-    RecentContactsViewPrivate *priv = RECENT_CONTACTS_VIEW_GET_PRIVATE(self);
-
-    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(self), FALSE);
-    /* no need to show the expander since it will always be expanded */
-    gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(self), FALSE);
-    /* disable default search, we will handle it ourselves via LRC;
-     * otherwise the search steals input focus on key presses */
-    gtk_tree_view_set_enable_search(GTK_TREE_VIEW(self), FALSE);
-
-    GtkQTreeModel *recent_model = gtk_q_tree_model_new(
-        RecentModel::instance().peopleProxy(),
-        1,
-        0, Qt::DisplayRole, G_TYPE_STRING);
-
-    gtk_tree_view_set_model(GTK_TREE_VIEW(self),
-                            GTK_TREE_MODEL(recent_model));
-
-    /* photo and name/contact method column */
-    GtkCellArea *area = gtk_cell_area_box_new();
-    GtkTreeViewColumn *column = gtk_tree_view_column_new_with_area(area);
-
-    /* photo renderer */
-    GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new();
-    gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(area), renderer, FALSE, FALSE, FALSE);
-
-    /* get the photo */
-    gtk_tree_view_column_set_cell_data_func(
-        column,
-        renderer,
-        (GtkTreeCellDataFunc)render_contact_photo,
-        NULL,
-        NULL);
-
-    /* name/cm and status renderer */
-    renderer = gtk_cell_renderer_text_new();
-    g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-    gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(area), renderer, FALSE, FALSE, FALSE);
-
-    gtk_tree_view_column_set_cell_data_func(
-        column,
-        renderer,
-        (GtkTreeCellDataFunc)render_name_and_number,
-        self,
-        NULL);
-
-    /* call duration or unread messages */
-    renderer = gtk_cell_renderer_text_new();
-    g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
-    gtk_cell_area_box_pack_end(GTK_CELL_AREA_BOX(area), renderer, FALSE, FALSE, FALSE);
-    gtk_tree_view_column_set_cell_data_func(
-        column,
-        renderer,
-        (GtkTreeCellDataFunc)render_info,
-        self,
-        NULL);
-
-    gtk_tree_view_append_column(GTK_TREE_VIEW(self), column);
-    gtk_tree_view_column_set_resizable(column, TRUE);
-    gtk_tree_view_column_set_expand(column, TRUE);
-    gtk_tree_view_expand_all(GTK_TREE_VIEW(self));
-
-    g_signal_connect(self, "row-activated", G_CALLBACK(activate_item), NULL);
-    g_signal_connect(recent_model, "row-inserted", G_CALLBACK(expand_if_child), self);
-
-    GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
-    g_signal_connect(selection, "changed", G_CALLBACK(update_selection), NULL);
-    g_signal_connect(selection, "changed", G_CALLBACK(scroll_to_selection), NULL);
-    g_signal_connect_swapped(recent_model, "rows-reordered", G_CALLBACK(scroll_to_selection), selection);
-
-    /* sync initial selection */
-    g_idle_add((GSourceFunc)synchronize_selection, self);
-
-    auto synchronize_selection_idle = [self] () { g_idle_add((GSourceFunc)synchronize_selection, self); };
-
-    /* update the selection based on the RecentModel */
-    priv->selection_updated = QObject::connect(
-        RecentModel::instance().selectionModel(),
-        &QItemSelectionModel::currentChanged,
-        synchronize_selection_idle
-    );
-
-    /* we may need to update the selection when the layout changes */
-    priv->layout_changed = QObject::connect(
-        RecentModel::instance().peopleProxy(),
-        &QAbstractItemModel::layoutChanged,
-        synchronize_selection_idle
-    );
-
-    /* drag and drop */
-    static GtkTargetEntry targetentries[] = {
-        { (gchar *)CALL_TARGET, GTK_TARGET_SAME_WIDGET, CALL_TARGET_ID },
-    };
-
-    gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(self),
-        GDK_BUTTON1_MASK, targetentries, 1, (GdkDragAction)(GDK_ACTION_DEFAULT | GDK_ACTION_MOVE));
-
-    gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(self),
-        targetentries, 1, GDK_ACTION_DEFAULT);
-
-    g_signal_connect(self, "drag-data-get", G_CALLBACK(on_drag_data_get), nullptr);
-    g_signal_connect(self, "drag-drop", G_CALLBACK(on_drag_drop), nullptr);
-    g_signal_connect(self, "drag-motion", G_CALLBACK(on_drag_motion), nullptr);
-    g_signal_connect(self, "drag_data_received", G_CALLBACK(on_drag_data_received), nullptr);
-
-    /* init popup menu */
-    priv->popup_menu = contact_popup_menu_new(GTK_TREE_VIEW(self));
-    g_signal_connect_swapped(self, "button-press-event", G_CALLBACK(contact_popup_menu_show), priv->popup_menu);
-
-    gtk_widget_show_all(GTK_WIDGET(self));
-}
-
-static void
-recent_contacts_view_dispose(GObject *object)
-{
-    RecentContactsView *self = RECENT_CONTACTS_VIEW(object);
-    RecentContactsViewPrivate *priv = RECENT_CONTACTS_VIEW_GET_PRIVATE(self);
-
-    QObject::disconnect(priv->selection_updated);
-    QObject::disconnect(priv->layout_changed);
-    gtk_widget_destroy(priv->popup_menu);
-
-    G_OBJECT_CLASS(recent_contacts_view_parent_class)->dispose(object);
-}
-
-static void
-recent_contacts_view_finalize(GObject *object)
-{
-    G_OBJECT_CLASS(recent_contacts_view_parent_class)->finalize(object);
-}
-
-static void
-recent_contacts_view_class_init(RecentContactsViewClass *klass)
-{
-    G_OBJECT_CLASS(klass)->finalize = recent_contacts_view_finalize;
-    G_OBJECT_CLASS(klass)->dispose = recent_contacts_view_dispose;
-}
-
-GtkWidget *
-recent_contacts_view_new()
-{
-    gpointer self = g_object_new(RECENT_CONTACTS_VIEW_TYPE, NULL);
-
-    return (GtkWidget *)self;
-}
diff --git a/src/recentcontactsview.h b/src/recentcontactsview.h
deleted file mode 100644
index 956cb59..0000000
--- a/src/recentcontactsview.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (C) 2015-2017 Savoir-faire Linux Inc.
- *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#pragma once
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define RECENT_CONTACTS_VIEW_TYPE            (recent_contacts_view_get_type ())
-#define RECENT_CONTACTS_VIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), RECENT_CONTACTS_VIEW_TYPE, RecentContactsView))
-#define RECENT_CONTACTS_VIEW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), RECENT_CONTACTS_VIEW_TYPE, RecentContactsViewClass))
-#define IS_RECENT_CONTACTS_VIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), RECENT_CONTACTS_VIEW_TYPE))
-#define IS_RECENT_CONTACTS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), RECENT_CONTACTS_VIEW_TYPE))
-
-typedef struct _RecentContactsView      RecentContactsView;
-typedef struct _RecentContactsViewClass RecentContactsViewClass;
-
-GType      recent_contacts_view_get_type (void) G_GNUC_CONST;
-GtkWidget *recent_contacts_view_new      (void);
-
-G_END_DECLS
diff --git a/src/utils/menus.cpp b/src/utils/menus.cpp
deleted file mode 100644
index bc59eee..0000000
--- a/src/utils/menus.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (C) 2015-2017 Savoir-faire Linux Inc.
- *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#include "menus.h"
-
-#include <glib/gi18n.h>
-#include <contactmethod.h>
-#include "../contactpopover.h"
-
-/**
- * checks if the given contact method is already associated with a contact
- */
-gboolean
-contact_method_has_contact(ContactMethod *cm)
-{
-    g_return_val_if_fail(cm, FALSE);
-
-    return cm->contact() != NULL;
-}
-
-static void
-choose_contact(GtkWidget *item, ContactMethod *contactmethod)
-{
-    // we get the parent widget which should be stored in the item object
-    auto parent = g_object_get_data(G_OBJECT(item), "parent-widget");
-    auto rect = g_object_get_data(G_OBJECT(item), "parent-rectangle");
-
-    auto popover = contact_popover_new(contactmethod, GTK_WIDGET(parent), (GdkRectangle *)rect);
-
-    gtk_widget_show(popover);
-}
-
-/**
- * Takes a GtkMenuItem and connects its activate signal to a popup which adds the given
- * ContactMethod to a Person
- */
-GtkMenuItem*
-menu_item_add_to_contact(GtkMenuItem *item, ContactMethod *cm, GtkWidget *parent, const GdkRectangle *rect)
-{
-    g_return_val_if_fail(item && cm, NULL);
-
-    /* save the parent widget in the item object, so we can retrieve
-     * it in the callback */
-    g_object_set_data(G_OBJECT(item), "parent-widget", parent);
-
-    GdkRectangle *copy_rect = NULL;
-    if (rect) {
-        copy_rect = g_new0(GdkRectangle, 1);
-        memcpy(copy_rect, rect, sizeof(GdkRectangle));
-    }
-    g_object_set_data_full(G_OBJECT(item), "parent-rectangle", copy_rect, (GDestroyNotify)g_free);
-
-    g_signal_connect(item, "activate", G_CALLBACK(choose_contact), cm);
-
-    return item;
-}
diff --git a/src/utils/menus.h b/src/utils/menus.h
deleted file mode 100644
index adc0bb4..0000000
--- a/src/utils/menus.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (C) 2015-2017 Savoir-faire Linux Inc.
- *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#ifndef _MENUS_H
-#define _MENUS_H
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-class ContactMethod;
-
-/**
- * checks if the given contact method is already associated with a contact
- */
-gboolean    contact_method_has_contact(ContactMethod *cm);
-
-/**
- * Takes a GtkMenuItem and connects its activate signal to a popup which adds the given
- * ContactMethod to a Person
- */
-GtkMenuItem* menu_item_add_to_contact(GtkMenuItem *item, ContactMethod *cm, GtkWidget *parent, const GdkRectangle *rect);
-
-G_END_DECLS
-
-#endif /* _MENUS_H */
diff --git a/ui/contactrequestcontentview.ui b/ui/contactrequestcontentview.ui
deleted file mode 100644
index f39ac7e..0000000
--- a/ui/contactrequestcontentview.ui
+++ /dev/null
@@ -1,242 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
-<interface>
-  <requires lib="gtk+" version="3.10"/>
-  <object class="GtkImage" id="image_accept">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="resource">/cx/ring/RingGnome/add</property>
-  </object>
-  <object class="GtkImage" id="image_back_arrow">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="icon_name">go-previous-symbolic</property>
-  </object>
-  <object class="GtkImage" id="image_block">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="resource">/cx/ring/RingGnome/block</property>
-  </object>
-  <object class="GtkImage" id="image_reject">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="resource">/cx/ring/RingGnome/reject</property>
-  </object>
-  <template class="ContactRequestContentView" parent="GtkBox">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkBox" id="hbox_contact_request_info">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="no_show_all">True</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">5</property>
-        <child>
-          <object class="GtkButton" id="button_close_contact_request_content_view">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="receives_default">False</property>
-            <property name="tooltip_text" translatable="yes">Close contact invitation view</property>
-            <property name="image">image_back_arrow</property>
-            <property name="relief">none</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">0</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkFrame" id="frame_call">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label_xalign">0</property>
-        <property name="shadow_type">none</property>
-        <child>
-          <object class="GtkBox" id="vbox_call">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="orientation">vertical</property>
-            <property name="valign">center</property>
-            <child>
-              <object class="GtkLabel" id="page_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes">Invitation from</property>
-                <attributes>
-                  <attribute name="scale" value="1.5"/>
-                </attributes>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="padding">5</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkBox" id="vbox_incoming_info">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="valign">center</property>
-                <property name="border_width">15</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">15</property>
-                <child>
-                  <object class="GtkImage" id="image_peer">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="label_peer">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="halign">center</property>
-                    <property name="selectable">True</property>
-                    <property name="ellipsize">end</property>
-                    <attributes>
-                      <attribute name="scale" value="1.5"/>
-                    </attributes>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="label_bestId">
-                    <property name="can_focus">True</property>
-                    <property name="halign">center</property>
-                    <property name="selectable">True</property>
-                    <property name="ellipsize">end</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="placeholder">
-                    <property name="height_request">25</property>
-                    <property name="can_focus">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">3</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkBox" id="hbox_action_bar">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="valign">center</property>
-                <property name="halign">center</property>
-                <property name="border_width">20</property>
-                <property name="spacing">20</property>
-                <child>
-                  <object class="GtkButton" id="button_accept_contact_request">
-                    <style>
-                      <class name="flat-button"/>
-                      <class name="button-green"/>
-                    </style>
-                    <property name="image">image_accept</property>
-                    <property name="label" translatable="yes">Accept</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="button_ignore_contact_request">
-                    <style>
-                      <class name="flat-button"/>
-                      <class name="button-red"/>
-                    </style>
-                    <property name="image">image_reject</property>
-                    <property name="label" translatable="yes">Reject</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="button_block_contact_request">
-                    <style>
-                      <class name="flat-button"/>
-                      <class name="button-red"/>
-                    </style>
-                    <property name="image">image_block</property>
-                    <property name="label" translatable="yes">Block</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-          </object>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">True</property>
-        <property name="fill">True</property>
-        <property name="position">3</property>
-      </packing>
-    </child>
-  </template>
-</interface>
diff --git a/ui/incomingcallview.ui b/ui/incomingcallview.ui
index 7867383..439d7f4 100644
--- a/ui/incomingcallview.ui
+++ b/ui/incomingcallview.ui
@@ -90,13 +90,6 @@
                         <property name="height-request">25</property>
                       </object>
                     </child>
-                    <child>
-                      <object class="GtkLabel" id="placeholder">
-                        <property name="visible">False</property>
-                        <property name="can_focus">False</property>
-                        <property name="height-request">25</property>
-                      </object>
-                    </child>
                     <!-- end of call initialization progress -->
                     <!-- call state info -->
                     <child>
@@ -171,28 +164,6 @@
                       </packing>
                     </child>
                     <!-- end reject button -->
-                    <!-- end button -->
-                    <child>
-                      <object class="GtkButton" id="button_end_call">
-                        <style>
-                          <class name="red-button"/>
-                          <class name="flat-button"/>
-                        </style>
-                        <property name="width-request">48</property>
-                        <property name="height-request">48</property>
-                        <property name="visible">False</property>
-                        <property name="can_focus">True</property>
-                        <property name="has_tooltip">True</property>
-                        <property name="tooltip-text" translatable="yes">Hang up</property>
-                        <property name="image">image_hangup</property>
-                        <property name="action-name">app.hangup</property>
-                      </object>
-                      <packing>
-                        <property name="expand">True</property>
-                        <property name="fill">True</property>
-                      </packing>
-                    </child>
-                    <!-- end end button -->
                   </object>
                   <packing>
                     <property name="expand">False</property>
diff --git a/ui/ui.gresource.xml b/ui/ui.gresource.xml
index a2aba9f..9f550bf 100644
--- a/ui/ui.gresource.xml
+++ b/ui/ui.gresource.xml
@@ -23,7 +23,6 @@
     <file preprocess="xml-stripblanks">accountimportexportview.ui</file>
     <file preprocess="xml-stripblanks">webkitchatcontainer.ui</file>
     <file preprocess="xml-stripblanks">usernameregistrationbox.ui</file>
-    <file preprocess="xml-stripblanks">contactrequestcontentview.ui</file>
     <file preprocess="xml-stripblanks">accountbanstab.ui</file>
   </gresource>
 </gresources>
