diff --git a/core/java/android/app/ISearchManager.aidl b/core/java/android/app/ISearchManager.aidl
index 6c3617a..39eb4f1 100644
--- a/core/java/android/app/ISearchManager.aidl
+++ b/core/java/android/app/ISearchManager.aidl
@@ -22,4 +22,5 @@
 /** @hide */
 interface ISearchManager {
    SearchableInfo getSearchableInfo(in ComponentName launchActivity, boolean globalSearch);
+   List<SearchableInfo> getSearchablesInGlobalSearch();
 }
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index d7ef103..4fb17c7 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -17,6 +17,7 @@
 package android.app;
 
 import static android.app.SuggestionsAdapter.getColumnString;
+
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -25,8 +26,8 @@
 import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.database.Cursor;
@@ -44,7 +45,6 @@
 import android.util.Log;
 import android.view.Gravity;
 import android.view.KeyEvent;
-import android.view.Menu;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewConfiguration;
@@ -53,14 +53,14 @@
 import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemSelectedListener;
 import android.widget.AutoCompleteTextView;
 import android.widget.Button;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TextView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemSelectedListener;
 
 import java.util.ArrayList;
 import java.util.WeakHashMap;
@@ -602,44 +602,6 @@
         mVoiceButton.setVisibility(visibility);
     }
     
-    /*
-     * Menu.
-     */
-    
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        // Show search settings menu item if anyone handles the intent for it
-        Intent settingsIntent = new Intent(SearchManager.INTENT_ACTION_SEARCH_SETTINGS);
-        PackageManager pm = getContext().getPackageManager();
-        ActivityInfo activityInfo = settingsIntent.resolveActivityInfo(pm, 0);
-        if (activityInfo != null) {
-            settingsIntent.setClassName(activityInfo.applicationInfo.packageName,
-                    activityInfo.name);
-            String label = getActivityLabel(activityInfo);
-            menu.add(Menu.NONE, Menu.NONE, Menu.NONE, label)
-                    .setIcon(android.R.drawable.ic_menu_preferences)
-                    .setAlphabeticShortcut('P')
-                    .setIntent(settingsIntent);
-            return true;
-        }
-        return super.onCreateOptionsMenu(menu);
-    }
-    
-    // TODO: shouldn't this be in PackageManager?
-    private String getActivityLabel(ActivityInfo activityInfo) {
-        PackageManager pm = getContext().getPackageManager();
-        try {
-            int labelRes = activityInfo.labelRes;
-            if (labelRes == 0) {
-                return null;
-            }
-            Resources r = pm.getResourcesForApplication(activityInfo.applicationInfo);
-            return r.getString(labelRes);
-        } catch (NameNotFoundException ex) {
-            return null;
-        }
-    }
-    
     /**
      * Listeners of various types
      */
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 76d780a..39f3bcd1 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -30,6 +30,8 @@
 import android.server.search.SearchableInfo;
 import android.view.KeyEvent;
 
+import java.util.List;
+
 /**
  * This class provides access to the system search services.
  * 
@@ -1655,4 +1657,20 @@
         return context.getContentResolver().query(uri, null, selection, selArgs, null);
     }
      
+    /**
+     * Returns a list of the searchable activities that can be included in global search.
+     * 
+     * @return a list containing searchable information for all searchable activities
+     *         that have the <code>exported</code> attribute set in their searchable
+     *         meta-data.
+     * 
+     * @hide because SearchableInfo is not part of the API.
+     */
+    public static List<SearchableInfo> getSearchablesInGlobalSearch() {
+        try {
+            return sService.getSearchablesInGlobalSearch();
+        } catch (RemoteException e) {
+            return null;
+        }
+    }
 }
diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
index 519a81c..ab7c827 100644
--- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java
+++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
@@ -486,12 +486,20 @@
                     String userColumn = projectionIn[i];
                     String column = mProjectionMap.get(userColumn);
 
-                    if (column == null) {
-                        throw new IllegalArgumentException(
-                                    "Invalid column " + projectionIn[i]);
-                    } else {
+                    if (column != null) {
                         projection[i] = column;
+                        continue;
                     }
+
+                    if (userColumn.contains(" AS ")
+                            || userColumn.contains(" as ")) {
+                        /* A column alias already exist */
+                        projection[i] = userColumn;
+                        continue;
+                    }
+
+                    throw new IllegalArgumentException("Invalid column "
+                            + projectionIn[i]);
                 }
                 return projection;
             } else {
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index f180823..03623d6 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -24,6 +24,8 @@
 import android.content.IntentFilter;
 import android.os.Handler;
 
+import java.util.List;
+
 /**
  * This is a simplified version of the Search Manager service.  It no longer handles
  * presentation (UI).  Its function is to maintain the map & list of "searchable" 
@@ -143,5 +145,12 @@
 
         return si;
     }
+    
+    /**
+     * Returns a list of the searchable activities that can be included in global search.
+     */
+    public List<SearchableInfo> getSearchablesInGlobalSearch() {
+        return mSearchables.getSearchablesInGlobalSearchList();
+    }
 
 }
diff --git a/core/java/android/server/search/SearchableInfo.java b/core/java/android/server/search/SearchableInfo.java
index a4a7827..aad7ae2 100644
--- a/core/java/android/server/search/SearchableInfo.java
+++ b/core/java/android/server/search/SearchableInfo.java
@@ -66,6 +66,7 @@
     private int mSearchButtonText = 0;
     private int mSearchInputType = 0;
     private int mSearchImeOptions = 0;
+    private boolean mIncludeInGlobalSearch = false;
     private String mSuggestAuthority = null;
     private String mSuggestPath = null;
     private String mSuggestSelection = null;
@@ -236,6 +237,8 @@
                 InputType.TYPE_TEXT_VARIATION_NORMAL);
         mSearchImeOptions = a.getInt(com.android.internal.R.styleable.Searchable_imeOptions, 
                 EditorInfo.IME_ACTION_SEARCH);
+        mIncludeInGlobalSearch = a.getBoolean(
+                com.android.internal.R.styleable.Searchable_includeInGlobalSearch, false);
 
         setSearchModeFlags();
         if (DBG_INHIBIT_SUGGESTIONS == 0) {
@@ -576,6 +579,16 @@
     }
     
     /**
+     * Checks whether the searchable is exported.
+     *
+     * @return The value of the <code>exported</code> attribute,
+     *         or <code>false</code> if the attribute is not set.
+     */
+    public boolean shouldIncludeInGlobalSearch() {
+        return mIncludeInGlobalSearch;
+    }
+
+    /**
      * Support for parcelable and aidl operations.
      */
     public static final Parcelable.Creator<SearchableInfo> CREATOR
@@ -606,6 +619,7 @@
         mSearchButtonText = in.readInt();
         mSearchInputType = in.readInt();
         mSearchImeOptions = in.readInt();
+        mIncludeInGlobalSearch = in.readInt() != 0;
         setSearchModeFlags();
 
         mSuggestAuthority = in.readString();
@@ -644,6 +658,7 @@
         dest.writeInt(mSearchButtonText);
         dest.writeInt(mSearchInputType);
         dest.writeInt(mSearchImeOptions);
+        dest.writeInt(mIncludeInGlobalSearch ? 1 : 0);
         
         dest.writeString(mSuggestAuthority);
         dest.writeString(mSuggestPath);
diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java
index e338bd2..40d7449 100644
--- a/core/java/android/server/search/Searchables.java
+++ b/core/java/android/server/search/Searchables.java
@@ -44,6 +44,7 @@
     
     private HashMap<ComponentName, SearchableInfo> mSearchablesMap = null;
     private ArrayList<SearchableInfo> mSearchablesList = null;
+    private ArrayList<SearchableInfo> mSearchablesInGlobalSearchList = null;
     private SearchableInfo mDefaultSearchable = null;
     
     /**
@@ -189,6 +190,8 @@
                                 = new HashMap<ComponentName, SearchableInfo>();
         ArrayList<SearchableInfo> newSearchablesList
                                 = new ArrayList<SearchableInfo>();
+        ArrayList<SearchableInfo> newSearchablesInGlobalSearchList
+                                = new ArrayList<SearchableInfo>();
 
         final PackageManager pm = mContext.getPackageManager();
         
@@ -208,6 +211,9 @@
                 if (searchable != null) {
                     newSearchablesList.add(searchable);
                     newSearchablesMap.put(searchable.mSearchActivity, searchable);
+                    if (searchable.shouldIncludeInGlobalSearch()) {
+                        newSearchablesInGlobalSearchList.add(searchable);
+                    }
                 }
             }
         }
@@ -219,8 +225,9 @@
 
         // Store a consistent set of new values
         synchronized (this) {
-            mSearchablesList = newSearchablesList;
             mSearchablesMap = newSearchablesMap;
+            mSearchablesList = newSearchablesList;
+            mSearchablesInGlobalSearchList = newSearchablesInGlobalSearchList;
             mDefaultSearchable = newDefaultSearchable;
         }
     }
@@ -232,4 +239,11 @@
         ArrayList<SearchableInfo> result = new ArrayList<SearchableInfo>(mSearchablesList);
         return result;
     }
+    
+    /**
+     * Returns a list of the searchable activities that can be included in global search.
+     */
+    public synchronized ArrayList<SearchableInfo> getSearchablesInGlobalSearchList() {
+        return new ArrayList<SearchableInfo>(mSearchablesInGlobalSearchList);
+    }
 }
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 922dd32..8195dcb 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2785,6 +2785,11 @@
              search suggestions. The default value is 0. <i>Optional attribute.</i> -->
         <attr name="searchSuggestThreshold" format="integer" />
         
+        <!-- If provided and <code>true</code>, this searchable activity will be
+             included in any global lists of search targets.
+             The default value is <code>false</code>. <i>Optional attribute.</i>. -->
+        <attr name="includeInGlobalSearch" format="boolean" />
+        
     </declare-styleable>
 
     <!-- In order to process special action keys during search, you must define them using
diff --git a/data/fonts/DroidSans.ttf b/data/fonts/DroidSans.ttf
index 2537cc3..767c63a 100644
--- a/data/fonts/DroidSans.ttf
+++ b/data/fonts/DroidSans.ttf
Binary files differ
diff --git a/media/libmediaplayerservice/VorbisPlayer.cpp b/media/libmediaplayerservice/VorbisPlayer.cpp
index 0ad335f..14fd6ce 100644
--- a/media/libmediaplayerservice/VorbisPlayer.cpp
+++ b/media/libmediaplayerservice/VorbisPlayer.cpp
@@ -67,7 +67,7 @@
     LOGV("onFirstRef");
     // create playback thread
     Mutex::Autolock l(mMutex);
-    createThreadEtc(renderThread, this, "vorbis decoder");
+    createThreadEtc(renderThread, this, "vorbis decoder", ANDROID_PRIORITY_AUDIO);
     mCondition.wait(mMutex);
     if (mRenderTid > 0) {
         LOGV("render thread(%d) started", mRenderTid);
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
index d2eb7e7..743c979 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
@@ -140,35 +140,38 @@
      *  getIcon works
 
      */
-    public void testSearchableMocked() {
+    public void testSearchablesListReal() {
         MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager());
         MyMockContext mockContext = new MyMockContext(mContext, mockPM);
-        Searchables searchables;
-        ArrayList<SearchableInfo> searchablesList;
-        int count;
 
-            
         // build item list with real-world source data
         mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_PASSTHROUGH);
-        searchables = new Searchables(mockContext);
+        Searchables searchables = new Searchables(mockContext);
         searchables.buildSearchableList();
         // tests with "real" searchables (deprecate, this should be a unit test)
-        searchablesList = searchables.getSearchablesList();
-        count = searchablesList.size();
+        ArrayList<SearchableInfo> searchablesList = searchables.getSearchablesList();
+        int count = searchablesList.size();
         assertTrue(count >= 1);         // this isn't really a unit test
         checkSearchables(searchablesList);
+        ArrayList<SearchableInfo> global = searchables.getSearchablesInGlobalSearchList();
+        checkSearchables(global);
+    }
 
-        // build item list with mocked search data
-        // this round of tests confirms good operations with "zero" searchables found
-        // This should return either a null pointer or an empty list
+    /**
+     * This round of tests confirms good operations with "zero" searchables found
+     */
+    public void testSearchablesListEmpty() {
+        MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager());
+        MyMockContext mockContext = new MyMockContext(mContext, mockPM);
+
         mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_MOCK_ZERO);
-        searchables = new Searchables(mockContext);
+        Searchables searchables = new Searchables(mockContext);
         searchables.buildSearchableList();
-        searchablesList = searchables.getSearchablesList();
-        if (searchablesList != null) {
-            count = searchablesList.size();
-            assertTrue(count == 0);
-        }
+        ArrayList<SearchableInfo> searchablesList = searchables.getSearchablesList();
+        assertNotNull(searchablesList);
+        MoreAsserts.assertEmpty(searchablesList);
+        ArrayList<SearchableInfo> global = searchables.getSearchablesInGlobalSearchList();
+        MoreAsserts.assertEmpty(global);
     }
     
     /**
