diff --git a/res/layout/app_grid_item.xml b/res/layout/app_grid_item.xml
new file mode 100644
index 0000000..0b1644c
--- /dev/null
+++ b/res/layout/app_grid_item.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/appIcon"
+        android:layout_width="@android:dimen/app_icon_size"
+        android:layout_height="@android:dimen/app_icon_size"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
+        android:layout_alignParentTop="true"
+        android:background="?android:attr/selectableItemBackground"
+        android:scaleType="centerInside" />
+</RelativeLayout>
diff --git a/res/layout/app_grid_view.xml b/res/layout/app_grid_view.xml
new file mode 100644
index 0000000..38c575f
--- /dev/null
+++ b/res/layout/app_grid_view.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+<GridView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:columnWidth="@android:dimen/app_icon_size"
+    android:gravity="center"
+    android:horizontalSpacing="16dp"
+    android:id="@+id/app_grid_view"
+    android:layout_height="match_parent"
+    android:layout_width="match_parent"
+    android:listSelector="@android:color/transparent"
+    android:numColumns="auto_fit"
+    android:padding="16dp"
+    android:stretchMode="columnWidth"
+    android:verticalSpacing="16dp" />
+
diff --git a/res/layout/app_select_item.xml b/res/layout/app_select_item.xml
new file mode 100644
index 0000000..92a9b9a
--- /dev/null
+++ b/res/layout/app_select_item.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="64dp"
+    android:paddingStart="6dp"
+    android:gravity="center_vertical"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:orientation="horizontal" >
+
+    <ImageView
+        android:id="@+id/app_icon"
+        android:layout_width="@android:dimen/app_icon_size"
+        android:layout_height="@android:dimen/app_icon_size"
+        android:layout_marginEnd="8dip"
+        android:layout_gravity="center_vertical"
+        android:scaleType="centerInside"
+        android:contentDescription="@null" />
+
+    <TextView
+        android:id="@+id/app_name"
+        android:layout_width="0dip"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:layout_gravity="center_vertical"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:focusable="false"
+        android:textAppearance="?android:attr/textAppearanceListItem"
+        android:textAlignment="viewStart" />
+
+    <CheckBox android:id="@android:id/checkbox"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dip"
+        android:layout_gravity="center_vertical"
+        android:clickable="false"
+        android:focusable="false" />
+
+</LinearLayout>
+
diff --git a/res/layout/preference_app_list.xml b/res/layout/preference_app_list.xml
new file mode 100644
index 0000000..97177b9
--- /dev/null
+++ b/res/layout/preference_app_list.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:paddingStart="@dimen/alert_dialog_padding_material"
+    android:paddingEnd="@dimen/alert_dialog_padding_material">
+
+    <ListView
+        android:id="@+id/app_list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:divider="@null" />
+</LinearLayout>
+
diff --git a/res/layout/preference_dialog_applist.xml b/res/layout/preference_dialog_applist.xml
deleted file mode 100644
index 55ab014..0000000
--- a/res/layout/preference_dialog_applist.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The OmniROM 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.
--->
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical"
-        android:gravity="center_horizontal"
-        android:paddingStart="24dp"
-        android:paddingEnd="24dp" >
-
-     <ListView android:id="@+id/applist"
-               android:layout_width="match_parent"
-               android:layout_height="match_parent"
-               android:divider="@null" />
-
-</LinearLayout>
diff --git a/res/layout/preference_selected_apps_view.xml b/res/layout/preference_selected_apps_view.xml
new file mode 100644
index 0000000..aa7c499
--- /dev/null
+++ b/res/layout/preference_selected_apps_view.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?><!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@android:drawable/list_selector_background"
+    android:gravity="center_vertical"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:paddingEnd="?android:attr/scrollbarSize">
+
+    <RelativeLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="6dip"
+        android:layout_marginEnd="6dip"
+        android:layout_marginStart="15dip"
+        android:layout_marginTop="6dip"
+        android:layout_weight="1">
+
+        <HorizontalScrollView
+            android:id="@+id/appsScrollView"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginBottom="8dip"
+            android:layout_marginTop="8dip"
+            android:scrollbars="none" >
+
+            <LinearLayout
+                android:id="@+id/selected_apps"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal" />
+        </HorizontalScrollView>
+
+    </RelativeLayout>
+
+    <!-- Preference should place its actual preference widget here. -->
+    <LinearLayout
+        android:id="@android:id/widget_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:gravity="center_vertical"
+        android:orientation="vertical" />
+
+</LinearLayout>
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index 2ea865a..e591423 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -698,13 +698,18 @@
 
     <string name="event_service_settings_title">Events</string>
     <string name="category_media_player_title">Media player</string>
-    <string name="bt_a2dp_connect_app_title">Bluetooth A2DP connect</string>
-    <string name="headset_connect_app_title">Wired headset connect</string>
+    <string name="bt_a2dp_connect_app_list_title">Bluetooth A2DP connect</string>
+    <string name="headset_connect_app_list_title">Wired headset connect</string>
     <string name="event_service_enabled_title">Enable event service</string>
     <string name="event_service_running">Service is running</string>
     <string name="event_service_stopped">Service is not running</string>
-    <string name="category_media_player_info_title">Select an app to be started for this event</string>
+    <string name="category_media_player_info_title">App selection</string>
     <string name="media_player_autostart_title">Send media play event after start</string>
+    <string name="media_player_music_active_title">Do not start event on playback</string>
+    <string name="autorun_single_app_title">Autorun single app</string>
+    <string name="autorun_single_app_summary">Dont show app selection dialog</string>
+    <string name="bt_a2dp_connect_app_list_summary">App(s) to be listed when an A2DP event is triggered, such as connecting a Bluetooth headset</string>
+    <string name="headset_connect_app_list_summary">App(s) to be listed when a wired headset is connected</string>
 
     <!-- Quick Pulldown-->
     <string name="quick_pulldown_title">Quick pulldown</string>
diff --git a/res/xml/event_service_settings.xml b/res/xml/event_service_settings.xml
index 4b1bf2c..cff6d4d 100644
--- a/res/xml/event_service_settings.xml
+++ b/res/xml/event_service_settings.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <!--  Copyright (C) 2018 The OmniROM Project
 
   This program is free software: you can redistribute it and/or modify
@@ -18,39 +19,71 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     android:key="event_service_settings"
     android:title="@string/event_service_settings_title">
+
+    <SwitchPreference
+        android:key="event_service_enabled"
+        android:persistent="false"
+        android:title="@string/event_service_enabled_title" />
+
+    <PreferenceCategory
+        android:key="category_media_player"
+        android:title="@string/category_media_player_title">
+
+        <Preference
+            android:dependency="event_service_enabled"
+            android:icon="@drawable/ic_info_outline_24dp"
+            android:key="category_media_player_info"
+            android:persistent="false"
+            android:summary="@string/category_media_player_info_title" />
+
+        <org.omnirom.omnigears.preference.AppMultiSelectListPreference
+            android:dependency="event_service_enabled"
+            android:icon="@drawable/ic_settings_bluetooth"
+            android:key="bt_a2dp_connect_app_list"
+            android:persistent="false"
+            android:summary="@string/bt_a2dp_connect_app_list_summary"
+            android:title="@string/bt_a2dp_connect_app_list_title" />
+
+        <org.omnirom.omnigears.preference.ScrollAppsViewPreference
+            android:dependency="event_service_enabled"
+            android:key="a2dp_app_list"
+            android:selectable="false"
+            android:persistent="false" />
+
+        <org.omnirom.omnigears.preference.AppMultiSelectListPreference
+            android:dependency="event_service_enabled"
+            android:icon="@drawable/ic_headset_24dp"
+            android:key="headset_connect_app_list"
+            android:persistent="false"
+            android:summary="@string/headset_connect_app_list_summary"
+            android:title="@string/headset_connect_app_list_title" />
+
+        <org.omnirom.omnigears.preference.ScrollAppsViewPreference
+            android:dependency="event_service_enabled"
+            android:key="headset_app_list"
+            android:selectable="false"
+            android:persistent="false" />
+
         <SwitchPreference
-            android:key="event_service_enabled"
-            android:title="@string/event_service_enabled_title"
-            android:persistent="false"/>
+            android:defaultValue="true"
+            android:dependency="event_service_enabled"
+            android:key="autorun_single_app"
+            android:persistent="false"
+            android:summary="@string/autorun_single_app_summary"
+            android:title="@string/autorun_single_app_title" />
 
-        <PreferenceCategory
-            android:key="category_media_player"
-            android:title="@string/category_media_player_title">
+        <SwitchPreference
+            android:defaultValue="true"
+            android:dependency="event_service_enabled"
+            android:key="media_player_music_active"
+            android:persistent="false"
+            android:title="@string/media_player_music_active_title" />
 
-            <Preference
-                android:key="category_media_player_info"
-                android:summary="@string/category_media_player_info_title"
-                android:persistent="false"
-                android:icon="@drawable/ic_info_outline_24dp"
-                android:dependency="event_service_enabled" />
+        <SwitchPreference
+            android:dependency="event_service_enabled"
+            android:key="media_player_autostart"
+            android:persistent="false"
+            android:title="@string/media_player_autostart_title" />
 
-            <org.omnirom.omnigears.preference.AppSelectListPreference
-                android:key="bt_a2dp_connect_app"
-                android:title="@string/bt_a2dp_connect_app_title"
-                android:persistent="false"
-                android:dependency="event_service_enabled" />
-
-            <org.omnirom.omnigears.preference.AppSelectListPreference
-                android:key="headset_connect_app"
-                android:title="@string/headset_connect_app_title"
-                android:persistent="false"
-                android:dependency="event_service_enabled" />
-
-            <SwitchPreference
-                android:key="media_player_autostart"
-                android:title="@string/media_player_autostart_title"
-                android:persistent="false"
-                android:dependency="event_service_enabled" />
-
-        </PreferenceCategory>
+    </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/org/omnirom/omnigears/preference/AppMultiSelectListPreference.java b/src/org/omnirom/omnigears/preference/AppMultiSelectListPreference.java
new file mode 100644
index 0000000..62749cd
--- /dev/null
+++ b/src/org/omnirom/omnigears/preference/AppMultiSelectListPreference.java
@@ -0,0 +1,246 @@
+/*
+ *  Copyright (C) 2016 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.omnirom.omnigears.preference;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.android.settings.R;
+import com.android.settingslib.CustomDialogPreference;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class AppMultiSelectListPreference extends CustomDialogPreference {
+    private static final String TAG = "AppMultiSelectList";
+    private static final boolean DEBUG = false;
+
+    private final List<PackageItem> mPackageInfoList = new ArrayList<PackageItem>();
+    private AppListAdapter mAdapter;
+    private Set<String> mValues = new HashSet<String>();
+    private PackageManager mPm;
+
+    public AppMultiSelectListPreference(Context context) {
+        this(context, null);
+    }
+
+    public AppMultiSelectListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setDialogLayoutResource(R.layout.preference_app_list);
+
+        mPm = context.getPackageManager();
+
+        final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
+        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+        List<ResolveInfo> installedAppsInfo = getContext().getPackageManager().queryIntentActivities(
+                mainIntent, 0);
+
+        for (ResolveInfo info : installedAppsInfo) {
+            ComponentName componentName = new ComponentName(
+                    info.activityInfo.applicationInfo.packageName,
+                    info.activityInfo.name);
+
+            try {
+                final PackageItem item = new PackageItem(
+                        info.activityInfo.loadLabel(mPm), 0, componentName);
+                mPackageInfoList.add(item);
+            } catch (Exception e) {
+                if (DEBUG) Log.e(TAG, "Load installed apps", e);
+            }
+        }
+        Collections.sort(mPackageInfoList);
+
+        setPositiveButtonText(R.string.action_save);
+        setNegativeButtonText(android.R.string.cancel);
+    }
+
+    public void setValues(Set<String> values) {
+        mValues.clear();
+        mValues.addAll(values);
+    }
+
+    public Set<String> getValues() {
+        return mValues;
+    }
+
+    @Override
+    protected void onBindDialogView(View view) {
+        super.onBindDialogView(view);
+
+        mAdapter = new AppListAdapter(getContext());
+        final ListView listView = (ListView) view.findViewById(R.id.app_list);
+        listView.setAdapter(mAdapter);
+        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                final AppViewHolder holder = (AppViewHolder) view.getTag();
+                final boolean isChecked = !holder.checkBox.isChecked();
+
+                holder.checkBox.setChecked(isChecked);
+                PackageItem info = mAdapter.getItem(position);
+
+                if (isChecked) {
+                    mValues.add(info.mValue);
+                } else {
+                    mValues.remove(info.mValue);
+                }
+            }
+        });
+    }
+
+    @Override
+    protected void onDialogClosed(boolean positiveResult) {
+        super.onDialogClosed(positiveResult);
+        if (positiveResult) {
+            callChangeListener(mValues.size() > 0 ? mValues : null);
+        }
+    }
+
+    public class PackageItem implements Comparable<PackageItem> {
+        public final CharSequence mTitle;
+        public final int mAppIconResourceId;
+        public final ComponentName mComponentName;
+        public final String mValue;
+
+        PackageItem(CharSequence title, int iconResourceId, ComponentName componentName) {
+            mTitle = title;
+            mAppIconResourceId = iconResourceId;
+            mComponentName = componentName;
+            mValue = componentName.flattenToString();
+        }
+
+        PackageItem(CharSequence title, int iconResourceId, String value) {
+            mTitle = title;
+            mAppIconResourceId = iconResourceId;
+            mComponentName = null;
+            mValue = value;
+        }
+
+        @Override
+        public int compareTo(PackageItem another) {
+            return mTitle.toString().toUpperCase().compareTo(another.mTitle.toString().toUpperCase());
+        }
+
+        @Override
+        public int hashCode() {
+            return mValue.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object another) {
+            if (another == null || !(another instanceof PackageItem)) {
+                return false;
+            }
+            return mValue.equals(((PackageItem) another).mValue);
+        }
+    }
+
+    public class AppListAdapter extends ArrayAdapter<PackageItem> {
+        private final LayoutInflater mInflater;
+
+        public AppListAdapter(Context context) {
+            super(context, 0);
+            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+            addAll(mPackageInfoList);
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            AppViewHolder holder = AppViewHolder.createOrRecycle(mInflater, convertView);
+            convertView = holder.rootView;
+            PackageItem info = getItem(position);
+            holder.appName.setText(info.mTitle);
+            if (info.mAppIconResourceId != 0) {
+                holder.appIcon.setImageResource(info.mAppIconResourceId);
+            } else {
+                Drawable d = resolveAppIcon(info);
+                holder.appIcon.setImageDrawable(d);
+            }
+            holder.checkBox.setChecked(mValues.contains(info.mValue));
+            return convertView;
+        }
+
+        @Override
+        public PackageItem getItem(int position) {
+            return mPackageInfoList.get(position);
+        }
+    }
+
+    public static class AppViewHolder {
+        public View rootView;
+        public TextView appName;
+        public ImageView appIcon;
+        public CheckBox checkBox;
+
+        public static AppViewHolder createOrRecycle(LayoutInflater inflater, View convertView) {
+            if (convertView == null) {
+                convertView = inflater.inflate(R.layout.app_select_item, null);
+
+                // Creates a ViewHolder and store references to the two children views
+                // we want to bind data to.
+                AppViewHolder holder = new AppViewHolder();
+                holder.rootView = convertView;
+                holder.appName = (TextView) convertView.findViewById(R.id.app_name);
+                holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
+                holder.checkBox = (CheckBox) convertView.findViewById(android.R.id.checkbox);
+                convertView.setTag(holder);
+                return holder;
+            } else {
+                // Get the ViewHolder back to get fast access to the TextView
+                // and the ImageView.
+                return (AppViewHolder) convertView.getTag();
+            }
+        }
+    }
+
+    private Drawable getDefaultActivityIcon() {
+        return getContext().getResources().getDrawable(android.R.drawable.sym_def_app_icon);
+    }
+
+    private Drawable resolveAppIcon(PackageItem item) {
+        Drawable appIcon = null;
+        try {
+            appIcon = mPm.getActivityIcon(item.mComponentName);
+        } catch (PackageManager.NameNotFoundException e) {
+            if (DEBUG) Log.e(TAG, "resolveAppIcon", e);
+        }
+        if (appIcon == null) {
+            appIcon = getDefaultActivityIcon();
+        }
+        return appIcon;
+    }
+}
+
diff --git a/src/org/omnirom/omnigears/preference/AppSelectListPreference.java b/src/org/omnirom/omnigears/preference/AppSelectListPreference.java
index 7fdd73e..2110725 100644
--- a/src/org/omnirom/omnigears/preference/AppSelectListPreference.java
+++ b/src/org/omnirom/omnigears/preference/AppSelectListPreference.java
@@ -217,7 +217,7 @@
 
     private void init() {
         mPm = getContext().getPackageManager();
-        setDialogLayoutResource(R.layout.preference_dialog_applist);
+        setDialogLayoutResource(R.layout.preference_app_list);
         setLayoutResource(R.layout.preference_app_select);
         setNegativeButtonText(android.R.string.cancel);
         setPositiveButtonText(null);
@@ -242,7 +242,7 @@
     protected void onBindDialogView(View view) {
         super.onBindDialogView(view);
 
-        final ListView list = (ListView) view.findViewById(R.id.applist);
+        final ListView list = (ListView) view.findViewById(R.id.app_list);
         list.setAdapter(mAdapter);
         list.setOnItemClickListener(new OnItemClickListener() {
             @Override
diff --git a/src/org/omnirom/omnigears/preference/ScrollAppsViewPreference.java b/src/org/omnirom/omnigears/preference/ScrollAppsViewPreference.java
new file mode 100644
index 0000000..4d42ecc
--- /dev/null
+++ b/src/org/omnirom/omnigears/preference/ScrollAppsViewPreference.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2017 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.omnirom.omnigears.preference;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.android.settings.R;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class ScrollAppsViewPreference extends Preference {
+    private static final String TAG = "ScrollAppsPreference";
+
+    private Context mContext;
+    private Set<String> mValues = new HashSet<String>();
+    private PackageManager mPm;
+    private LayoutInflater mInflater;
+
+    public ScrollAppsViewPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        initPreference(context);
+    }
+
+    public ScrollAppsViewPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initPreference(context);
+    }
+
+    public ScrollAppsViewPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        initPreference(context);
+    }
+
+    public void setValues(Set<String> values) {
+        mValues.clear();
+        mValues.addAll(values);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        LinearLayout linearLayout = (LinearLayout) holder.findViewById(R.id.selected_apps);
+        if (linearLayout.getChildCount() > 0) linearLayout.removeAllViews();
+
+        for (String value : mValues) {
+            try {
+                View v = mInflater.inflate(R.layout.app_grid_item, null);
+                ComponentName componentName = ComponentName.unflattenFromString(value);
+                Drawable icon = mPm.getActivityIcon(componentName);
+                ((ImageView) v.findViewById(R.id.appIcon)).setImageDrawable(icon);
+                v.setPadding(10, 5, 10, 5);
+                linearLayout.addView(v);
+            } catch (PackageManager.NameNotFoundException e) {
+                Log.e(TAG, "Set app icon", e);
+            }
+        }
+    }
+
+    private void initPreference(Context context) {
+        mContext = context;
+        setLayoutResource(R.layout.preference_selected_apps_view);
+        mPm = context.getPackageManager();
+        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+    }
+}
diff --git a/src/org/omnirom/omnigears/service/EventService.java b/src/org/omnirom/omnigears/service/EventService.java
index 2756e15..8bcb452 100644
--- a/src/org/omnirom/omnigears/service/EventService.java
+++ b/src/org/omnirom/omnigears/service/EventService.java
@@ -14,132 +14,135 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
-*/
+ */
 package org.omnirom.omnigears.service;
 
-import android.app.ActivityManagerNative;
 import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.BroadcastReceiver;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
-import android.media.IAudioService;
 import android.media.AudioManager;
-import android.media.session.MediaSessionLegacyHelper;
-import android.os.Handler;
+import android.media.AudioSystem;
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.PowerManager;
 import android.os.UserHandle;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.text.TextUtils;
 import android.util.Log;
-import android.view.KeyEvent;
 
-import org.omnirom.omnigears.preference.AppSelectListPreference;
+import org.omnirom.omnigears.ui.MultiAppSelectorActivity;
+import org.omnirom.omnigears.utils.SetStringPackUtils;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Set;
+
 
 public class EventService extends Service {
     private static final String TAG = "OmniEventService";
-    private static final boolean DEBUG = true;
+    private static final boolean DEBUG = false;
     private PowerManager.WakeLock mWakeLock;
     private static boolean mIsRunning;
-    private Handler mHandler = new Handler();
-    private boolean mWiredHeadsetConnected;
-    private boolean mA2DPConnected;
+    private static boolean mWiredHeadsetConnected;
+    private static boolean mA2DPConnected;
 
     private BroadcastReceiver mStateListener = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             mWakeLock.acquire();
+
             try {
                 if (DEBUG) Log.d(TAG, "onReceive " + action);
-                if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
-                    if(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_OFF){
-                        mA2DPConnected = false;
-                    }
-                }
-                if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
-                }
-                if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
-                }
-                if (BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
-                    int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,
-                            BluetoothProfile.STATE_CONNECTED);
-                    if (state == BluetoothProfile.STATE_CONNECTED && !mA2DPConnected) {
-                        mA2DPConnected = true;
-                        if (DEBUG) Log.d(TAG, "BluetoothProfile.STATE_CONNECTED = true" );
-                        String app = getPrefs(context).getString(EventServiceSettings.EVENT_A2DP_CONNECT, null);
-                        if (!TextUtils.isEmpty(app) && !app.equals(AppSelectListPreference.DISABLED_ENTRY)) {
-                            if (DEBUG) Log.d(TAG, "AudioManager.ACTION_HEADSET_PLUG app = " + app);
-                            try {
-                                context.startActivityAsUser(createIntent(app), UserHandle.CURRENT);
-                                if (getPrefs(context).getBoolean(EventServiceSettings.EVENT_MEDIA_PLAYER_START, false)) {
-                                    mHandler.postDelayed(new Runnable() {
-                                        @Override
-                                        public void run() {
-                                            dispatchMediaKeyToAudioService(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
-                                        }
-                                    }, 1000);
-                                }
-                            } catch (Exception e) {
-                                Log.e(TAG, "BluetoothProfile.STATE_CONNECTED", e);
-                            }
+
+                boolean disableIfMusicActive = getPrefs(context).getBoolean(EventServiceSettings.EVENT_MUSIC_ACTIVE, true);
+
+                switch (action) {
+                    case BluetoothAdapter.ACTION_STATE_CHANGED:
+                        if (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_OFF) {
+                            mA2DPConnected = false;
                         }
-                    } else {
-                        mA2DPConnected = false;
-                        if (DEBUG) Log.d(TAG, "BluetoothProfile.STATE_CONNECTED = false" );
-                    }
-                }
-                if (AudioManager.ACTION_HEADSET_PLUG.equals(action)) {
-                    boolean useHeadset = intent.getIntExtra("state", 0) == 1;
-                    if (useHeadset && !mWiredHeadsetConnected) {
-                        mWiredHeadsetConnected = true;
-                        if (DEBUG) Log.d(TAG, "AudioManager.ACTION_HEADSET_PLUG = true" );
-                        String app = getPrefs(context).getString(EventServiceSettings.EVENT_WIRED_HEADSET_CONNECT, null);
-                        if (!TextUtils.isEmpty(app) && !app.equals(AppSelectListPreference.DISABLED_ENTRY)) {
-                            if (DEBUG) Log.d(TAG, "AudioManager.ACTION_HEADSET_PLUG app = " + app);
-                            try {
-                                context.startActivityAsUser(createIntent(app), UserHandle.CURRENT);
-                                if (getPrefs(context).getBoolean(EventServiceSettings.EVENT_MEDIA_PLAYER_START, false)) {
-                                    mHandler.postDelayed(new Runnable() {
-                                        @Override
-                                        public void run() {
-                                            dispatchMediaKeyToAudioService(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
-                                        }
-                                    }, 1000);
+                        break;
+                    case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:
+                        int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,
+                                BluetoothProfile.STATE_CONNECTED);
+                        if (state == BluetoothProfile.STATE_CONNECTED && !mA2DPConnected) {
+                            mA2DPConnected = true;
+                            if (DEBUG) Log.d(TAG, "BluetoothProfile.STATE_CONNECTED = true");
+
+                            if (!(disableIfMusicActive && isMusicActive())) {
+                                Set<String> apps = getPrefs(context).getStringSet(EventServiceSettings.EVENT_A2DP_CONNECT, null);
+                                if (apps != null) {
+                                    openMultiAppSelector(apps, context);
                                 }
-                            } catch (Exception e) {
-                                Log.e(TAG, "AudioManager.ACTION_HEADSET_PLUG", e);
                             }
+                        } else {
+                            mA2DPConnected = false;
+                            if (DEBUG) Log.d(TAG, "BluetoothProfile.STATE_CONNECTED = false");
                         }
-                    } else {
-                        mWiredHeadsetConnected = false;
-                        if (DEBUG) Log.d(TAG, "AudioManager.ACTION_HEADSET_PLUG = false" );
-                    }
+                        break;
+                    case AudioManager.ACTION_HEADSET_PLUG:
+                        boolean useHeadset = intent.getIntExtra("state", 0) == 1;
+                        if (useHeadset && !mWiredHeadsetConnected) {
+                            mWiredHeadsetConnected = true;
+                            if (DEBUG) Log.d(TAG, "AudioManager.ACTION_HEADSET_PLUG = true");
+
+                            if (!(disableIfMusicActive && isMusicActive())) {
+                                Set<String> apps = getPrefs(context).getStringSet(EventServiceSettings.EVENT_WIRED_HEADSET_CONNECT, null);
+                                if (apps != null) {
+                                    openMultiAppSelector(apps, context);
+                                }
+                            }
+                        } else {
+                            mWiredHeadsetConnected = false;
+                            if (DEBUG) Log.d(TAG, "AudioManager.ACTION_HEADSET_PLUG = false");
+                        }
+                        break;
                 }
-                
+
             } finally {
                 mWakeLock.release();
             }
         }
     };
 
+    private boolean isMusicActive() {
+        if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0)) {
+            // local / wired / BT playback active
+            if (DEBUG) Log.d(TAG, "isMusicActive(): local");
+            return true;
+        }
+        if (AudioSystem.isStreamActiveRemotely(AudioSystem.STREAM_MUSIC, 0)) {
+            // remote submix playback active
+            if (DEBUG) Log.d(TAG, "isMusicActive(): remote submix");
+            return true;
+        }
+        if (DEBUG) Log.d(TAG, "isMusicActive(): no");
+        return false;
+    }
+
+    private void openMultiAppSelector(Set<String> apps, Context context) {
+        Intent intent = new Intent(context, MultiAppSelectorActivity.class);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
+                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+        intent.putExtra(MultiAppSelectorActivity.APPS, SetStringPackUtils.packSet(apps));
+        intent.putExtra(MultiAppSelectorActivity.AUTORUN_SINGLE,
+                getPrefs(context).getBoolean(EventServiceSettings.EVENT_AUTORUN_SINGLE, true));
+        intent.putExtra(MultiAppSelectorActivity.MEDIA_PLAYER_START,
+                getPrefs(context).getBoolean(EventServiceSettings.EVENT_MEDIA_PLAYER_START, false));
+        startActivityAsUser(intent, UserHandle.CURRENT);
+    }
+
     public class LocalBinder extends Binder {
         public EventService getService() {
             return EventService.this;
         }
     }
+
     private final LocalBinder mBinder = new LocalBinder();
 
     @Override
@@ -192,31 +195,4 @@
     private SharedPreferences getPrefs(Context context) {
         return context.getSharedPreferences(EventServiceSettings.EVENTS_PREFERENCES_NAME, Context.MODE_PRIVATE);
     }
-
-    private Intent createIntent(String value) {
-        ComponentName componentName = ComponentName.unflattenFromString(value);
-        Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.addCategory(Intent.CATEGORY_LAUNCHER);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-        intent.setComponent(componentName);
-        return intent;
-    }
-
-    private void dispatchMediaKeyToAudioService(int keycode) {
-        if (ActivityManagerNative.isSystemReady()) {
-            IAudioService audioService = IAudioService.Stub
-                    .asInterface(ServiceManager.checkService(Context.AUDIO_SERVICE));
-            if (audioService != null) {
-                if (DEBUG) Log.d(TAG, "dispatchMediaKeyToAudioService " + keycode);
-
-                KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(),
-                        SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN,
-                        keycode, 0);
-                MediaSessionLegacyHelper.getHelper(this).sendMediaButtonEvent(event, true);
-                event = KeyEvent.changeAction(event, KeyEvent.ACTION_UP);
-                MediaSessionLegacyHelper.getHelper(this).sendMediaButtonEvent(event, true);
-            }
-        }
-    }
 }
diff --git a/src/org/omnirom/omnigears/service/EventServiceSettings.java b/src/org/omnirom/omnigears/service/EventServiceSettings.java
index d29b9ce..e146278 100644
--- a/src/org/omnirom/omnigears/service/EventServiceSettings.java
+++ b/src/org/omnirom/omnigears/service/EventServiceSettings.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
-*/
+ */
 
 package org.omnirom.omnigears.service;
 
@@ -23,43 +23,50 @@
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.os.Handler;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v14.preference.SwitchPreference;
-import android.provider.Settings;
 import android.provider.SearchIndexableResource;
-import android.util.Log;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
-import org.omnirom.omnigears.preference.AppSelectListPreference;
+import org.omnirom.omnigears.preference.AppMultiSelectListPreference;
+import org.omnirom.omnigears.preference.ScrollAppsViewPreference;
 
-import java.util.List;
 import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 public class EventServiceSettings extends SettingsPreferenceFragment implements OnPreferenceChangeListener, Indexable {
-    private static final String TAG = "EventServiceSettings";
     public static final String EVENTS_PREFERENCES_NAME = "event_service";
 
-    public static final String EVENT_A2DP_CONNECT = "bt_a2dp_connect_app";
-    public static final String EVENT_WIRED_HEADSET_CONNECT = "headset_connect_app";
+    public static final String EVENT_A2DP_CONNECT = "bt_a2dp_connect_app_list";
+    public static final String EVENT_WIRED_HEADSET_CONNECT = "headset_connect_app_list";
     public static final String EVENT_SERVICE_ENABLED = "event_service_enabled";
     public static final String EVENT_MEDIA_PLAYER_START = "media_player_autostart";
+    public static final String EVENT_MUSIC_ACTIVE = "media_player_music_active";
+    public static final String EVENT_AUTORUN_SINGLE = "autorun_single_app";
+    public static final String A2DP_APP_LIST = "a2dp_app_list";
+    public static final String HEADSET_APP_LIST = "headset_app_list";
 
-    private AppSelectListPreference mA2DPappSelect;
-    private AppSelectListPreference mWiredHeadsetAppSelect;
+    // -- For backward compatibility
+    public static final String OLD_EVENT_A2DP_CONNECT = "bt_a2dp_connect_app";
+    public static final String OLD_EVENT_WIRED_HEADSET_CONNECT = "headset_connect_app";
+    // -- End backward compatibility
+
+    private AppMultiSelectListPreference mA2DPappSelect;
+    private AppMultiSelectListPreference mWiredHeadsetAppSelect;
+    private ScrollAppsViewPreference mA2DPApps;
+    private ScrollAppsViewPreference mHeadsetApps;
     private SwitchPreference mEnable;
     private SwitchPreference mAutoStart;
+    private SwitchPreference mMusicActive;
+    private SwitchPreference mAutorun;
     private Handler mHandler = new Handler();
     private String mServiceRunning;
     private String mServiceStopped;
@@ -78,6 +85,17 @@
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.event_service_settings);
 
+        // -- For backward compatibility
+        String old_value = getPrefs().getString(OLD_EVENT_A2DP_CONNECT, null);
+        if (old_value != null) {
+            fixOldPreference(OLD_EVENT_A2DP_CONNECT, EVENT_A2DP_CONNECT, old_value);
+        }
+        old_value = getPrefs().getString(OLD_EVENT_WIRED_HEADSET_CONNECT, null);
+        if (old_value != null) {
+            fixOldPreference(OLD_EVENT_WIRED_HEADSET_CONNECT, EVENT_WIRED_HEADSET_CONNECT, old_value);
+        }
+        // -- End backward compatibility
+
         mEnable = (SwitchPreference) findPreference(EVENT_SERVICE_ENABLED);
         mEnable.setChecked(getPrefs().getBoolean(EventServiceSettings.EVENT_SERVICE_ENABLED, false));
         mEnable.setOnPreferenceChangeListener(this);
@@ -89,29 +107,73 @@
         mAutoStart.setChecked(getPrefs().getBoolean(EventServiceSettings.EVENT_MEDIA_PLAYER_START, false));
         mAutoStart.setOnPreferenceChangeListener(this);
 
-        mA2DPappSelect = (AppSelectListPreference) findPreference(EVENT_A2DP_CONNECT);
-        mEnable.setChecked(getPrefs().getBoolean(EventServiceSettings.EVENT_SERVICE_ENABLED, false));
-        String value = getPrefs().getString(EVENT_A2DP_CONNECT, null);
-        mA2DPappSelect.setValue(value);
+        mMusicActive = (SwitchPreference) findPreference(EVENT_MUSIC_ACTIVE);
+        mMusicActive.setChecked(getPrefs().getBoolean(EventServiceSettings.EVENT_MUSIC_ACTIVE, false));
+        mMusicActive.setOnPreferenceChangeListener(this);
+
+        mAutorun = (SwitchPreference) findPreference(EVENT_AUTORUN_SINGLE);
+        mAutorun.setChecked(getPrefs().getBoolean(EventServiceSettings.EVENT_AUTORUN_SINGLE, true));
+        mAutorun.setOnPreferenceChangeListener(this);
+
+        mA2DPappSelect = (AppMultiSelectListPreference) findPreference(EVENT_A2DP_CONNECT);
+        Set<String> value = getPrefs().getStringSet(EVENT_A2DP_CONNECT, null);
+        if (value != null) mA2DPappSelect.setValues(value);
         mA2DPappSelect.setOnPreferenceChangeListener(this);
 
-        mWiredHeadsetAppSelect = (AppSelectListPreference) findPreference(EVENT_WIRED_HEADSET_CONNECT);
-        value = getPrefs().getString(EVENT_WIRED_HEADSET_CONNECT, null);
-        mWiredHeadsetAppSelect.setValue(value);
+        mA2DPApps = (ScrollAppsViewPreference) findPreference(A2DP_APP_LIST);
+        if (value == null) {
+            mA2DPApps.setVisible(false);
+        } else {
+            mA2DPApps.setVisible(true);
+            mA2DPApps.setValues(value);
+        }
+
+        mWiredHeadsetAppSelect = (AppMultiSelectListPreference) findPreference(EVENT_WIRED_HEADSET_CONNECT);
+        value = getPrefs().getStringSet(EVENT_WIRED_HEADSET_CONNECT, null);
+        if (value != null) mWiredHeadsetAppSelect.setValues(value);
         mWiredHeadsetAppSelect.setOnPreferenceChangeListener(this);
+
+        mHeadsetApps = (ScrollAppsViewPreference) findPreference(HEADSET_APP_LIST);
+        if (value == null) {
+            mHeadsetApps.setVisible(false);
+        } else {
+            mHeadsetApps.setValues(value);
+            mHeadsetApps.setVisible(true);
+        }
+    }
+
+    private void fixOldPreference(String old_event, String new_event, String value) {
+        Set<String> mValues = new HashSet<String>();
+        mValues.add(value);
+        getPrefs().edit().putStringSet(new_event, mValues).commit();
+        getPrefs().edit().putString(old_event, null).commit();
     }
 
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (preference == mA2DPappSelect) {
-            String value = (String) newValue;
-            boolean appDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            getPrefs().edit().putString(EVENT_A2DP_CONNECT, appDisabled ? null : value).commit();
+            Set<String> value = (Set<String>) newValue;
+
+            getPrefs().edit().putStringSet(EVENT_A2DP_CONNECT, value).commit();
+
+            mA2DPApps.setVisible(false);
+            if (value != null) {
+                mA2DPApps.setValues(value);
+                mA2DPApps.setVisible(true);
+            }
+
             return true;
         } else if (preference == mWiredHeadsetAppSelect) {
-            String value = (String) newValue;
-            boolean appDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            getPrefs().edit().putString(EVENT_WIRED_HEADSET_CONNECT, appDisabled ? null : value).commit();
+            Set<String> value = (Set<String>) newValue;
+
+            getPrefs().edit().putStringSet(EVENT_WIRED_HEADSET_CONNECT, value).commit();
+
+            mHeadsetApps.setVisible(false);
+            if (value != null) {
+                mHeadsetApps.setValues(value);
+                mHeadsetApps.setVisible(true);
+            }
+
             return true;
         } else if (preference == mEnable) {
             boolean value = ((Boolean) newValue).booleanValue();
@@ -135,6 +197,14 @@
             boolean value = ((Boolean) newValue).booleanValue();
             getPrefs().edit().putBoolean(EVENT_MEDIA_PLAYER_START, value).commit();
             return true;
+        } else if (preference == mMusicActive) {
+            boolean value = ((Boolean) newValue).booleanValue();
+            getPrefs().edit().putBoolean(EVENT_MUSIC_ACTIVE, value).commit();
+            return true;
+        } else if (preference == mAutorun) {
+            boolean value = ((Boolean) newValue).booleanValue();
+            getPrefs().edit().putBoolean(EVENT_AUTORUN_SINGLE, value).commit();
+            return true;
         }
         return false;
     }
@@ -147,7 +217,7 @@
             new BaseSearchIndexProvider() {
                 @Override
                 public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
-                        boolean enabled) {
+                                                                            boolean enabled) {
                     ArrayList<SearchIndexableResource> result =
                             new ArrayList<SearchIndexableResource>();
 
@@ -163,5 +233,5 @@
                     ArrayList<String> result = new ArrayList<String>();
                     return result;
                 }
-    };
+            };
 }
diff --git a/src/org/omnirom/omnigears/ui/AppGridAdapter.java b/src/org/omnirom/omnigears/ui/AppGridAdapter.java
new file mode 100644
index 0000000..4dddb4e
--- /dev/null
+++ b/src/org/omnirom/omnigears/ui/AppGridAdapter.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.omnirom.omnigears.ui;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+
+import org.omnirom.omnigears.R;
+
+public class AppGridAdapter extends BaseAdapter {
+    private static final String TAG = "AppGridAdapter";
+
+    private LayoutInflater layoutinflater;
+    private Object[] appList;
+    private PackageManager mPm;
+
+    public AppGridAdapter(Context context, Object[] customizedListView) {
+        mPm = context.getPackageManager();
+        layoutinflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        appList = customizedListView;
+    }
+
+    @Override
+    public int getCount() {
+        return appList.length;
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return appList[position];
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return (long) position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+
+        ViewHolder listViewHolder;
+
+        if (convertView == null) {
+            listViewHolder = new ViewHolder();
+            convertView = layoutinflater.inflate(R.layout.app_grid_item, parent, false);
+            listViewHolder.imageInListView = (ImageView) convertView.findViewById(R.id.appIcon);
+            convertView.setTag(listViewHolder);
+        } else {
+            listViewHolder = (ViewHolder) convertView.getTag();
+        }
+
+        try {
+            ComponentName componentName = ComponentName.unflattenFromString((String) appList[position]);
+            Drawable icon = mPm.getActivityIcon(componentName);
+            listViewHolder.imageInListView.setImageDrawable(icon);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "Set app icon", e);
+        }
+
+        return convertView;
+    }
+
+    static class ViewHolder {
+        ImageView imageInListView;
+    }
+}
diff --git a/src/org/omnirom/omnigears/ui/MultiAppSelectorActivity.java b/src/org/omnirom/omnigears/ui/MultiAppSelectorActivity.java
new file mode 100644
index 0000000..1e5b9c6
--- /dev/null
+++ b/src/org/omnirom/omnigears/ui/MultiAppSelectorActivity.java
@@ -0,0 +1,120 @@
+package org.omnirom.omnigears.ui;
+
+
+import android.app.Activity;
+import android.app.ActivityManagerNative;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.media.IAudioService;
+import android.media.session.MediaSessionLegacyHelper;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.ServiceManager;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.GridView;
+
+import org.omnirom.omnigears.R;
+import org.omnirom.omnigears.utils.SetStringPackUtils;
+
+public class MultiAppSelectorActivity extends Activity {
+    private static final String TAG = "MultiAppSelector";
+    private static final boolean DEBUG = false;
+
+    public static final String APPS = "apps";
+    public static final String MEDIA_PLAYER_START = "media_player_start";
+    public static final String AUTORUN_SINGLE = "autorun_single";
+
+    private Handler mHandler = new Handler();
+    private Boolean mediaStart = false;
+    private Boolean autoRun = false;
+    private Object[] appList = null;
+    private GridView gridview;
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        setContentView(R.layout.app_grid_view);
+        Intent intent = getIntent();
+
+        mediaStart = intent.getBooleanExtra(MEDIA_PLAYER_START, false);
+        autoRun = intent.getBooleanExtra(AUTORUN_SINGLE, false);
+        appList = SetStringPackUtils.unpackString(intent.getStringExtra(APPS)).toArray();
+
+        gridview = (GridView) findViewById(R.id.app_grid_view);
+        gridview.setAdapter(new AppGridAdapter(MultiAppSelectorActivity.this, appList));
+        gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                openApp((String) appList[position]);
+            }
+        });
+
+        if (autoRun && appList.length == 1) { // If there is only one app open it
+            openApp((String) appList[0]);
+        }
+    }
+
+    private void openApp(String app_uri) {
+        try {
+            startActivityAsUser(createIntent(app_uri), UserHandle.CURRENT);
+            if (mediaStart) {
+                mHandler.postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        dispatchMediaKeyToAudioService(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
+                    }
+                }, 1000);
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "MultiAppSelector.EVENT_MEDIA_PLAYER_START", e);
+        }
+    }
+
+    private Intent createIntent(String value) {
+        ComponentName componentName = ComponentName.unflattenFromString(value);
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addCategory(Intent.CATEGORY_LAUNCHER);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+        intent.setComponent(componentName);
+        return intent;
+    }
+
+    private void dispatchMediaKeyToAudioService(int keycode) {
+        if (ActivityManagerNative.isSystemReady()) {
+            IAudioService audioService = IAudioService.Stub
+                    .asInterface(ServiceManager.checkService(Context.AUDIO_SERVICE));
+            if (audioService != null) {
+                if (DEBUG) Log.d(TAG, "dispatchMediaKeyToAudioService " + keycode);
+
+                KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(),
+                        SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN,
+                        keycode, 0);
+                MediaSessionLegacyHelper.getHelper(this).sendMediaButtonEvent(event, true);
+                event = KeyEvent.changeAction(event, KeyEvent.ACTION_UP);
+                MediaSessionLegacyHelper.getHelper(this).sendMediaButtonEvent(event, true);
+            }
+        }
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        finish();
+    }
+}
diff --git a/src/org/omnirom/omnigears/utils/SetStringPackUtils.java b/src/org/omnirom/omnigears/utils/SetStringPackUtils.java
new file mode 100644
index 0000000..758c97e
--- /dev/null
+++ b/src/org/omnirom/omnigears/utils/SetStringPackUtils.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.omnirom.omnigears.utils;
+
+import android.text.TextUtils;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class SetStringPackUtils {
+    public static Set<String> unpackString(String packed) {
+        return new HashSet<String>(Arrays.asList(packed.split("\\|")));
+    }
+
+    public static String packSet(Set<String> values) {
+        return TextUtils.join("|", values);
+    }
+}
