diff --git a/res/drawable/placeholder_google.png b/res/drawable/placeholder_google.png
new file mode 100644
index 0000000..bc72d34
--- /dev/null
+++ b/res/drawable/placeholder_google.png
Binary files differ
diff --git a/src/com/android/launcher/Search.java b/src/com/android/launcher/Search.java
index 96c0022..a0402a9 100644
--- a/src/com/android/launcher/Search.java
+++ b/src/com/android/launcher/Search.java
@@ -16,13 +16,20 @@
 
 package com.android.launcher;
 
+import android.app.SearchManager;
 import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.server.search.SearchableInfo;
+import android.server.search.Searchables;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -68,6 +75,10 @@
 
     // For voice searching
     private Intent mVoiceSearchIntent;
+    
+    private Drawable mGooglePlaceholder;
+    
+    private SearchManager mSearchManager;
 
     /**
      * Used to inflate the Workspace from XML.
@@ -129,6 +140,8 @@
         mVoiceSearchIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH);
         mVoiceSearchIntent.putExtra(android.speech.RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                 android.speech.RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
+        
+        mSearchManager = (SearchManager) getContext().getSystemService(Context.SEARCH_SERVICE);
     }
 
     /**
@@ -293,6 +306,10 @@
 
         mSearchText = (TextView) findViewById(R.id.search_src_text);
         mVoiceButton = (ImageButton) findViewById(R.id.search_voice_btn);
+        
+        mGooglePlaceholder = getContext().getResources().getDrawable(R.drawable.placeholder_google);
+        mContext.registerReceiver(mBroadcastReceiver,
+                new IntentFilter(SearchManager.INTENT_ACTION_SEARCH_SETTINGS_CHANGED));
 
         mSearchText.setOnKeyListener(this);
 
@@ -304,6 +321,13 @@
         mVoiceButton.setOnLongClickListener(this);
 
         configureVoiceSearchButton();
+        setUpTextField();
+    }
+    
+    @Override
+    public void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        if (mBroadcastReceiver != null) getContext().unregisterReceiver(mBroadcastReceiver);
     }
 
     /**
@@ -323,6 +347,28 @@
         // finally, set visible state of voice search button, as appropriate
         mVoiceButton.setVisibility(voiceSearchVisible ? View.VISIBLE : View.GONE);
     }
+    
+    /**
+     * Sets up the look of the text field. If Google is the chosen search provider, includes
+     * a Google logo as placeholder.
+     */
+    private void setUpTextField() {
+        boolean showGooglePlaceholder = false;
+        SearchableInfo webSearchSearchable = mSearchManager.getDefaultSearchableForWebSearch();
+        if (webSearchSearchable != null) {
+            ComponentName webSearchComponent = webSearchSearchable.getSearchActivity();
+            if (webSearchComponent != null) {
+                String componentString = webSearchComponent.flattenToShortString();
+                if (Searchables.ENHANCED_GOOGLE_SEARCH_COMPONENT_NAME.equals(componentString) ||
+                        Searchables.GOOGLE_SEARCH_COMPONENT_NAME.equals(componentString)) {
+                    showGooglePlaceholder = true;
+                }
+            }
+        }
+        
+        mSearchText.setCompoundDrawablesWithIntrinsicBounds(
+                showGooglePlaceholder ? mGooglePlaceholder : null, null, null, null);
+    }
 
     /**
      * Sets the {@link Launcher} that this gadget will call on to display the search dialog. 
@@ -330,6 +376,17 @@
     public void setLauncher(Launcher launcher) {
         mLauncher = launcher;
     }
+        
+    // Broadcast receiver for web search provider change notifications
+    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (SearchManager.INTENT_ACTION_SEARCH_SETTINGS_CHANGED.equals(action)) {
+                setUpTextField();
+            }
+        }
+    };
 
     /** 
      * Moves the view to the top left corner of its parent.
