diff --git a/src/com/android/launcher/GesturesActivity.java b/src/com/android/launcher/GesturesActivity.java
index 844392d..24775ff 100644
--- a/src/com/android/launcher/GesturesActivity.java
+++ b/src/com/android/launcher/GesturesActivity.java
@@ -26,8 +26,11 @@
 import android.widget.AdapterView;
 import android.widget.Toast;
 import android.widget.EditText;
+import android.widget.BaseAdapter;
+import android.widget.CheckBox;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.view.View;
 import android.view.ViewGroup;
@@ -40,18 +43,22 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.BitmapDrawable;
 import android.text.TextUtils;
+import android.database.DataSetObserver;
 
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Collections;
 import java.util.Map;
 
-public class GesturesActivity extends ListActivity {
+public class GesturesActivity extends ListActivity implements AdapterView.OnItemClickListener {
     private static final int MENU_ID_RENAME = 1;
     private static final int MENU_ID_REMOVE = 2;
 
     private static final int DIALOG_RENAME_GESTURE = 1;
 
+    static final String PREFERENCES_NAME = "gestures";
+    static final String PREFERENCES_HOME_KEY = "gestures.home";
+    
     // Type: long (id)
     private static final String GESTURES_INFO_ID = "gestures.info_id";
 
@@ -66,6 +73,7 @@
     private Dialog mRenameDialog;
     private EditText mInput;
     private ApplicationInfo mCurrentRenameInfo;
+    private SharedPreferences mPreferences;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -74,13 +82,16 @@
         setContentView(R.layout.gestures_settings);
 
         mAdapter = new GesturesAdapter(this);
-        setListAdapter(mAdapter);
+        setListAdapter(new GesturesSettingsAdapter(mAdapter));
+        getListView().setOnItemClickListener(this);
 
         mStore = Launcher.getGestureLibrary();
         mEmpty = (TextView) findViewById(android.R.id.empty);
         mTask = (GesturesLoadTask) new GesturesLoadTask().execute();
 
         registerForContextMenu(getListView());
+
+        mPreferences = getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE);
     }
 
     @Override
@@ -127,10 +138,12 @@
         super.onCreateContextMenu(menu, v, menuInfo);
 
         AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
-        menu.setHeaderTitle(((TextView) info.targetView).getText());
+        if (info.position > 2) {
+            menu.setHeaderTitle(((TextView) info.targetView).getText());
 
-        menu.add(0, MENU_ID_RENAME, 0, R.string.gestures_rename);
-        menu.add(0, MENU_ID_REMOVE, 0, R.string.gestures_delete);
+            menu.add(0, MENU_ID_RENAME, 0, R.string.gestures_rename);
+            menu.add(0, MENU_ID_REMOVE, 0, R.string.gestures_delete);
+        }
     }
 
     @Override
@@ -252,6 +265,14 @@
         Toast.makeText(this, R.string.gestures_delete_success, Toast.LENGTH_SHORT).show();
     }
 
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        if (position == 1) {
+            final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
+            checkBox.toggle();
+            mPreferences.edit().putBoolean(PREFERENCES_HOME_KEY, checkBox.isChecked()).commit();
+        }
+    }
+
     private class GesturesLoadTask extends AsyncTask<Void, ApplicationInfo, Boolean> {
         private int mThumbnailSize;
         private int mThumbnailInset;
@@ -346,4 +367,121 @@
             return convertView;
         }
     }
+
+    private class GesturesSettingsAdapter extends BaseAdapter {
+        private static final int FIXED_CHILDREN_COUNT = 3;
+
+        private static final int VIEW_TYPE_SEPARATOR = 0;
+        private static final int VIEW_TYPE_CHECKBOX = 1;
+
+        private final GesturesAdapter mAdapter;
+        private final LayoutInflater mInflater;
+
+        public GesturesSettingsAdapter(GesturesAdapter adapter) {
+            mAdapter = adapter;
+            mInflater = adapter.mInflater;
+            adapter.registerDataSetObserver(new DataSetObserver() {
+                @Override
+                public void onChanged() {
+                    notifyDataSetChanged();
+                }
+
+                @Override
+                public void onInvalidated() {
+                    notifyDataSetInvalidated();
+                }
+            });
+        }
+
+        public int getCount() {
+            return FIXED_CHILDREN_COUNT + mAdapter.getCount();
+        }
+
+        public Object getItem(int position) {
+            if (position < FIXED_CHILDREN_COUNT) {
+                return String.valueOf(position);
+            }
+            return mAdapter.getItem(position - FIXED_CHILDREN_COUNT);
+        }
+
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public int getItemViewType(int position) {
+            if (position < FIXED_CHILDREN_COUNT) {
+                switch (position) {
+                    case 0:
+                    case 2:
+                        return VIEW_TYPE_SEPARATOR;
+                    case 1:
+                        return VIEW_TYPE_CHECKBOX;
+                }
+            }
+            return 2 + super.getItemViewType(position);
+        }
+
+        @Override
+        public int getViewTypeCount() {
+            return 2 + mAdapter.getViewTypeCount();
+        }
+
+        @Override
+        public boolean areAllItemsEnabled() {
+            return false;
+        }
+
+        @Override
+        public boolean isEnabled(int position) {
+            return position != 0 && position != 2;
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            if (position < FIXED_CHILDREN_COUNT) {
+                // NOTE: Don't bother with ViewHolders here, we only have 3 items and
+                //       the list is likely to not be very long
+                switch (position) {
+                    case 0:
+                        convertView = createHeader(convertView, parent,
+                                R.string.gestures_group_settings);
+                        break;
+                    case 1:
+                        convertView = createSetting(convertView, parent,
+                                R.string.gestures_preference_hotkey_title,
+                                R.string.gestures_preference_hotkey_summary);
+                        break;
+                    case 2:
+                        convertView = createHeader(convertView, parent,
+                                R.string.gestures_group_gestures);
+                        break;
+                }
+                return convertView;
+            }
+            return mAdapter.getView(position - FIXED_CHILDREN_COUNT, convertView, parent);
+        }
+
+        private View createSetting(View convertView, ViewGroup parent,
+                int title, int summary) {
+
+            if (convertView == null) {
+                convertView = mInflater.inflate(R.layout.list_checkbox_2lines, parent, false);
+            }
+
+            ((TextView) convertView.findViewById(R.id.title)).setText(title);
+            ((TextView) convertView.findViewById(R.id.summary)).setText(summary);
+            ((CheckBox) convertView.findViewById(R.id.checkbox)).setChecked(
+                    mPreferences.getBoolean(PREFERENCES_HOME_KEY, false));
+
+            return convertView;
+        }
+
+        private View createHeader(View convertView, ViewGroup parent, int text) {
+            if (convertView == null) {
+                convertView = mInflater.inflate(R.layout.list_category, parent, false);
+            }
+            ((TextView) convertView).setText(text);
+            return convertView;
+        }
+    }
 }
diff --git a/src/com/android/launcher/GesturesPanel.java b/src/com/android/launcher/GesturesPanel.java
index 33dc102..2d8647d 100644
--- a/src/com/android/launcher/GesturesPanel.java
+++ b/src/com/android/launcher/GesturesPanel.java
@@ -16,12 +16,12 @@
 
 package com.android.launcher;
 
-import android.widget.RelativeLayout;
+import android.widget.LinearLayout;
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 
-public class GesturesPanel extends RelativeLayout {
+public class GesturesPanel extends LinearLayout {
     public GesturesPanel(Context context) {
         super(context);
     }
@@ -37,7 +37,26 @@
 
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
-        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK &&
+        final int keyCode = event.getKeyCode();
+        
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_VOLUME_UP:
+            case KeyEvent.KEYCODE_VOLUME_DOWN:
+            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+            case KeyEvent.KEYCODE_MUTE:
+            case KeyEvent.KEYCODE_HEADSETHOOK:
+            case KeyEvent.KEYCODE_MEDIA_STOP:
+            case KeyEvent.KEYCODE_MEDIA_NEXT:
+            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+            case KeyEvent.KEYCODE_MEDIA_REWIND:
+            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+            case KeyEvent.KEYCODE_CAMERA:
+            case KeyEvent.KEYCODE_CALL:
+            case KeyEvent.KEYCODE_SEARCH:
+                return ((Launcher) mContext).getWorkspace().getRootView().dispatchKeyEvent(event);
+        }
+        
+        if (keyCode == KeyEvent.KEYCODE_BACK &&
                 event.getAction() == KeyEvent.ACTION_DOWN) {
 
             ((Launcher) mContext).hideGesturesPanel();
diff --git a/src/com/android/launcher/Launcher.java b/src/com/android/launcher/Launcher.java
index 000ce14..21b6949 100644
--- a/src/com/android/launcher/Launcher.java
+++ b/src/com/android/launcher/Launcher.java
@@ -32,6 +32,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.content.Intent.ShortcutIconResource;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
@@ -79,7 +80,7 @@
 import android.widget.Toast;
 import android.widget.ImageView;
 import android.widget.PopupWindow;
-import android.widget.ViewSwitcher;
+import android.widget.Button;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
 import android.gesture.GestureOverlayView;
@@ -233,13 +234,14 @@
 
     private View mGesturesPanel;
     private GestureOverlayView mGesturesOverlay;
-    private ViewSwitcher mGesturesPrompt;
     private ImageView mGesturesAdd;
     private PopupWindow mGesturesWindow;
     private Launcher.GesturesProcessor mGesturesProcessor;
     private Gesture mCurrentGesture;
     private GesturesAction mGesturesAction;
     private boolean mHideGesturesPanel;
+    private TextView mGesturesPrompt;
+    private Button mGesturesSend;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -605,7 +607,7 @@
             mWorkspace.post(new Runnable() {
                 public void run() {
                     showGesturesPanel(false);
-                    mGesturesProcessor.matchGesture(gesture, false);
+                    mGesturesProcessor.matchGesture(gesture);
                     mWorkspace.post(new Runnable() {
                         public void run() {
                             if (gesture != null) {
@@ -667,22 +669,26 @@
         mGesturesPanel = mInflater.inflate(R.layout.gestures, mDragLayer, false);
         final View gesturesPanel = mGesturesPanel;
 
-        mGesturesPrompt = (ViewSwitcher) gesturesPanel.findViewById(R.id.gestures_actions);
         mGesturesAction = new GesturesAction();
 
-        mGesturesPrompt.getChildAt(0).setOnClickListener(mGesturesAction);
-        mGesturesPrompt.getChildAt(1).setOnClickListener(mGesturesAction);
-
+        mGesturesPrompt = (TextView) gesturesPanel.findViewById(R.id.gestures_prompt);
+        mGesturesSend = (Button) gesturesPanel.findViewById(R.id.gestures_action);
+        mGesturesSend.setOnClickListener(mGesturesAction);
+       
         mGesturesAdd = (ImageView) gesturesPanel.findViewById(R.id.gestures_add);
         final ImageView gesturesAdd = mGesturesAdd;
-        gesturesAdd.setAlpha(128);
-        gesturesAdd.setEnabled(false);
         gesturesAdd.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 createGesture();
             }
         });
 
+        gesturesPanel.findViewById(R.id.gestures_list).setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                startActivity(new Intent(Launcher.this, GesturesActivity.class));
+            }
+        });
+
         mGesturesOverlay = (GestureOverlayView) gesturesPanel.findViewById(R.id.gestures_overlay);
         mGesturesProcessor = new GesturesProcessor();
 
@@ -976,17 +982,34 @@
             if ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) !=
                     Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) {
 
-                if (mGesturesPanel != null && mDragLayer.getWindowVisibility() == View.VISIBLE &&
-                        (mDragLayer.hasWindowFocus() ||
-                                (mGesturesWindow != null && mGesturesWindow.isShowing()))) {
+                // TODO: This really should not be done here every time
+                final SharedPreferences preferences =
+                        getSharedPreferences(GesturesActivity.PREFERENCES_NAME, MODE_PRIVATE);
+                final boolean homeKey = preferences.getBoolean(
+                        GesturesActivity.PREFERENCES_HOME_KEY, false);
 
-                    SearchManager searchManager =
-                            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
+                if (!homeKey) {
+                    if (!mWorkspace.isDefaultScreenShowing()) {
+                        mWorkspace.moveToDefaultScreen();
+                    }
 
-                    if (!searchManager.isVisible()) {
-                        onHomeKeyPressed();
+                    if (mGesturesWindow == null || mGesturesWindow.isShowing()) {
+                        hideGesturesPanel();
+                    }                    
+                } else {
+                    if (mGesturesPanel != null && mDragLayer.getWindowVisibility() == View.VISIBLE
+                            && (mDragLayer.hasWindowFocus() || (mGesturesWindow != null
+                            && mGesturesWindow.isShowing()))) {
+
+                        SearchManager searchManager =
+                                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
+
+                        if (!searchManager.isVisible()) {
+                            onHomeKeyPressed();
+                        }
                     }
                 }
+
                 closeDrawer();
 
                 final View v = getWindow().peekDecorView();
@@ -1016,8 +1039,7 @@
     private void showGesturesPanel(boolean animate) {
         resetGesturesPrompt();
 
-        mGesturesAdd.setEnabled(false);
-        mGesturesAdd.setAlpha(128);
+        mGesturesAdd.setVisibility(View.GONE);
 
         mGesturesOverlay.clear(false);
 
@@ -1027,12 +1049,13 @@
             window = mGesturesWindow;
             window.setFocusable(true);
             window.setTouchable(true);
-            window.setBackgroundDrawable(null);
+            window.setBackgroundDrawable(getResources().getDrawable(
+                    android.R.drawable.screen_background_dark));
             window.setContentView(mGesturesPanel);
         } else {
             window = mGesturesWindow;
         }
-        window.setAnimationStyle(animate ? com.android.internal.R.style.Animation_SlidingCard : 0);
+        window.setAnimationStyle(animate ? com.android.internal.R.style.Animation_Toast : 0);
 
         final int[] xy = new int[2];
         final DragLayer dragLayer = mDragLayer;
@@ -1045,31 +1068,23 @@
 
     private void resetGesturesPrompt() {
         mGesturesAction.intent = null;
-        final TextView prompt = (TextView) mGesturesPrompt.getCurrentView();
-        prompt.setText(R.string.gestures_instructions);
-        prompt.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
-        prompt.setClickable(false);
+        mGesturesPrompt.setText(R.string.gestures_instructions);
+        mGesturesPrompt.setVisibility(View.VISIBLE);
+        mGesturesSend.setVisibility(View.GONE);
     }
 
-    private void resetGesturesNextPrompt() {
+    private void setGestureUnknown() {
         mGesturesAction.intent = null;
-        setGesturesNextPrompt(null, getString(R.string.gestures_instructions));
-        mGesturesPrompt.getNextView().setClickable(false);
+        mGesturesPrompt.setText(R.string.gestures_unknown);
+        mGesturesPrompt.setVisibility(View.VISIBLE);
+        mGesturesSend.setVisibility(View.GONE);
     }
 
-    private void setGesturesNextPrompt(Drawable icon, CharSequence title) {
-        final TextView prompt = (TextView) mGesturesPrompt.getNextView();
-        prompt.setText(title);
-        prompt.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
-        prompt.setClickable(true);
-        mGesturesPrompt.showNext();
-    }
-
-    private void setGesturesPrompt(Drawable icon, CharSequence title) {
-        final TextView prompt = (TextView) mGesturesPrompt.getCurrentView();
-        prompt.setText(title);
-        prompt.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
-        prompt.setClickable(true);
+    private void setGestureAction(Drawable icon, CharSequence title) {
+        mGesturesPrompt.setVisibility(View.GONE);
+        mGesturesSend.setVisibility(View.VISIBLE);
+        mGesturesSend.setText(title);
+        mGesturesSend.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
     }
 
     void hideGesturesPanel() {
@@ -1080,7 +1095,7 @@
         if (mGesturesWindow != null) {
             final PopupWindow popupWindow = mGesturesWindow;
             popupWindow.setAnimationStyle(animate ?
-                    com.android.internal.R.style.Animation_SlidingCard : 0);
+                    com.android.internal.R.style.Animation_Toast : 0);
             popupWindow.update();
             popupWindow.dismiss();
         }
@@ -1270,10 +1285,10 @@
                 .setIcon(com.android.internal.R.drawable.ic_menu_notifications)
                 .setAlphabeticShortcut('N');
 
-        final Intent gestures = new Intent(this, GesturesActivity.class);
+        // TODO: Remove
         menu.add(0, MENU_GESTURES, 0, R.string.menu_gestures)
-                .setIcon(com.android.internal.R.drawable.ic_menu_compose).setAlphabeticShortcut('G')
-                .setIntent(gestures);
+                .setIcon(com.android.internal.R.drawable.ic_menu_compose)
+                .setAlphabeticShortcut('G');
 
         final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
         settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
@@ -1311,6 +1326,9 @@
             case MENU_NOTIFICATIONS:
                 showNotifications();
                 return true;
+            case MENU_GESTURES:
+                showGesturesPanel();
+                return true;
         }
 
         return super.onOptionsItemSelected(item);
@@ -2509,11 +2527,10 @@
             //noinspection PointlessBooleanExpression,ConstantConditions
             if (!CONFIG_GESTURES_IMMEDIATE_MODE) {
                 overlay.removeCallbacks(mMatcher);
-                resetGesturesNextPrompt();
+                resetGesturesPrompt();
             }
 
-            mGesturesAdd.setAlpha(128);
-            mGesturesAdd.setEnabled(false);
+            mGesturesAdd.setVisibility(View.GONE);
         }
 
         public void onGesture(GestureOverlayView overlay, MotionEvent event) {
@@ -2529,7 +2546,7 @@
                     overlay.clear(false);
                     if (mGesturesAction.intent != null) {
                         mGesturesAction.intent = null;
-                        setGesturesNextPrompt(null, getString(R.string.gestures_unknown));
+                        setGestureAction(null, getString(R.string.gestures_unknown));
                     }
                 } else {
                     mMatcher.run();
@@ -2542,7 +2559,7 @@
                     overlay.clear(false);
                     if (mGesturesAction.intent != null) {
                         mGesturesAction.intent = null;
-                        setGesturesNextPrompt(null, getString(R.string.gestures_unknown));
+                        setGestureAction(null, getString(R.string.gestures_unknown));
                     }
                 } else {
                     overlay.postDelayed(mMatcher, GesturesConstants.MATCH_DELAY);
@@ -2551,12 +2568,7 @@
         }
 
         void matchGesture(Gesture gesture) {
-            matchGesture(gesture, true);
-        }
-
-        void matchGesture(Gesture gesture, boolean animate) {
-            mGesturesAdd.setAlpha(255);
-            mGesturesAdd.setEnabled(true);
+            mGesturesAdd.setVisibility(View.VISIBLE);
 
             if (gesture != null) {
                 final ArrayList<Prediction> predictions = sLibrary.recognize(gesture);
@@ -2575,38 +2587,27 @@
 
                         ApplicationInfo info = sModel.queryGesture(Launcher.this, prediction.name);
                         if (info != null) {
-                            updatePrompt(info, animate);
+                            updatePrompt(info);
                         }
                     }
                 }
 
                 if (!match){
                     mGesturesAction.intent = null;
-                    if (animate) {
-                        setGesturesNextPrompt(null, getString(R.string.gestures_unknown));
-                    } else {
-                        setGesturesPrompt(null, getString(R.string.gestures_unknown));
-                    }
+                    setGestureUnknown();
                 }
             }
         }
 
         private void updatePrompt(ApplicationInfo info) {
-            updatePrompt(info, true);
-        }
-
-        private void updatePrompt(ApplicationInfo info, boolean animate) {
+            // TODO: BRING BACK            
             if (mGesturesAction.intent != null &&
                     info.intent.toUri(0).equals(mGesturesAction.intent.toUri(0)) &&
-                    info.title.equals(((TextView) mGesturesPrompt.getCurrentView()).getText())) {
+                    info.title.equals(mGesturesSend.getText())) {
                 return;
             }
 
-            if (animate) {
-                setGesturesNextPrompt(info.icon, info.title);
-            } else {
-                setGesturesPrompt(info.icon, info.title);
-            }
+            setGestureAction(info.icon, info.title);
 
             mGesturesAction.intent = info.intent;
         }
