diff --git a/src/ringmainwindow.cpp b/src/ringmainwindow.cpp
index 7861b40..74d5eb4 100644
--- a/src/ringmainwindow.cpp
+++ b/src/ringmainwindow.cpp
@@ -186,7 +186,7 @@
     void leaveFullScreen();
     void toggleFullScreen();
     void resetToWelcome();
-    void setPendingContactRequestTabIcon(RingMainWindow *win);
+    void refreshPendingContactRequestTab();
     void showAccountSelectorWidget(bool show = true);
     void changeAccountSelection(const std::string& id);
     void onAccountSelectionChange(const std::string& id);
@@ -205,6 +205,9 @@
     bool show_settings = false;
     bool is_fullscreen = false;
 
+    int smartviewPageNum = 0;
+    int contactRequestsPageNum = 0;
+
     QMetaObject::Connection showChatViewConnection_;
     QMetaObject::Connection showCallViewConnection_;
     QMetaObject::Connection showIncomingViewConnection_;
@@ -224,6 +227,7 @@
     CppImpl(const CppImpl&) = delete;
     CppImpl& operator=(const CppImpl&) = delete;
 
+    GtkWidget* displayWelcomeView(lrc::api::conversation::Info);
     GtkWidget* displayIncomingView(lrc::api::conversation::Info);
     GtkWidget* displayCurrentCallView(lrc::api::conversation::Info);
     GtkWidget* displayChatView(lrc::api::conversation::Info);
@@ -541,26 +545,37 @@
 void
 CppImpl::init()
 {
+    // Remember the tabs page number for easier selection later
+    smartviewPageNum = gtk_notebook_page_num(GTK_NOTEBOOK(widgets->notebook_contacts),
+                                             widgets->scrolled_window_smartview);
+    contactRequestsPageNum = gtk_notebook_page_num(GTK_NOTEBOOK(widgets->notebook_contacts),
+                                                   widgets->scrolled_window_contact_requests);
+    g_assert(smartviewPageNum != contactRequestsPageNum);
+
     // NOTE: When new models will be fully implemented, we need to move this
     // in rign_client.cpp->
     // Init LRC and the vew
     const auto accountIds = lrc_->getAccountModel().getAccountList();
-    auto isInitialized = false;
+    decltype(accountIds)::value_type activeAccountId; // non-empty if a enabled account is found below
+
     if (not accountIds.empty()) {
-        for (const auto& accountId : accountIds) {
-            const auto& accountInfo = lrc_->getAccountModel().getAccountInfo(accountId);
+        for (const auto& id : accountIds) {
+            const auto& accountInfo = lrc_->getAccountModel().getAccountInfo(id);
             if (accountInfo.enabled) {
-                updateLrc(accountId);
-                isInitialized = true;
+                activeAccountId = id;
                 break;
             }
         }
-        if (!isInitialized) {
-            widgets->treeview_conversations = conversations_view_new(accountContainer_.get());
-            gtk_container_add(GTK_CONTAINER(widgets->scrolled_window_smartview), widgets->treeview_conversations);
-            widgets->treeview_contact_requests = conversations_view_new(accountContainer_.get());
-            gtk_container_add(GTK_CONTAINER(widgets->scrolled_window_contact_requests), widgets->treeview_contact_requests);
-        }
+    }
+
+    if (!activeAccountId.empty()) {
+        updateLrc(activeAccountId);
+    } else {
+        // No enabled account: create empty widgets
+        widgets->treeview_conversations = conversations_view_new(nullptr);
+        gtk_container_add(GTK_CONTAINER(widgets->scrolled_window_smartview), widgets->treeview_conversations);
+        widgets->treeview_contact_requests = conversations_view_new(nullptr);
+        gtk_container_add(GTK_CONTAINER(widgets->scrolled_window_contact_requests), widgets->treeview_contact_requests);
     }
 
     accountStatusChangedConnection_ = QObject::connect(&lrc_->getAccountModel(),
@@ -725,9 +740,9 @@
     g_signal_connect_swapped(widgets->combobox_account_selector, "changed", G_CALLBACK(on_account_changed), self);
 
     // initialize the pending contact request icon.
-    setPendingContactRequestTabIcon(self);
+    refreshPendingContactRequestTab();
 
-    if (isInitialized) {
+    if (accountContainer_) {
         auto& conversationModel = accountContainer_->info.conversationModel;
         auto conversations = conversationModel->allFilteredConversations();
         for (const auto& conversation: conversations) {
@@ -774,21 +789,7 @@
     } else if (g_type_is_a(CHAT_VIEW_TYPE, type)) {
         new_view = displayChatView(conversation);
     } else {
-        chatViewConversation_.reset(nullptr);
-
-        // TODO select first conversation?
-        new_view = widgets->welcome_view;
-
-        if (accountContainer_) {
-            // refresh the tabs
-            auto hasPendingRequests = accountContainer_->info.contactModel->hasPendingRequests();
-
-            gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widgets->notebook_contacts), hasPendingRequests);
-
-            if (not hasPendingRequests) {
-                gtk_notebook_prev_page(GTK_NOTEBOOK(widgets->notebook_contacts));
-            }
-        }
+        new_view = displayWelcomeView(conversation);
     }
 
     gtk_container_add(GTK_CONTAINER(widgets->frame_call), new_view);
@@ -796,6 +797,19 @@
 }
 
 GtkWidget*
+CppImpl::displayWelcomeView(lrc::api::conversation::Info conversation)
+{
+    (void) conversation;
+
+    // TODO select first conversation?
+
+    chatViewConversation_.reset(nullptr);
+    refreshPendingContactRequestTab();
+
+    return widgets->welcome_view;;
+}
+
+GtkWidget*
 CppImpl::displayIncomingView(lrc::api::conversation::Info conversation)
 {
     chatViewConversation_.reset(new lrc::api::conversation::Info(conversation));
@@ -890,17 +904,21 @@
 }
 
 void
-CppImpl::setPendingContactRequestTabIcon(RingMainWindow *win)
+CppImpl::refreshPendingContactRequestTab()
 {
-    auto* priv = RING_MAIN_WINDOW_GET_PRIVATE(win);
-
     if (not accountContainer_)
         return;
 
-    auto hasPendingRequest = priv->cpp->accountContainer_->info.contactModel->hasPendingRequests();
+    auto hasPendingRequests = accountContainer_->info.contactModel->hasPendingRequests();
+    gtk_widget_set_visible(widgets->scrolled_window_contact_requests, hasPendingRequests);
+    gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widgets->notebook_contacts), hasPendingRequests);
 
-    gtk_widget_set_visible(widgets->scrolled_window_contact_requests, hasPendingRequest);
-    gtk_notebook_set_show_tabs(GTK_NOTEBOOK(priv->notebook_contacts), hasPendingRequest);
+    // show conversation page if PendingRequests list is empty
+    if (not hasPendingRequests) {
+        auto current_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->notebook_contacts));
+        if (current_page == contactRequestsPageNum)
+            gtk_notebook_set_current_page(GTK_NOTEBOOK(widgets->notebook_contacts), smartviewPageNum);
+    }
 }
 
 void
@@ -1279,7 +1297,7 @@
     else if (IS_INCOMING_CALL_VIEW(old_view))
         current_item = incoming_call_view_get_conversation(INCOMING_CALL_VIEW(old_view));
     conversations_view_select_conversation(CONVERSATIONS_VIEW(widgets->treeview_conversations), current_item.uid);
-    setPendingContactRequestTabIcon(self);
+    refreshPendingContactRequestTab();
 }
 
 void
