diff --git a/mobile/chrome/content/bindings.xml b/mobile/chrome/content/bindings.xml
index 214718aa8316..bdf9272e9d64 100644
--- a/mobile/chrome/content/bindings.xml
+++ b/mobile/chrome/content/bindings.xml
@@ -594,7 +594,10 @@
             this._isEditing = true;
             if (this.control) {
               this.setAttribute("selected", "true");
-              this.control.scrollBoxObject.ensureElementIsVisible(this);
+              let self = this;
+              setTimeout(function() {
+                self.control.scrollBoxObject.ensureElementIsVisible(self); 
+              }, 0);
               this.control.activeItem = this;
             }
 
@@ -867,7 +870,6 @@
 
       <field name="_type"/>
       <field name="_mode"/>
-      <field name="_activeItem">null</field>
       <field name="_ignoreEditing">false</field>
       <field name="_parents">
         document.getAnonymousElementByAttribute(this, "anonid", "parent-items");
@@ -893,6 +895,7 @@
         </getter>
       </property>
 
+      <field name="_activeItem">null</field>
       <property name="activeItem">
         <getter>
           <![CDATA[
@@ -1029,6 +1032,14 @@
         </body>
       </method>
 
+      <method name="close">
+        <body>
+          <![CDATA[
+            this.activeItem = null;
+          ]]>
+        </body>
+      </method>
+
       <method name="createItem">
         <parameter name="aItem"/>
         <body>
diff --git a/mobile/chrome/content/browser-ui.js b/mobile/chrome/content/browser-ui.js
index f942876ed6e8..3d614066cba6 100644
--- a/mobile/chrome/content/browser-ui.js
+++ b/mobile/chrome/content/browser-ui.js
@@ -598,6 +598,11 @@ var BrowserUI = {
     Browser.loadURI(submission.uri.spec, { postData: submission.postData });
   },
 
+  updateCurrentBrowser: function _updateCurrentBrowser() {
+    let state = (Elements.contentShowing.getAttribute("disabled") == "true") ? "Blur" : "Focus";
+    Browser.selectedBrowser.messageManager.sendAsyncMessage("Browser:" + state, {});
+  },
+
   updateStar: function() {
     if (PlacesUtils.getMostRecentBookmarkForURI(Browser.selectedBrowser.currentURI) != -1)
       this.starButton.setAttribute("starred", "true");
@@ -1634,6 +1639,7 @@ var FindHelperUI = {
 
   hide: function findHelperHide() {
     this._textbox.value = "";
+    this._textbox.blur();
     this._container.hide(this);
   },
 
diff --git a/mobile/chrome/content/browser.js b/mobile/chrome/content/browser.js
index 39b4b9683c59..9ab69699b880 100644
--- a/mobile/chrome/content/browser.js
+++ b/mobile/chrome/content/browser.js
@@ -280,9 +280,16 @@ var Browser = {
       getBrowser().style.display = "none";
       getBrowser().style.display = "block";
 
-      let curEl = document.activeElement;
-      if (curEl && curEl.id != "inputhandler-overlay" && curEl.scrollIntoView)
-        curEl.scrollIntoView(false);
+      // We want to keep the current focused element into view if possible
+      let currentElement = document.activeElement;
+      let [scrollbox, scrollInterface] = ScrollUtils.getScrollboxFromElement(currentElement);
+      if (currentElement && scrollbox && currentElement != scrollbox) {
+        // retrieve the direct child of the scrollbox
+        while (currentElement.parentNode != scrollbox)
+          currentElement = currentElement.parentNode;
+
+        setTimeout(function() { scrollInterface.ensureElementIsVisible(currentElement) }, 0);
+      }
     }
     window.addEventListener("resize", resizeHandler, false);
 
@@ -1690,6 +1697,8 @@ IdentityHandler.prototype = {
   },
 
   show: function ih_show() {
+    Elements.contentShowing.setAttribute("disabled", "true");
+
     // dismiss any dialog which hide the identity popup
     BrowserUI.activePanel = null;
     while (BrowserUI.activeDialog)
@@ -1709,6 +1718,8 @@ IdentityHandler.prototype = {
   },
 
   hide: function ih_hide() {
+    Elements.contentShowing.setAttribute("disabled", "false");
+
     this._identityPopup.hidden = true;
     this._identityBox.removeAttribute("open");
 
diff --git a/mobile/chrome/content/browser.xul b/mobile/chrome/content/browser.xul
index 74867db9301f..2266c711bdb9 100644
--- a/mobile/chrome/content/browser.xul
+++ b/mobile/chrome/content/browser.xul
@@ -100,7 +100,7 @@
   </broadcasterset>
 
   <observerset id="observerset">
-    <observes id="observe_contentShowing" element="bcast_contentShowing" attribute="disabled"/>
+    <observes id="observe_contentShowing" element="bcast_contentShowing" attribute="disabled" onbroadcast="BrowserUI.updateCurrentBrowser();"/>
   </observerset>
 
   <commandset id="mainCommandSet">
diff --git a/mobile/chrome/content/content.js b/mobile/chrome/content/content.js
index 47c873ec1106..6885d6558534 100644
--- a/mobile/chrome/content/content.js
+++ b/mobile/chrome/content/content.js
@@ -339,6 +339,7 @@ Content.prototype = {
 
     switch (aMessage.name) {
       case "Browser:Blur":
+        gFocusManager.clearFocus(content);
         docShell.isActive = false;
         this._selected = false;
         break;
diff --git a/mobile/chrome/content/input.js b/mobile/chrome/content/input.js
index fcdb4c3d6664..acbf84c39354 100644
--- a/mobile/chrome/content/input.js
+++ b/mobile/chrome/content/input.js
@@ -188,7 +188,7 @@ MouseModule.prototype = {
     // walk up the DOM tree in search of nearest scrollable ancestor.  nulls are
     // returned if none found.
     let [targetScrollbox, targetScrollInterface, dragger]
-      = this.getScrollboxFromElement(aEvent.target);
+      = ScrollUtils.getScrollboxFromElement(aEvent.target);
 
     // stop kinetic panning if targetScrollbox has changed
     if (this._kinetic.isActive() && this._dragger != dragger)
@@ -446,49 +446,17 @@ MouseModule.prototype = {
     this._downUpEvents.splice(0);
   },
 
-  /**
-   * The default dragger object used by MouseModule when dragging a scrollable
-   * element that provides no customDragger.  Simply performs the expected
-   * regular scrollBy calls on the scroller.
-   */
-  _defaultDragger: {
-    isDraggable: function isDraggable(target, scroller) {
-      let sX = {}, sY = {};
-      scroller.getScrolledSize(sX, sY);
-      let rect = target.getBoundingClientRect();
-      return { x: sX.value > rect.width, y: sY.value > rect.height };
-    },
-
-    dragStart: function dragStart(cx, cy, target, scroller) {},
-
-    dragStop : function dragStop(dx, dy, scroller) {
-      return this.dragMove(dx, dy, scroller);
-    },
-
-    dragMove : function dragMove(dx, dy, scroller) {
-      if (scroller.getPosition) {
-        try {
-
-          let oldX = {}, oldY = {};
-          scroller.getPosition(oldX, oldY);
-
-          scroller.scrollBy(dx, dy);
-
-          let newX = {}, newY = {};
-          scroller.getPosition(newX, newY);
-
-          return (newX.value != oldX.value) || (newY.value != oldY.value);
-
-        } catch (e) { /* we have no time for whiny scrollers! */ }
-      }
-
-      return false;
-    }
-  },
-
-  // -----------------------------------------------------------
-  // -- Utility functions
+  toString: function toString() {
+    return '[MouseModule] {'
+      + '\n\tdragData=' + this._dragData + ', '
+      + 'dragger=' + this._dragger + ', '
+      + '\n\tdownUpEvents=' + this._downUpEvents + ', '
+      + 'length=' + this._downUpEvents.length + ', '
+      + '\n\ttargetScroller=' + this._targetScrollInterface + '}';
+  }
+};
 
+var ScrollUtils = {
   /**
    * Walk up (parentward) the DOM tree from elem in search of a scrollable element.
    * Return the element and its scroll interface if one is found, two nulls otherwise.
@@ -530,14 +498,45 @@ MouseModule.prototype = {
     return [scrollbox, qinterface, (scrollbox ? (scrollbox.customDragger || this._defaultDragger) : null)];
   },
 
-  toString: function toString() {
-    return '[MouseModule] {'
-      + '\n\tdragData=' + this._dragData + ', '
-      + 'dragger=' + this._dragger + ', '
-      + '\n\tdownUpEvents=' + this._downUpEvents + ', '
-      + 'length=' + this._downUpEvents.length + ', '
-      + '\n\ttargetScroller=' + this._targetScrollInterface + '}';
-  }
+  /**
+   * The default dragger object used by MouseModule when dragging a scrollable
+   * element that provides no customDragger.  Simply performs the expected
+   * regular scrollBy calls on the scroller.
+   */
+  _defaultDragger: {
+    isDraggable: function isDraggable(target, scroller) {
+      let sX = {}, sY = {};
+      scroller.getScrolledSize(sX, sY);
+      let rect = target.getBoundingClientRect();
+      return { x: sX.value > rect.width, y: sY.value > rect.height };
+    },
+
+    dragStart: function dragStart(cx, cy, target, scroller) {},
+
+    dragStop : function dragStop(dx, dy, scroller) {
+      return this.dragMove(dx, dy, scroller);
+    },
+
+    dragMove : function dragMove(dx, dy, scroller) {
+      if (scroller.getPosition) {
+        try {
+
+          let oldX = {}, oldY = {};
+          scroller.getPosition(oldX, oldY);
+
+          scroller.scrollBy(dx, dy);
+
+          let newX = {}, newY = {};
+          scroller.getPosition(newX, newY);
+
+          return (newX.value != oldX.value) || (newY.value != oldY.value);
+
+        } catch (e) { /* we have no time for whiny scrollers! */ }
+      }
+
+      return false;
+    }
+  },
 };
 
 /**
diff --git a/mobile/themes/core/browser.css b/mobile/themes/core/browser.css
index 7b089ec1d132..716ec133af46 100644
--- a/mobile/themes/core/browser.css
+++ b/mobile/themes/core/browser.css
@@ -718,6 +718,7 @@ placeitem[ui="manage"] > .bookmark-manage > image {
 
 autocompleteresult,
 placeitem {
+  -moz-user-focus: ignore;
   color: black;
   background-color: white;
   padding: 2px 4px;
diff --git a/mobile/themes/core/platform.css b/mobile/themes/core/platform.css
index c2a9e7a808b0..0ba51146cb2f 100644
--- a/mobile/themes/core/platform.css
+++ b/mobile/themes/core/platform.css
@@ -58,6 +58,10 @@ label {
 }
 
 /* Override any OS inverse themes */
+richlistbox {
+  -moz-user-focus: ignore;
+}
+
 richlistbox,
 textbox {
   color: black;
@@ -533,6 +537,7 @@ richlistbox {
 }
 
 richlistitem {
+  -moz-user-focus: ignore;
   min-height: 70px; /* row size */
   padding: 5px;
   border-bottom: 1px solid rgb(207,207,207);