=== modified file 'src/qml/ContactSearchList.qml'
--- src/qml/ContactSearchList.qml	2015-11-03 13:16:43 +0000
+++ src/qml/ContactSearchList.qml	2016-02-19 14:04:44 +0000
@@ -73,6 +73,7 @@
             right: parent.right
             margins: units.gu(2)
         }
+        property int itemIndex: index
         height: phoneRepeater.count * units.gu(6)
         Column {
             anchors.fill: parent
@@ -83,12 +84,14 @@
 
                 model: contact.phoneNumbers.length
 
-                delegate: MouseArea {
+                delegate: ListItem.Empty {
                     anchors {
                         left: parent.left
                         right: parent.right
                     }
                     height: units.gu(5)
+                    showDivider: false
+                    selected: itemIndex == currentIndex
 
                     onClicked: root.phonePicked(contact.phoneNumbers[index].number)
 

=== modified file 'src/qml/MainPage.qml'
--- src/qml/MainPage.qml	2016-02-12 13:15:42 +0000
+++ src/qml/MainPage.qml	2016-02-19 14:04:44 +0000
@@ -50,15 +50,21 @@
         }
         inputMethodHints: Qt.ImhNoPredictiveText
         placeholderText: i18n.tr("Search...")
-        onActiveFocusChanged: {
+        /*onActiveFocusChanged: {
             if (!activeFocus) {
                 searchField.text = ""
                 mainPage.searching = false
             }
+        }*/
+        KeyNavigation.down: threadList
+
+        Binding {
+            target: threadModel
+            property: "searchTerm"
+            value: searchField.text
         }
     }
 
-    flickable: pageHeader.flickable
     header: PageHeader {
         id: pageHeader
 
@@ -76,6 +82,8 @@
         }
     }
 
+    flickable: pageHeader.flickable
+
     states: [
         State {
             id: defaultState
@@ -86,6 +94,7 @@
                 Action {
                     objectName: "searchAction"
                     iconName: "search"
+                    shortcut: "Ctrl+f"
                     onTriggered: {
                         mainPage.searching = true
                         searchField.forceActiveFocus()
@@ -104,6 +113,7 @@
                     objectName: "newMessageAction"
                     text: i18n.tr("New message")
                     iconName: "add"
+                    shortcut: "Ctrl+n"
                     visible: dualPanel
                     onTriggered: mainView.bottomEdge.commit()
                 }
@@ -127,6 +137,7 @@
                     visible: mainPage.searching
                     iconName: "back"
                     text: i18n.tr("Cancel")
+                    shortcut: searching ? "Esc" : undefined
                     onTriggered: {
                         searchField.text = ""
                         mainPage.searching = false
@@ -207,6 +218,7 @@
                 anchors.bottom: parent.bottom
             }
         }
+
     }
 
     MultipleSelectionListView {
@@ -257,7 +269,6 @@
                 }
             }
 
-            searchTerm: mainPage.searching ? searchField.text : ""
             onItemClicked: {
                 if (threadList.isInSelectionMode) {
                     if (!threadList.selectItem(threadDelegate)) {

=== modified file 'src/qml/Messages.qml'
--- src/qml/Messages.qml	2016-02-12 19:08:40 +0000
+++ src/qml/Messages.qml	2016-02-19 14:04:44 +0000
@@ -441,7 +441,7 @@
                 name: "cancel"
                 text: i18n.tr("Cancel")
                 iconName: "down"
-                shortcut: "Esc"
+                shortcut: startedFromBottomEdge && !mainPage.searching ? "Esc" : undefined
                 onTriggered: {
                     messages.cancel()
                 }
@@ -541,6 +541,7 @@
                 Action {
                     objectName: "selectionModeCancelAction"
                     iconName: "back"
+                    shortcut: selectionMode ? "Esc" : undefined
                     onTriggered: messageList.cancelSelection()
                 }
             ]
@@ -652,6 +653,7 @@
                 id: multiRecipient
                 objectName: "multiRecipient"
                 enabled: visible
+                KeyNavigation.down: searchListLoader.item
                 anchors {
                     left: parent ? parent.left : undefined
                     right: parent ? parent.right : undefined
@@ -951,7 +953,7 @@
 
         property int resultCount: (status === Loader.Ready) ? item.count : 0
 
-        source: (multiRecipient.searchString !== "") && multiRecipient.focus ?
+        source: (multiRecipient.searchString !== "") /*&& multiRecipient.focus*/ ?
                 Qt.resolvedUrl("ContactSearchList.qml") : ""
         clip: true
         visible: source != ""

=== modified file 'src/qml/MultiRecipientInput.qml'
--- src/qml/MultiRecipientInput.qml	2015-11-03 13:16:43 +0000
+++ src/qml/MultiRecipientInput.qml	2016-02-19 14:04:44 +0000
@@ -167,10 +167,10 @@
                     font.pixelSize: FontUtils.sizeToPixels("medium")
                     inputMethodHints: Qt.ImhNoPredictiveText
                     onActiveFocusChanged: {
-                        if (!activeFocus && text !== "") {
-                            addRecipient(text)
-                            text = ""
-                        }
+                        //if (!activeFocus && text !== "") {
+                        //    addRecipient(text)
+                        //    text = ""
+                        //}
                     }
                     onTextChanged: {
                         if (text.substring(text.length -1, text.length) == ",") {

=== modified file 'src/qml/ThreadDelegate.qml'
--- src/qml/ThreadDelegate.qml	2016-01-11 19:11:14 +0000
+++ src/qml/ThreadDelegate.qml	2016-02-19 14:04:44 +0000
@@ -22,7 +22,6 @@
 import Ubuntu.Telephony 0.1
 import Ubuntu.Contacts 0.1
 import QtContacts 5.0
-import Ubuntu.History 0.1
 import "dateUtils.js" as DateUtils
 
 ListItemWithActions {
@@ -30,7 +29,6 @@
 
     property var participant: participants ? participants[0] : {}
     property bool groupChat: participants.length > 1
-    property string searchTerm
     property string phoneNumber: delegateHelper.phoneNumber
     property bool unknownContact: delegateHelper.isUnknown
     property string threadId: model.threadId
@@ -106,12 +104,6 @@
         }
     }
 
-    Component.onCompleted: {
-        if (searchTerm !== "") {
-            delegateHelper.updateSearch()
-        }
-    }
-
     ContactAvatar {
         id: avatar
 
@@ -262,83 +254,6 @@
         property alias presenceAccountId: presenceRequest.accountId
         property alias presenceType: presenceRequest.type
         property alias presenceItem: presenceRequest
-        property string latestFilter: ""
-        property var searchHistoryFilter
-        property var searchHistoryFilterString: 'import Ubuntu.History 0.1; 
-            HistoryUnionFilter { 
-                %1 
-            }'
-        property var searchIntersectionFilter: 'HistoryIntersectionFilter {
-            HistoryFilter { filterProperty: "accountId"; filterValue: \'%1\' }
-            HistoryFilter { filterProperty: "threadId"; filterValue: \'%2\' }
-            HistoryFilter { filterProperty: "message"; filterValue: searchTerm; matchFlags: HistoryFilter.MatchContains }
-        }
-        '
-
-        function updateSearch() {
-            var found = false
-            var searchTermLowerCase = searchTerm.toLowerCase()
-            if (searchTerm !== "") {
-                if ((delegateHelper.phoneNumber.toLowerCase().search(searchTermLowerCase) !== -1)
-                || (!unknownContact && delegateHelper.alias.toLowerCase().search(searchTermLowerCase) !== -1)) {
-                    found = true
-                } else {
-                    var componentFilters = ""
-                    for(var i in model.threads) {
-                        componentFilters += searchIntersectionFilter.arg(model.threads[i].accountId).arg(model.threads[i].threadId)
-                    }
-                    var finalString = searchHistoryFilterString.arg(componentFilters)
-                    if (finalString !== latestFilter) {
-                        delegateHelper.searchHistoryFilter = Qt.createQmlObject(finalString, searchEventModelLoader)
-                        latestFilter = finalString
-                    }
- 
-                    searchEventModelLoader.active = true
-                }
-            } else {
-                delegate.displayedEvent = null
-                searchEventModelLoader.active = false
-                found = true
-            }
-
-            delegate.height = found ? units.gu(8) : 0
-        }
-
-        // WORKAROUND: history-service can't filter by contact names
-        Connections {
-            target: delegate
-            onSearchTermChanged: {
-                delegateHelper.updateSearch()
-            }
-        }
-
-        Loader {
-            id: searchEventModelLoader
-            active: false
-            asynchronous: true
-            sourceComponent: searchEventModelComponent
-        }
-
-        Component {
-            id: searchEventModelComponent
-            HistoryEventModel {
-                id: eventModel
-                type: HistoryThreadModel.EventTypeText
-                filter: delegateHelper.searchHistoryFilter
-                onCountChanged: {
-                    if (count > 0) {
-                        delegate.height = units.gu(8)
-                        delegate.displayedEvent = eventModel.get(0)
-                    } else if (searchTerm == "") {
-                        delegate.height = units.gu(8)
-                        delegate.displayedEvent = null
-                    } else {
-                        delegate.displayedEvent = null
-                        delegate.height = 0
-                    }
-                }
-            }
-        }
 
         // FIXME: there is another instance of PresenceRequest in Messages.qml,
         // we have to reuse the same instance when possible

