diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index 7cfcc6b..626283a 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -60,10 +60,6 @@
     private static final String COMBINED_SELECTION =
             "(url LIKE ? OR url LIKE ? OR url LIKE ? OR url LIKE ? OR title LIKE ?)";
 
-    // Regular expression which matches http://, followed by some stuff, followed by
-    // optionally a trailing slash, all matched as separate groups.
-    private static final Pattern STRIP_URL_PATTERN = Pattern.compile("^(http://)(.*?)(/$)?");
-
     Context mContext;
     Filter mFilter;
     SuggestionResults mResults;
@@ -475,7 +471,7 @@
          */
         private String getTitle(String title, String url) {
             if (TextUtils.isEmpty(title) || TextUtils.getTrimmedLength(title) == 0) {
-                title = stripUrl(url);
+                title = UrlUtils.stripUrl(url);
             }
             return title;
         }
@@ -493,31 +489,9 @@
                     || title.equals(url)) {
                 return null;
             } else {
-                return stripUrl(url);
+                return UrlUtils.stripUrl(url);
             }
         }
-
-        /**
-         * Strips the provided url of preceding "http://" and any trailing "/". Does not
-         * strip "https://". If the provided string cannot be stripped, the original string
-         * is returned.
-         *
-         * TODO: Put this in TextUtils to be used by other packages doing something similar.
-         *
-         * @param url a url to strip, like "http://www.google.com/"
-         * @return a stripped url like "www.google.com", or the original string if it could
-         *         not be stripped
-         */
-        private String stripUrl(String url) {
-            if (url == null) return null;
-            Matcher m = STRIP_URL_PATTERN.matcher(url);
-            if (m.matches() && m.groupCount() == 3) {
-                return m.group(2);
-            } else {
-                return url;
-            }
-        }
-
     }
 
     class SearchesCursor extends CursorSource {
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 910f753..2436e84 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -510,7 +510,7 @@
                 mActivity.onPageStarted(view, url, favicon);
             }
             if (getTabChangeListener() != null) {
-                getTabChangeListener().onPageStarted(Tab.this, favicon);
+                getTabChangeListener().onPageStarted(Tab.this, url, favicon);
             }
         }
 
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 26b72f7..a939639 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -67,8 +67,10 @@
     private boolean mUserRequestedUrlbar;
     private boolean mTitleVisible;
     private boolean mShowUrlMode;
+    private boolean mHasReceivedTitle;
 
     private Drawable mGenericFavicon;
+    private String mLoadingText;
 
     public TabBar(BrowserActivity context, TabControl tabcontrol, TitleBarXLarge titlebar) {
         super(context);
@@ -89,6 +91,7 @@
         mNewTab = (ImageButton) findViewById(R.id.newtab);
         mNewTab.setOnClickListener(this);
         mGenericFavicon = res.getDrawable(R.drawable.app_web_browser_sm);
+        mLoadingText = res.getString(R.string.title_bar_loading);
 
         // TODO: Change enabled states based on whether you can go
         // back/forward.  Probably should be done inside onPageStarted.
@@ -355,7 +358,7 @@
                 if (title != null) {
                     mTabView.setDisplayTitle(title);
                 } else if (url != null) {
-                    mTabView.setDisplayTitle(url);
+                    mTabView.setDisplayTitle(UrlUtils.stripUrl(url));
                 }
             }
         }
@@ -437,6 +440,7 @@
 
     @Override
     public void onUrlAndTitle(Tab tab, String url, String title) {
+        mHasReceivedTitle = true;
         TabViewData tvd = mTabMap.get(tab);
         if (tvd != null) {
             tvd.setUrlAndTitle(url, title);
@@ -445,13 +449,21 @@
 
     @Override
     public void onPageFinished(Tab tab) {
+        if (!mHasReceivedTitle) {
+            TabViewData tvd = mTabMap.get(tab);
+            if (tvd != null) {
+                tvd.setUrlAndTitle(tvd.mUrl, null);
+            }
+        }
     }
 
     @Override
-    public void onPageStarted(Tab tab, Bitmap favicon) {
+    public void onPageStarted(Tab tab, String url, Bitmap favicon) {
+        mHasReceivedTitle = false;
         TabViewData tvd = mTabMap.get(tab);
         if (tvd != null) {
             tvd.setFavicon(favicon);
+            tvd.setUrlAndTitle(url, mLoadingText);
         }
     }
 
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 55bfb48..fcccad1 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -695,7 +695,7 @@
 
         public void onFavicon(Tab tab, Bitmap favicon);
 
-        public void onPageStarted(Tab tab, Bitmap favicon);
+        public void onPageStarted(Tab tab, String url, Bitmap favicon);
 
         public void onPageFinished(Tab tab);
 
diff --git a/src/com/android/browser/UrlUtils.java b/src/com/android/browser/UrlUtils.java
new file mode 100644
index 0000000..cb6377a
--- /dev/null
+++ b/src/com/android/browser/UrlUtils.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.browser;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class UrlUtils {
+
+    // Regular expression which matches http://, followed by some stuff, followed by
+    // optionally a trailing slash, all matched as separate groups.
+    private static final Pattern STRIP_URL_PATTERN = Pattern.compile("^(http://)(.*?)(/$)?");
+
+    private UrlUtils() { /* cannot be instantiated */ }
+
+    /**
+     * Strips the provided url of preceding "http://" and any trailing "/". Does not
+     * strip "https://". If the provided string cannot be stripped, the original string
+     * is returned.
+     *
+     * TODO: Put this in TextUtils to be used by other packages doing something similar.
+     *
+     * @param url a url to strip, like "http://www.google.com/"
+     * @return a stripped url like "www.google.com", or the original string if it could
+     *         not be stripped
+     */
+    /* package */ static String stripUrl(String url) {
+        if (url == null) return null;
+        Matcher m = STRIP_URL_PATTERN.matcher(url);
+        if (m.matches() && m.groupCount() == 3) {
+            return m.group(2);
+        } else {
+            return url;
+        }
+    }
+}
