diff --git a/src/chatview.cpp b/src/chatview.cpp
index 1c6968a..9489dfd 100644
--- a/src/chatview.cpp
+++ b/src/chatview.cpp
@@ -267,13 +267,17 @@
     // Contact
     if (!priv->conversation_) return;
     auto contactUri = priv->conversation_->participants.front();
-    auto& contact = priv->accountContainer_->info.contactModel->getContact(contactUri);
-    if (!contact.profileInfo.avatar.empty()) {
-        webkit_chat_container_set_sender_image(
-            WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container),
-            priv->accountContainer_->info.contactModel->getContactProfileId(contactUri),
-            contact.profileInfo.avatar
-        );
+    try{
+        auto& contact = priv->accountContainer_->info.contactModel->getContact(contactUri);
+        if (!contact.profileInfo.avatar.empty()) {
+            webkit_chat_container_set_sender_image(
+                WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container),
+                priv->accountContainer_->info.contactModel->getContactProfileId(contactUri),
+                contact.profileInfo.avatar
+                );
+        }
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
     }
 
     // For this account
@@ -306,10 +310,14 @@
 
     if (!priv->conversation_) return;
     auto participant = priv->conversation_->participants[0];
-    auto contactInfo = priv->accountContainer_->info.contactModel->getContact(participant);
-    if(contactInfo.profileInfo.type != lrc::api::profile::Type::TEMPORARY
-       && contactInfo.profileInfo.type != lrc::api::profile::Type::PENDING)
-        gtk_widget_hide(priv->button_add_to_conversations);
+    try {
+        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(participant);
+        if(contactInfo.profileInfo.type != lrc::api::profile::Type::TEMPORARY
+           && contactInfo.profileInfo.type != lrc::api::profile::Type::PENDING)
+            gtk_widget_hide(priv->button_add_to_conversations);
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
+    }
 }
 
 static void
@@ -319,15 +327,18 @@
     ChatViewPrivate *priv = CHAT_VIEW_GET_PRIVATE(self);
     if (!priv->conversation_) return;
     auto contactUri = priv->conversation_->participants.front();
-    auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
-    auto bestId = std::string(contactInfo.registeredName).empty() ? contactInfo.profileInfo.uri : contactInfo.registeredName;
-    if (contactInfo.profileInfo.alias == bestId) {
-        gtk_widget_hide(priv->label_cm);
-    } else {
-        gtk_label_set_text(GTK_LABEL(priv->label_cm), bestId.c_str());
-        gtk_widget_show(priv->label_cm);
+    try {
+        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
+        auto bestId = std::string(contactInfo.registeredName).empty() ? contactInfo.profileInfo.uri : contactInfo.registeredName;
+        if (contactInfo.profileInfo.alias == bestId) {
+            gtk_widget_hide(priv->label_cm);
+        } else {
+            gtk_label_set_text(GTK_LABEL(priv->label_cm), bestId.c_str());
+            gtk_widget_show(priv->label_cm);
+        }
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
     }
-
 }
 
 static void
@@ -337,10 +348,14 @@
     ChatViewPrivate *priv = CHAT_VIEW_GET_PRIVATE(self);
     if (!priv->conversation_) return;
     auto contactUri = priv->conversation_->participants.front();
-    auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
-    auto alias = contactInfo.profileInfo.alias;
-    alias.erase(std::remove(alias.begin(), alias.end(), '\r'), alias.end());
-    gtk_label_set_text(GTK_LABEL(priv->label_peer), alias.c_str());
+    try {
+        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
+        auto alias = contactInfo.profileInfo.alias;
+        alias.erase(std::remove(alias.begin(), alias.end(), '\r'), alias.end());
+        gtk_label_set_text(GTK_LABEL(priv->label_peer), alias.c_str());
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
+    }
 }
 
 static void
@@ -379,22 +394,26 @@
 
     if (!priv->conversation_) return;
     auto contactUri = priv->conversation_->participants.front();
-    auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
-    priv->isTemporary_ = contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY
-                         || contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING;
-    webkit_chat_container_set_temporary(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container), priv->isTemporary_);
-    auto bestName = contactInfo.profileInfo.alias;
-    if (bestName.empty())
-        bestName = contactInfo.registeredName;
-    if (bestName.empty())
-        bestName = contactInfo.profileInfo.uri;
-    bestName.erase(std::remove(bestName.begin(), bestName.end(), '\r'), bestName.end());
-    webkit_chat_container_set_invitation(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container),
-                                         (contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING),
-                                         bestName);
-    webkit_chat_disable_send_interaction(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container),
-                                        (contactInfo.profileInfo.type == lrc::api::profile::Type::SIP)
-                                         && priv->conversation_->callId.empty());
+    try {
+        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
+        priv->isTemporary_ = contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY
+            || contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING;
+        webkit_chat_container_set_temporary(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container), priv->isTemporary_);
+        auto bestName = contactInfo.profileInfo.alias;
+        if (bestName.empty())
+            bestName = contactInfo.registeredName;
+        if (bestName.empty())
+            bestName = contactInfo.profileInfo.uri;
+        bestName.erase(std::remove(bestName.begin(), bestName.end(), '\r'), bestName.end());
+        webkit_chat_container_set_invitation(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container),
+                                             (contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING),
+                                             bestName);
+        webkit_chat_disable_send_interaction(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container),
+                                             (contactInfo.profileInfo.type == lrc::api::profile::Type::SIP)
+                                             && priv->conversation_->callId.empty());
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
+    }
 }
 
 static void
@@ -457,15 +476,19 @@
     webkit_chat_container_set_temporary(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container), priv->isTemporary_);
     if (!priv->conversation_) return;
     auto contactUri = priv->conversation_->participants.front();
-    auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
-    auto bestName = contactInfo.profileInfo.alias;
-    if (bestName.empty())
-        bestName = contactInfo.registeredName;
-    if (bestName.empty())
-        bestName = contactInfo.profileInfo.uri;
-    webkit_chat_container_set_invitation(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container),
-                                         newValue,
-                                         bestName);
+    try {
+        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
+        auto bestName = contactInfo.profileInfo.alias;
+        if (bestName.empty())
+            bestName = contactInfo.registeredName;
+        if (bestName.empty())
+            bestName = contactInfo.profileInfo.uri;
+        webkit_chat_container_set_invitation(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container),
+                                             newValue,
+                                             bestName);
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
+    }
 }
 
 bool
diff --git a/src/conversationpopupmenu.cpp b/src/conversationpopupmenu.cpp
index da66d34..bd4274c 100644
--- a/src/conversationpopupmenu.cpp
+++ b/src/conversationpopupmenu.cpp
@@ -160,46 +160,49 @@
     auto idx = gtk_tree_path_get_indices(path);
     auto conversation = priv->accountContainer_->info.conversationModel->filteredConversation(idx[0]);
     priv->row_ = idx[0];
-    auto contactInfo = priv->accountContainer_->info.contactModel->getContact(conversation.participants.front());
-    if (contactInfo.profileInfo.uri.empty()) return;
+    try {
+        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(conversation.participants.front());
+        if (contactInfo.profileInfo.uri.empty()) return;
 
-    // we always build a menu, however in some cases some or all of the conversations will be deactivated
-    // we prefer this to having an empty menu because GTK+ behaves weird in the empty menu case
-    auto place_call_conversation = gtk_menu_item_new_with_mnemonic(_("_Place call"));
-    gtk_menu_shell_append(GTK_MENU_SHELL(self), place_call_conversation);
-    g_signal_connect(place_call_conversation, "activate", G_CALLBACK(place_call), priv);
-    auto copy_name = gtk_menu_item_new_with_mnemonic(_("_Copy name"));
-    gtk_menu_shell_append(GTK_MENU_SHELL(self), copy_name);
-    g_signal_connect(copy_name, "activate", G_CALLBACK(copy_contact_info), priv);
-    if (contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY ||
-        contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING) {
-        // If we can add this conversation
-        auto add_conversation_conversation = gtk_menu_item_new_with_mnemonic(_("_Add to conversations"));
-        gtk_menu_shell_append(GTK_MENU_SHELL(self), add_conversation_conversation);
-        g_signal_connect(add_conversation_conversation, "activate", G_CALLBACK(add_conversation), priv);
-        if (contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING) {
-            auto rm_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Discard invitation"));
+        // we always build a menu, however in some cases some or all of the conversations will be deactivated
+        // we prefer this to having an empty menu because GTK+ behaves weird in the empty menu case
+        auto place_call_conversation = gtk_menu_item_new_with_mnemonic(_("_Place call"));
+        gtk_menu_shell_append(GTK_MENU_SHELL(self), place_call_conversation);
+        g_signal_connect(place_call_conversation, "activate", G_CALLBACK(place_call), priv);
+        auto copy_name = gtk_menu_item_new_with_mnemonic(_("_Copy name"));
+        gtk_menu_shell_append(GTK_MENU_SHELL(self), copy_name);
+        g_signal_connect(copy_name, "activate", G_CALLBACK(copy_contact_info), priv);
+        if (contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY ||
+            contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING) {
+            // If we can add this conversation
+            auto add_conversation_conversation = gtk_menu_item_new_with_mnemonic(_("_Add to conversations"));
+            gtk_menu_shell_append(GTK_MENU_SHELL(self), add_conversation_conversation);
+            g_signal_connect(add_conversation_conversation, "activate", G_CALLBACK(add_conversation), priv);
+            if (contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING) {
+                auto rm_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Discard invitation"));
+                gtk_menu_shell_append(GTK_MENU_SHELL(self), rm_conversation_item);
+                g_signal_connect(rm_conversation_item, "activate", G_CALLBACK(remove_conversation), priv);
+                auto block_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Block invitations"));
+                gtk_menu_shell_append(GTK_MENU_SHELL(self), block_conversation_item);
+                g_signal_connect(block_conversation_item, "activate", G_CALLBACK(block_conversation), priv);
+            }
+        } else {
+            auto rm_history_conversation = gtk_menu_item_new_with_mnemonic(_("C_lear history"));
+            gtk_menu_shell_append(GTK_MENU_SHELL(self), rm_history_conversation);
+            g_signal_connect(rm_history_conversation, "activate", G_CALLBACK(remove_history_conversation), priv);
+            auto rm_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Remove conversation"));
             gtk_menu_shell_append(GTK_MENU_SHELL(self), rm_conversation_item);
             g_signal_connect(rm_conversation_item, "activate", G_CALLBACK(remove_conversation), priv);
-            auto block_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Block invitations"));
+            auto block_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Block contact"));
             gtk_menu_shell_append(GTK_MENU_SHELL(self), block_conversation_item);
             g_signal_connect(block_conversation_item, "activate", G_CALLBACK(block_conversation), priv);
         }
-    } else {
-        auto rm_history_conversation = gtk_menu_item_new_with_mnemonic(_("C_lear history"));
-        gtk_menu_shell_append(GTK_MENU_SHELL(self), rm_history_conversation);
-        g_signal_connect(rm_history_conversation, "activate", G_CALLBACK(remove_history_conversation), priv);
-        auto rm_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Remove conversation"));
-        gtk_menu_shell_append(GTK_MENU_SHELL(self), rm_conversation_item);
-        g_signal_connect(rm_conversation_item, "activate", G_CALLBACK(remove_conversation), priv);
-        auto block_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Block contact"));
-        gtk_menu_shell_append(GTK_MENU_SHELL(self), block_conversation_item);
-        g_signal_connect(block_conversation_item, "activate", G_CALLBACK(block_conversation), priv);
+
+        /* show all conversations */
+        gtk_widget_show_all(GTK_WIDGET(self));
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
     }
-
-    /* show all conversations */
-    gtk_widget_show_all(GTK_WIDGET(self));
-
 }
 
 static void
diff --git a/src/conversationsview.cpp b/src/conversationsview.cpp
index 0733fef..83be3e4 100644
--- a/src/conversationsview.cpp
+++ b/src/conversationsview.cpp
@@ -240,21 +240,25 @@
     for (auto conversation : priv->accountContainer_->info.conversationModel->allFilteredConversations()) {
         if (conversation.participants.empty()) break; // Should not
         auto contactUri = conversation.participants.front();
-        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
-        auto lastMessage = conversation.interactions.empty() ? "" :
-            conversation.interactions.at(conversation.lastMessageUid).body;
-        std::replace(lastMessage.begin(), lastMessage.end(), '\n', ' ');
-        gtk_list_store_append (store, &iter);
-        auto alias = contactInfo.profileInfo.alias;
-        alias.erase(std::remove(alias.begin(), alias.end(), '\r'), alias.end());
-        gtk_list_store_set (store, &iter,
-            0 /* col # */ , conversation.uid.c_str() /* celldata */,
-            1 /* col # */ , alias.c_str() /* celldata */,
-            2 /* col # */ , contactInfo.profileInfo.uri.c_str() /* celldata */,
-            3 /* col # */ , contactInfo.registeredName.c_str() /* celldata */,
-            4 /* col # */ , contactInfo.profileInfo.avatar.c_str() /* celldata */,
-            5 /* col # */ , lastMessage.c_str() /* celldata */,
-            -1 /* end */);
+        try {
+            auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri);
+            auto lastMessage = conversation.interactions.empty() ? "" :
+                conversation.interactions.at(conversation.lastMessageUid).body;
+            std::replace(lastMessage.begin(), lastMessage.end(), '\n', ' ');
+            gtk_list_store_append (store, &iter);
+            auto alias = contactInfo.profileInfo.alias;
+            alias.erase(std::remove(alias.begin(), alias.end(), '\r'), alias.end());
+            gtk_list_store_set (store, &iter,
+                                0 /* col # */ , conversation.uid.c_str() /* celldata */,
+                                1 /* col # */ , alias.c_str() /* celldata */,
+                                2 /* col # */ , contactInfo.profileInfo.uri.c_str() /* celldata */,
+                                3 /* col # */ , contactInfo.registeredName.c_str() /* celldata */,
+                                4 /* col # */ , contactInfo.profileInfo.avatar.c_str() /* celldata */,
+                                5 /* col # */ , lastMessage.c_str() /* celldata */,
+                                -1 /* end */);
+        } catch (const std::out_of_range&) {
+            // ContactModel::getContact() exception
+        }
     }
 
     return GTK_TREE_MODEL (store);
diff --git a/src/currentcallview.cpp b/src/currentcallview.cpp
index 932efe4..f636f80 100644
--- a/src/currentcallview.cpp
+++ b/src/currentcallview.cpp
@@ -765,15 +765,18 @@
     std::shared_ptr<GdkPixbuf> image = var_i.value<std::shared_ptr<GdkPixbuf>>();
     gtk_image_set_from_pixbuf(GTK_IMAGE(priv->image_peer), image.get());
 
-    auto contactInfo = priv->accountContainer_->info.contactModel->getContact(priv->conversation_->participants.front());
+    try {
+        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(priv->conversation_->participants.front());
+        auto name = contactInfo.profileInfo.alias;
+        gtk_label_set_text(GTK_LABEL(priv->label_name), name.c_str());
 
-    auto name = contactInfo.profileInfo.alias;
-    gtk_label_set_text(GTK_LABEL(priv->label_name), name.c_str());
-
-    auto bestId = contactInfo.registeredName;
-    if (name != bestId) {
-        gtk_label_set_text(GTK_LABEL(priv->label_bestId), bestId.c_str());
-        gtk_widget_show(priv->label_bestId);
+        auto bestId = contactInfo.registeredName;
+        if (name != bestId) {
+            gtk_label_set_text(GTK_LABEL(priv->label_bestId), bestId.c_str());
+            gtk_widget_show(priv->label_bestId);
+        }
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
     }
 }
 
diff --git a/src/incomingcallview.cpp b/src/incomingcallview.cpp
index 19d0719..3b0f8a2 100644
--- a/src/incomingcallview.cpp
+++ b/src/incomingcallview.cpp
@@ -121,12 +121,16 @@
 {
     auto priv = INCOMING_CALL_VIEW_GET_PRIVATE(self);
     auto contactUri = priv->conversation_->participants[0];
-    auto contact = priv->accountContainer_->info.contactModel->getContact(contactUri);
-    // If the contact is pending, we should accept its request
-    if (contact.profileInfo.type == lrc::api::profile::Type::PENDING)
-        priv->accountContainer_->info.conversationModel->makePermanent(contactUri);
-    // Accept call
-    priv->accountContainer_->info.callModel->accept(priv->conversation_->callId);
+    try {
+        auto contact = priv->accountContainer_->info.contactModel->getContact(contactUri);
+        // If the contact is pending, we should accept its request
+        if (contact.profileInfo.type == lrc::api::profile::Type::PENDING)
+            priv->accountContainer_->info.conversationModel->makePermanent(contactUri);
+        // Accept call
+        priv->accountContainer_->info.callModel->accept(priv->conversation_->callId);
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
+    }
 }
 
 static void
@@ -217,15 +221,19 @@
     std::shared_ptr<GdkPixbuf> image = var_i.value<std::shared_ptr<GdkPixbuf>>();
     gtk_image_set_from_pixbuf(GTK_IMAGE(priv->image_incoming), image.get());
 
-    auto contactInfo = priv->accountContainer_->info.contactModel->getContact(priv->conversation_->participants.front());
+    try {
+        auto contactInfo = priv->accountContainer_->info.contactModel->getContact(priv->conversation_->participants.front());
 
-    auto name = contactInfo.profileInfo.alias;
-    gtk_label_set_text(GTK_LABEL(priv->label_name), name.c_str());
+        auto name = contactInfo.profileInfo.alias;
+        gtk_label_set_text(GTK_LABEL(priv->label_name), name.c_str());
 
-    auto bestId = contactInfo.registeredName;
-    if (name != bestId) {
-        gtk_label_set_text(GTK_LABEL(priv->label_bestId), bestId.c_str());
-        gtk_widget_show(priv->label_bestId);
+        auto bestId = contactInfo.registeredName;
+        if (name != bestId) {
+            gtk_label_set_text(GTK_LABEL(priv->label_bestId), bestId.c_str());
+            gtk_widget_show(priv->label_bestId);
+        }
+    } catch (const std::out_of_range&) {
+        // ContactModel::getContact() exception
     }
 }
 
diff --git a/src/native/pixbufmanipulator.cpp b/src/native/pixbufmanipulator.cpp
index 04c392e..6ab4561 100644
--- a/src/native/pixbufmanipulator.cpp
+++ b/src/native/pixbufmanipulator.cpp
@@ -269,27 +269,27 @@
                                      bool displayPresence)
 {
     auto contacts = conversationInfo.participants;
-    if (!contacts.empty())
-    {
-        // Get first contact photo
-        auto contactUri = contacts.front();
-        auto contactInfo = accountInfo.contactModel->getContact(contactUri);
-        auto contactPhoto = contactInfo.profileInfo.avatar;
-        auto bestName = contactInfo.profileInfo.alias.empty()? contactInfo.registeredName : contactInfo.profileInfo.alias;
-        auto unreadMessages = conversationInfo.unreadMessages;
-        if (contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY && contactInfo.profileInfo.uri.empty()) {
-            return QVariant::fromValue(scaleAndFrame(temporaryItemAvatar().get(), size, false, false, unreadMessages));
-        } else if (contactInfo.profileInfo.type == lrc::api::profile::Type::SIP) {
-            return QVariant::fromValue(scaleAndFrame(generateAvatar(bestName, "").get(), size, displayPresence, contactInfo.isPresent));
-        } else if (!contactPhoto.empty()) {
-            QByteArray byteArray(contactPhoto.c_str(), contactPhoto.length());
-            QVariant photo = personPhoto(byteArray);
-            return QVariant::fromValue(scaleAndFrame(photo.value<std::shared_ptr<GdkPixbuf>>().get(), size, displayPresence, contactInfo.isPresent, unreadMessages));
-        } else {
-            return QVariant::fromValue(scaleAndFrame(generateAvatar(bestName, contactInfo.profileInfo.uri).get(), size, displayPresence, contactInfo.isPresent, unreadMessages));
-        }
+    if (!contacts.empty()) {
+        try {
+            // Get first contact photo
+            auto contactUri = contacts.front();
+            auto contactInfo = accountInfo.contactModel->getContact(contactUri);
+            auto contactPhoto = contactInfo.profileInfo.avatar;
+            auto bestName = contactInfo.profileInfo.alias.empty()? contactInfo.registeredName : contactInfo.profileInfo.alias;
+            auto unreadMessages = conversationInfo.unreadMessages;
+            if (contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY && contactInfo.profileInfo.uri.empty()) {
+                return QVariant::fromValue(scaleAndFrame(temporaryItemAvatar().get(), size, false, false, unreadMessages));
+            } else if (contactInfo.profileInfo.type == lrc::api::profile::Type::SIP) {
+                return QVariant::fromValue(scaleAndFrame(generateAvatar(bestName, "").get(), size, displayPresence, contactInfo.isPresent));
+            } else if (!contactPhoto.empty()) {
+                QByteArray byteArray(contactPhoto.c_str(), contactPhoto.length());
+                QVariant photo = personPhoto(byteArray);
+                return QVariant::fromValue(scaleAndFrame(photo.value<std::shared_ptr<GdkPixbuf>>().get(), size, displayPresence, contactInfo.isPresent, unreadMessages));
+            } else {
+                return QVariant::fromValue(scaleAndFrame(generateAvatar(bestName, contactInfo.profileInfo.uri).get(), size, displayPresence, contactInfo.isPresent, unreadMessages));
+            }
+        } catch (...) {}
     }
-    // should not
     return QVariant::fromValue(scaleAndFrame(generateAvatar("", "").get(), size, displayPresence, false));
 
 }
