diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
index a1bf7ed..f773191 100644
--- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
+++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
@@ -192,26 +192,15 @@
 
     /**
      * Extension of AdapterItem that contains an extra payload specific to item
-     *
-     * @param <T> Play load Type
      */
     public static class SearchAdapterItem extends AdapterItem {
         private SearchTarget mSearchTarget;
-        private String mSearchSessionId;
 
         public SearchAdapterItem(SearchTarget searchTarget, int type) {
             mSearchTarget = searchTarget;
             viewType = type;
         }
 
-        public void setSearchSessionId(String searchSessionId) {
-            mSearchSessionId = searchSessionId;
-        }
-
-        public String getSearchSessionId() {
-            return mSearchSessionId;
-        }
-
         public SearchTarget getSearchTarget() {
             return mSearchTarget;
         }
@@ -484,8 +473,7 @@
                 SearchAdapterItem slicePayload = (SearchAdapterItem) mApps.getAdapterItems().get(
                         position);
                 SearchTarget searchTarget = slicePayload.getSearchTarget();
-                sliceView.setTag(new SearchSliceWrapper(mLauncher, sliceView, searchTarget,
-                        slicePayload.getSearchSessionId(), slicePayload.position));
+                sliceView.setTag(new SearchSliceWrapper(mLauncher, sliceView, searchTarget));
 
                 break;
             case VIEW_TYPE_SEARCH_CORPUS_TITLE:
@@ -500,7 +488,7 @@
                 SearchAdapterItem item =
                         (SearchAdapterItem) mApps.getAdapterItems().get(position);
                 SearchTargetHandler payloadResultView = (SearchTargetHandler) holder.itemView;
-                payloadResultView.setup(item);
+                payloadResultView.applySearchTarget(item.getSearchTarget());
                 break;
             case VIEW_TYPE_ALL_APPS_DIVIDER:
                 // nothing to do
diff --git a/src/com/android/launcher3/allapps/AllAppsStore.java b/src/com/android/launcher3/allapps/AllAppsStore.java
index 50fb60a..3ae0a18 100644
--- a/src/com/android/launcher3/allapps/AllAppsStore.java
+++ b/src/com/android/launcher3/allapps/AllAppsStore.java
@@ -18,8 +18,6 @@
 import static com.android.launcher3.model.data.AppInfo.COMPONENT_KEY_COMPARATOR;
 import static com.android.launcher3.model.data.AppInfo.EMPTY_ARRAY;
 
-import android.content.ComponentName;
-import android.os.UserHandle;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -29,7 +27,6 @@
 import com.android.launcher3.model.data.PromiseAppInfo;
 import com.android.launcher3.util.ComponentKey;
 import com.android.launcher3.util.PackageUserKey;
-import com.android.systemui.plugins.shared.SearchTarget;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -89,19 +86,6 @@
         return index < 0 ? null : mApps[index];
     }
 
-    /**
-     * Gets AppInfo from {@link SearchTarget}
-     * TODO: SearchTarget should have userHandle and ComponentKey members
-     */
-    public AppInfo getAppFromSearchTarget(SearchTarget searchTarget) {
-        ComponentName cn = searchTarget.bundle.getParcelable("component_name");
-        UserHandle userHandle = searchTarget.bundle.getParcelable("user_handle");
-        if (cn == null) {
-            throw new IllegalStateException("Component name is required for AppInfo");
-        }
-        return getApp(new ComponentKey(cn, userHandle));
-    }
-
     public void enableDeferUpdates(int flag) {
         mDeferUpdatesFlags |= flag;
     }
diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
index 6ba0421..9e6ca34 100644
--- a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
+++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
@@ -31,12 +31,10 @@
 import com.android.launcher3.Launcher;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.allapps.AllAppsGridAdapter;
-import com.android.launcher3.allapps.AllAppsGridAdapter.SearchAdapterItem;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.util.PackageManagerHelper;
 import com.android.systemui.plugins.AllAppsSearchPlugin;
 import com.android.systemui.plugins.shared.SearchTarget;
-import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -208,22 +206,8 @@
 
     /**
      * An interface for supporting dynamic search results
-     *
-     * @param <T> Type of payload
      */
     public interface SearchTargetHandler {
-        /**
-         * Updates View using Adapter's payload
-         */
-
-        default void setup(SearchAdapterItem searchAdapterItem) {
-            Object[] targetInfo = getTargetInfo();
-            if (targetInfo != null) {
-                targetInfo[0] = searchAdapterItem.getSearchSessionId();
-                targetInfo[1] = searchAdapterItem.position;
-            }
-            applySearchTarget(searchAdapterItem.getSearchTarget());
-        }
 
         /**
          * Update view using values from {@link SearchTarget}
@@ -231,34 +215,6 @@
         void applySearchTarget(SearchTarget searchTarget);
 
         /**
-         * Gets object created by {@link SearchTargetHandler#createTargetInfo()}
-         */
-        default Object[] getTargetInfo() {
-            return null;
-        }
-
-        /**
-         * Creates a wrapper object to hold searchSessionId and item position
-         */
-        default Object[] createTargetInfo() {
-            return new Object[2];
-        }
-
-        /**
-         * Generates a SearchTargetEvent object for a PayloadHandlerView
-         */
-        default SearchTargetEvent getSearchTargetEvent(SearchTarget.ItemType itemType,
-                int eventType) {
-            Object[] targetInfo = getTargetInfo();
-            if (targetInfo == null) return null;
-
-            String searchSessionId = (String) targetInfo[0];
-            int position = (int) targetInfo[1];
-            return new SearchTargetEvent(itemType, eventType,
-                    position, searchSessionId);
-        }
-
-        /**
          * Handles selection of SearchTarget
          */
         default void handleSelection(int eventType) {
diff --git a/src/com/android/launcher3/allapps/search/SearchSectionInfo.java b/src/com/android/launcher3/allapps/search/SearchSectionInfo.java
index e026e84..464df68 100644
--- a/src/com/android/launcher3/allapps/search/SearchSectionInfo.java
+++ b/src/com/android/launcher3/allapps/search/SearchSectionInfo.java
@@ -22,7 +22,7 @@
  */
 public class SearchSectionInfo {
 
-    private String mTitle;
+    private String mSectionId;
     private SectionDecorationHandler mDecorationHandler;
 
     public int getPosStart() {
@@ -48,8 +48,8 @@
         this(null);
     }
 
-    public SearchSectionInfo(String title) {
-        mTitle = title;
+    public SearchSectionInfo(String sectionId) {
+        mSectionId = sectionId;
     }
 
     public void setDecorationHandler(SectionDecorationHandler sectionDecorationHandler) {
@@ -62,9 +62,9 @@
     }
 
     /**
-     * Returns the section's title
+     * Returns the section's ID
      */
-    public String getTitle() {
-        return mTitle == null ? "" : mTitle;
+    public String getSectionId() {
+        return mSectionId == null ? "" : mSectionId;
     }
 }
diff --git a/src/com/android/launcher3/views/HeroSearchResultView.java b/src/com/android/launcher3/views/HeroSearchResultView.java
index e2ba93b..a098df9 100644
--- a/src/com/android/launcher3/views/HeroSearchResultView.java
+++ b/src/com/android/launcher3/views/HeroSearchResultView.java
@@ -20,10 +20,8 @@
 import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
 
 import android.content.Context;
-import android.content.Intent;
 import android.content.pm.ShortcutInfo;
 import android.graphics.Point;
-import android.os.Bundle;
 import android.util.AttributeSet;
 import android.util.Pair;
 import android.view.View;
@@ -49,24 +47,28 @@
 import com.android.launcher3.model.data.WorkspaceItemInfo;
 import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider;
 import com.android.launcher3.touch.ItemLongClickListener;
+import com.android.launcher3.util.ComponentKey;
 import com.android.systemui.plugins.shared.SearchTarget;
 import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * A view representing a high confidence app search result that includes shortcuts
+ * TODO (sfufa@) consolidate this with SearchResultIconRow
  */
 public class HeroSearchResultView extends LinearLayout implements DragSource, SearchTargetHandler {
 
+    public static final String TARGET_TYPE_HERO_APP = "hero_app";
+
     public static final int MAX_SHORTCUTS_COUNT = 2;
-    public static final String SHORTCUTS_KEY = "shortcut_infos";
 
+    private SearchTarget mSearchTarget;
+    private BubbleTextView mBubbleTextView;
+    private View mIconView;
+    private BubbleTextView[] mDeepShortcutTextViews = new BubbleTextView[2];
 
-    private final Object[] mTargetInfo = createTargetInfo();
-    BubbleTextView mBubbleTextView;
-    View mIconView;
-    BubbleTextView[] mDeepShortcutTextViews = new BubbleTextView[2];
 
     public HeroSearchResultView(Context context) {
         super(context);
@@ -107,11 +109,9 @@
                             grid.allAppsIconSizePx));
             bubbleTextView.setOnClickListener(view -> {
                 WorkspaceItemInfo itemInfo = (WorkspaceItemInfo) bubbleTextView.getTag();
-                SearchTargetEvent event = getSearchTargetEvent(
-                        SearchTarget.ItemType.APP_HERO,
-                        SearchTargetEvent.CHILD_SELECT);
-                event.bundle = getAppBundle(itemInfo);
-                event.bundle.putString("shortcut_id", itemInfo.getDeepShortcutId());
+                SearchTargetEvent event = new SearchTargetEvent.Builder(mSearchTarget,
+                        SearchTargetEvent.CHILD_SELECT).setShortcutPosition(itemInfo.rank).build();
+                SearchEventTracker.getInstance(getContext()).notifySearchTargetEvent(event);
                 launcher.getItemOnClickListener().onClick(view);
             });
         }
@@ -119,20 +119,20 @@
 
     @Override
     public void applySearchTarget(SearchTarget searchTarget) {
+        mSearchTarget = searchTarget;
         AllAppsStore apps = Launcher.getLauncher(getContext()).getAppsView().getAppsStore();
-        AppInfo appInfo = apps.getAppFromSearchTarget(searchTarget);
-//        TODO: replace this with searchTarget.shortcuts
-        ArrayList<ShortcutInfo> infos = searchTarget.bundle.getParcelableArrayList(
-                SHORTCUTS_KEY);
+        AppInfo appInfo = apps.getApp(new ComponentKey(searchTarget.getComponentName(),
+                searchTarget.getUserHandle()));
+        List<ShortcutInfo> infos = mSearchTarget.getShortcutInfos();
 
         ArrayList<Pair<ShortcutInfo, ItemInfoWithIcon>> shortcuts = new ArrayList<>();
         for (int i = 0; infos != null && i < infos.size() && i < MAX_SHORTCUTS_COUNT; i++) {
             ShortcutInfo shortcutInfo = infos.get(i);
             ItemInfoWithIcon si = new WorkspaceItemInfo(shortcutInfo, getContext());
+            si.rank = i;
             shortcuts.add(new Pair<>(shortcutInfo, si));
         }
 
-
         mBubbleTextView.applyFromApplicationInfo(appInfo);
         mIconView.setBackground(mBubbleTextView.getIcon());
         mIconView.setTag(appInfo);
@@ -155,11 +155,6 @@
     }
 
     @Override
-    public Object[] getTargetInfo() {
-        return mTargetInfo;
-    }
-
-    @Override
     public void onDropCompleted(View target, DropTarget.DragObject d, boolean success) {
         mBubbleTextView.setVisibility(VISIBLE);
         mBubbleTextView.setIconVisible(true);
@@ -194,9 +189,8 @@
             mLauncher.getWorkspace().beginDragShared(mContainer.mBubbleTextView,
                     draggableView, mContainer, itemInfo, previewProvider, new DragOptions());
 
-            SearchTargetEvent event = mContainer.getSearchTargetEvent(
-                    SearchTarget.ItemType.APP_HERO, SearchTargetEvent.LONG_PRESS);
-            event.bundle = getAppBundle(itemInfo);
+            SearchTargetEvent event = new SearchTargetEvent.Builder(mContainer.mSearchTarget,
+                    SearchTargetEvent.LONG_PRESS).build();
             SearchEventTracker.INSTANCE.get(mLauncher).notifySearchTargetEvent(event);
             return false;
         }
@@ -209,19 +203,7 @@
         Launcher launcher = Launcher.getLauncher(getContext());
         launcher.startActivitySafely(this, itemInfo.getIntent(), itemInfo);
 
-        SearchTargetEvent event = getSearchTargetEvent(
-                SearchTarget.ItemType.APP_HERO, eventType);
-        event.bundle = getAppBundle(itemInfo);
-        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(event);
-    }
-
-    /**
-     * Helper method to generate {@link SearchTargetEvent} bundle from {@link ItemInfo}
-     */
-    public static Bundle getAppBundle(ItemInfo itemInfo) {
-        Bundle b = new Bundle();
-        b.putParcelable(Intent.EXTRA_COMPONENT_NAME, itemInfo.getTargetComponent());
-        b.putParcelable(Intent.EXTRA_USER, itemInfo.user);
-        return b;
+        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(
+                new SearchTargetEvent.Builder(mSearchTarget, eventType).build());
     }
 }
diff --git a/src/com/android/launcher3/views/SearchResultIcon.java b/src/com/android/launcher3/views/SearchResultIcon.java
index e0f9ab7..51214ae 100644
--- a/src/com/android/launcher3/views/SearchResultIcon.java
+++ b/src/com/android/launcher3/views/SearchResultIcon.java
@@ -25,8 +25,8 @@
 import com.android.launcher3.allapps.search.AllAppsSearchBarController;
 import com.android.launcher3.allapps.search.SearchEventTracker;
 import com.android.launcher3.model.data.AppInfo;
-import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.touch.ItemLongClickListener;
+import com.android.launcher3.util.ComponentKey;
 import com.android.systemui.plugins.shared.SearchTarget;
 import com.android.systemui.plugins.shared.SearchTargetEvent;
 
@@ -36,7 +36,10 @@
 public class SearchResultIcon extends BubbleTextView implements
         AllAppsSearchBarController.SearchTargetHandler, View.OnClickListener,
         View.OnLongClickListener {
-    private final Object[] mTargetInfo = createTargetInfo();
+
+
+    public static final String TARGET_TYPE_APP = "app";
+
     private final Launcher mLauncher;
 
     private SearchTarget mSearchTarget;
@@ -68,25 +71,17 @@
     public void applySearchTarget(SearchTarget searchTarget) {
         mSearchTarget = searchTarget;
         AllAppsStore appsStore = mLauncher.getAppsView().getAppsStore();
-        if (searchTarget.type == SearchTarget.ItemType.APP) {
-            AppInfo appInfo = appsStore.getAppFromSearchTarget(searchTarget);
+        if (searchTarget.getItemType().equals(TARGET_TYPE_APP)) {
+            AppInfo appInfo = appsStore.getApp(new ComponentKey(searchTarget.getComponentName(),
+                    searchTarget.getUserHandle()));
             applyFromApplicationInfo(appInfo);
         }
     }
 
     @Override
-    public Object[] getTargetInfo() {
-        return mTargetInfo;
-    }
-
-    @Override
     public void handleSelection(int eventType) {
-        SearchTargetEvent event = getSearchTargetEvent(mSearchTarget.type,
-                eventType);
-        if (mSearchTarget.type.equals(SearchTarget.ItemType.APP)) {
-            event.bundle = HeroSearchResultView.getAppBundle((ItemInfo) getTag());
-        }
-        SearchEventTracker.INSTANCE.get(mLauncher).notifySearchTargetEvent(event);
+        SearchEventTracker.INSTANCE.get(mLauncher).notifySearchTargetEvent(
+                new SearchTargetEvent.Builder(mSearchTarget, eventType).build());
     }
 
     @Override
diff --git a/src/com/android/launcher3/views/SearchResultIconRow.java b/src/com/android/launcher3/views/SearchResultIconRow.java
index 5115f69..5fb36b9 100644
--- a/src/com/android/launcher3/views/SearchResultIconRow.java
+++ b/src/com/android/launcher3/views/SearchResultIconRow.java
@@ -26,7 +26,6 @@
 import android.graphics.Canvas;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
-import android.os.Bundle;
 import android.util.AttributeSet;
 import android.widget.EditText;
 
@@ -47,7 +46,6 @@
 import com.android.launcher3.touch.ItemClickHandler;
 import com.android.launcher3.util.Themes;
 import com.android.systemui.plugins.shared.SearchTarget;
-import com.android.systemui.plugins.shared.SearchTarget.ItemType;
 import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 /**
@@ -56,11 +54,19 @@
 public class SearchResultIconRow extends DoubleShadowBubbleTextView implements
         AllAppsSearchBarController.SearchTargetHandler {
 
-    private final Object[] mTargetInfo = createTargetInfo();
+
+    public static final String TARGET_TYPE_REMOTE_ACTION = "remote_action";
+    public static final String TARGET_TYPE_SUGGEST = "suggest";
+    public static final String TARGET_TYPE_SHORTCUT = "shortcut";
+
+
+    public static final String REMOTE_ACTION_SHOULD_START = "should_start_for_result";
+    public static final String REMOTE_ACTION_TOKEN = "action_token";
+
     private final int mCustomIconResId;
     private final boolean mMatchesInset;
 
-    private ShortcutInfo mShortcutInfo;
+    private SearchTarget mSearchTarget;
 
 
     public SearchResultIconRow(@NonNull Context context) {
@@ -109,26 +115,28 @@
 
     @Override
     public void applySearchTarget(SearchTarget searchTarget) {
-        if (searchTarget.mRemoteAction != null) {
-            prepareUsingRemoteAction(searchTarget.mRemoteAction,
-                    searchTarget.bundle.getString(SearchTarget.REMOTE_ACTION_TOKEN),
-                    searchTarget.bundle.getBoolean(SearchTarget.REMOTE_ACTION_SHOULD_START),
-                    searchTarget.type == ItemType.ACTION);
-        } else {
-            prepareUsingShortcutInfo(searchTarget.shortcuts.get(0));
+        mSearchTarget = searchTarget;
+        String type = searchTarget.getItemType();
+        if (type.equals(TARGET_TYPE_REMOTE_ACTION) || type.equals(TARGET_TYPE_SUGGEST)) {
+            prepareUsingRemoteAction(searchTarget.getRemoteAction(),
+                    searchTarget.getExtras().getString(REMOTE_ACTION_TOKEN),
+                    searchTarget.getExtras().getBoolean(REMOTE_ACTION_SHOULD_START),
+                    type.equals(TARGET_TYPE_SUGGEST));
+
+        } else if (type.equals(TARGET_TYPE_SHORTCUT)) {
+            prepareUsingShortcutInfo(searchTarget.getShortcutInfos().get(0));
         }
         setOnClickListener(v -> handleSelection(SearchTargetEvent.SELECT));
         SearchEventTracker.INSTANCE.get(getContext()).registerWeakHandler(searchTarget, this);
     }
 
     private void prepareUsingShortcutInfo(ShortcutInfo shortcutInfo) {
-        mShortcutInfo = shortcutInfo;
-        WorkspaceItemInfo workspaceItemInfo = new WorkspaceItemInfo(mShortcutInfo, getContext());
+        WorkspaceItemInfo workspaceItemInfo = new WorkspaceItemInfo(shortcutInfo, getContext());
         applyFromWorkspaceItem(workspaceItemInfo);
         LauncherAppState launcherAppState = LauncherAppState.getInstance(getContext());
         if (!loadIconFromResource()) {
             MODEL_EXECUTOR.execute(() -> {
-                launcherAppState.getIconCache().getShortcutIcon(workspaceItemInfo, mShortcutInfo);
+                launcherAppState.getIconCache().getShortcutIcon(workspaceItemInfo, shortcutInfo);
                 reapplyItemInfoAsync(workspaceItemInfo);
             });
         }
@@ -174,32 +182,15 @@
     }
 
     @Override
-    public Object[] getTargetInfo() {
-        return mTargetInfo;
-    }
-
-    @Override
     public void handleSelection(int eventType) {
         ItemInfo itemInfo = (ItemInfo) getTag();
         Launcher launcher = Launcher.getLauncher(getContext());
-        final SearchTargetEvent searchTargetEvent;
         if (itemInfo instanceof WorkspaceItemInfo) {
             ItemClickHandler.onClickAppShortcut(this, (WorkspaceItemInfo) itemInfo, launcher);
-            searchTargetEvent = getSearchTargetEvent(SearchTarget.ItemType.SHORTCUT,
-                    eventType);
-            searchTargetEvent.shortcut = mShortcutInfo;
         } else {
-            RemoteActionItemInfo remoteItemInfo = (RemoteActionItemInfo) itemInfo;
-            ItemClickHandler.onClickRemoteAction(launcher, remoteItemInfo);
-            searchTargetEvent = getSearchTargetEvent(ItemType.ACTION,
-                    eventType);
-            searchTargetEvent.bundle = new Bundle();
-            searchTargetEvent.remoteAction = remoteItemInfo.getRemoteAction();
-            searchTargetEvent.bundle.putBoolean(SearchTarget.REMOTE_ACTION_SHOULD_START,
-                    remoteItemInfo.shouldStartInLauncher());
-            searchTargetEvent.bundle.putString(SearchTarget.REMOTE_ACTION_TOKEN,
-                    remoteItemInfo.getToken());
+            ItemClickHandler.onClickRemoteAction(launcher, (RemoteActionItemInfo) itemInfo);
         }
-        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(searchTargetEvent);
+        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(
+                new SearchTargetEvent.Builder(mSearchTarget, eventType).build());
     }
 }
diff --git a/src/com/android/launcher3/views/SearchResultPeopleView.java b/src/com/android/launcher3/views/SearchResultPeopleView.java
index 18bc99a..e499bd5 100644
--- a/src/com/android/launcher3/views/SearchResultPeopleView.java
+++ b/src/com/android/launcher3/views/SearchResultPeopleView.java
@@ -57,6 +57,8 @@
 public class SearchResultPeopleView extends LinearLayout implements
         AllAppsSearchBarController.SearchTargetHandler {
 
+    public static final String TARGET_TYPE_PEOPLE = "people";
+
     private final int mIconSize;
     private final int mButtonSize;
     private final PackageManager mPackageManager;
@@ -64,7 +66,9 @@
     private TextView mTitleView;
     private ImageButton[] mProviderButtons = new ImageButton[3];
     private Intent mIntent;
-    private final Object[] mTargetInfo = createTargetInfo();
+
+
+    private SearchTarget mSearchTarget;
 
     public SearchResultPeopleView(Context context) {
         this(context, null, 0);
@@ -102,7 +106,8 @@
 
     @Override
     public void applySearchTarget(SearchTarget searchTarget) {
-        Bundle payload = searchTarget.bundle;
+        mSearchTarget = searchTarget;
+        Bundle payload = searchTarget.getExtras();
         mTitleView.setText(payload.getString("title"));
         mIntent = payload.getParcelable("intent");
         Bitmap contactIcon = payload.getParcelable("icon");
@@ -176,23 +181,15 @@
         }
     }
 
-    @Override
-    public Object[] getTargetInfo() {
-        return mTargetInfo;
-    }
-
     private void setupProviderButton(ImageButton button, Bundle provider, Intent intent) {
         Launcher launcher = Launcher.getLauncher(getContext());
         button.setOnClickListener(b -> {
             launcher.startActivitySafely(b, intent, null);
-            SearchTargetEvent event = getSearchTargetEvent(
-                    SearchTarget.ItemType.PEOPLE,
-                    SearchTargetEvent.CHILD_SELECT);
-            event.bundle = new Bundle();
-            event.bundle.putParcelable("intent", intent);
-            event.bundle.putString("title", mTitleView.getText().toString());
-            event.bundle.putBundle("provider", provider);
-            SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(event);
+            Bundle bundle = new Bundle();
+            bundle.putBundle("provider", provider);
+            SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(
+                    new SearchTargetEvent.Builder(mSearchTarget,
+                            SearchTargetEvent.CHILD_SELECT).setExtras(bundle).build());
         });
     }
 
@@ -201,12 +198,8 @@
         if (mIntent != null) {
             Launcher launcher = Launcher.getLauncher(getContext());
             launcher.startActivitySafely(this, mIntent, null);
-            SearchTargetEvent event = getSearchTargetEvent(SearchTarget.ItemType.PEOPLE,
-                    eventType);
-            event.bundle = new Bundle();
-            event.bundle.putParcelable("intent", mIntent);
-            event.bundle.putString("title", mTitleView.getText().toString());
-            SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(event);
+            SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(
+                    new SearchTargetEvent.Builder(mSearchTarget, eventType).build());
         }
     }
 }
diff --git a/src/com/android/launcher3/views/SearchResultPlayItem.java b/src/com/android/launcher3/views/SearchResultPlayItem.java
index 39a8304..6d85955 100644
--- a/src/com/android/launcher3/views/SearchResultPlayItem.java
+++ b/src/com/android/launcher3/views/SearchResultPlayItem.java
@@ -58,11 +58,12 @@
 public class SearchResultPlayItem extends LinearLayout implements
         AllAppsSearchBarController.SearchTargetHandler {
 
+    public static final String TARGET_TYPE_PLAY = "play";
+
     private static final int BITMAP_CROP_MASK_COLOR = 0xff424242;
     final Paint mIconPaint = new Paint();
     final Rect mTempRect = new Rect();
     private final DeviceProfile mDeviceProfile;
-    private final Object[] mTargetInfo = createTargetInfo();
     private View mIconView;
     private TextView mTitleView;
     private TextView[] mDetailViews = new TextView[3];
@@ -70,6 +71,8 @@
     private String mPackageName;
     private boolean mIsInstantGame;
 
+    private SearchTarget mSearchTarget;
+
 
     public SearchResultPlayItem(Context context) {
         this(context, null, 0);
@@ -128,7 +131,8 @@
 
     @Override
     public void applySearchTarget(SearchTarget searchTarget) {
-        Bundle bundle = searchTarget.bundle;
+        mSearchTarget = searchTarget;
+        Bundle bundle = searchTarget.getExtras();
         SearchEventTracker.INSTANCE.get(getContext()).registerWeakHandler(searchTarget, this);
         if (bundle.getString("package", "").equals(mPackageName)) {
             return;
@@ -160,11 +164,6 @@
         });
     }
 
-    @Override
-    public Object[] getTargetInfo() {
-        return mTargetInfo;
-    }
-
     private void showIfNecessary(TextView textView, @Nullable String string) {
         if (string == null || string.isEmpty()) {
             textView.setVisibility(GONE);
@@ -201,10 +200,7 @@
     }
 
     private void logSearchEvent(int eventType) {
-        SearchTargetEvent searchTargetEvent = getSearchTargetEvent(
-                SearchTarget.ItemType.PLAY_RESULTS, eventType);
-        searchTargetEvent.bundle = new Bundle();
-        searchTargetEvent.bundle.putString("package_name", mPackageName);
-        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(searchTargetEvent);
+        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(
+                new SearchTargetEvent.Builder(mSearchTarget, eventType).build());
     }
 }
diff --git a/src/com/android/launcher3/views/SearchSectionHeaderView.java b/src/com/android/launcher3/views/SearchSectionHeaderView.java
index 370b921..326c23d 100644
--- a/src/com/android/launcher3/views/SearchSectionHeaderView.java
+++ b/src/com/android/launcher3/views/SearchSectionHeaderView.java
@@ -29,6 +29,8 @@
  */
 public class SearchSectionHeaderView extends TextView implements
         AllAppsSearchBarController.SearchTargetHandler {
+    public static final String TARGET_TYPE_SECTION_HEADER = "section_header";
+
     public SearchSectionHeaderView(Context context) {
         super(context);
     }
@@ -44,7 +46,7 @@
 
     @Override
     public void applySearchTarget(SearchTarget searchTarget) {
-        String title = searchTarget.type.getTitle();
+        String title = searchTarget.getExtras().getString("title");
         if (title == null || !title.isEmpty()) {
             setText(title);
             setVisibility(VISIBLE);
@@ -52,9 +54,4 @@
             setVisibility(INVISIBLE);
         }
     }
-
-    @Override
-    public Object[] getTargetInfo() {
-        return null;
-    }
 }
diff --git a/src/com/android/launcher3/views/SearchSettingsRowView.java b/src/com/android/launcher3/views/SearchSettingsRowView.java
index ac69548..30f686c 100644
--- a/src/com/android/launcher3/views/SearchSettingsRowView.java
+++ b/src/com/android/launcher3/views/SearchSettingsRowView.java
@@ -42,11 +42,14 @@
 public class SearchSettingsRowView extends LinearLayout implements
         View.OnClickListener, AllAppsSearchBarController.SearchTargetHandler {
 
+    public static final String TARGET_TYPE_SETTINGS_ROW = "settings_row";
+
+
     private TextView mTitleView;
     private TextView mDescriptionView;
     private TextView mBreadcrumbsView;
     private Intent mIntent;
-    private final Object[] mTargetInfo = createTargetInfo();
+    private SearchTarget mSearchTarget;
 
 
     public SearchSettingsRowView(@NonNull Context context) {
@@ -74,7 +77,8 @@
 
     @Override
     public void applySearchTarget(SearchTarget searchTarget) {
-        Bundle bundle = searchTarget.bundle;
+        mSearchTarget = searchTarget;
+        Bundle bundle = searchTarget.getExtras();
         mIntent = bundle.getParcelable("intent");
         showIfAvailable(mTitleView, bundle.getString("title"));
         showIfAvailable(mDescriptionView, bundle.getString("description"));
@@ -85,11 +89,6 @@
         SearchEventTracker.INSTANCE.get(getContext()).registerWeakHandler(searchTarget, this);
     }
 
-    @Override
-    public Object[] getTargetInfo() {
-        return mTargetInfo;
-    }
-
     private void showIfAvailable(TextView view, @Nullable String string) {
         if (TextUtils.isEmpty(string)) {
             view.setVisibility(GONE);
@@ -112,10 +111,7 @@
         Launcher launcher = Launcher.getLauncher(getContext());
         launcher.startActivityForResult(mIntent, 0);
 
-        SearchTargetEvent searchTargetEvent = getSearchTargetEvent(
-                SearchTarget.ItemType.SETTINGS_ROW, eventType);
-        searchTargetEvent.bundle = new Bundle();
-        searchTargetEvent.bundle.putParcelable("intent", mIntent);
-        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(searchTargetEvent);
+        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(
+                new SearchTargetEvent.Builder(mSearchTarget, eventType).build());
     }
 }
diff --git a/src/com/android/launcher3/views/SearchSliceWrapper.java b/src/com/android/launcher3/views/SearchSliceWrapper.java
index b088237..f8a7dc0 100644
--- a/src/com/android/launcher3/views/SearchSliceWrapper.java
+++ b/src/com/android/launcher3/views/SearchSliceWrapper.java
@@ -17,7 +17,6 @@
 
 import android.content.Context;
 import android.net.Uri;
-import android.os.Bundle;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
@@ -38,6 +37,8 @@
  */
 public class SearchSliceWrapper implements SliceView.OnSliceActionListener {
 
+    public static final String TARGET_TYPE_SLICE = "settings_slice";
+
     private static final String TAG = "SearchSliceController";
     private static final String URI_EXTRA_KEY = "slice_uri";
 
@@ -45,16 +46,10 @@
     private final Launcher mLauncher;
     private final SearchTarget mSearchTarget;
     private final SliceView mSliceView;
-    //TODO: remove these as we move to tracking search results individually with unique ID
-    private final int mPosition;
-    private final String mSessionId;
     private LiveData<Slice> mSliceLiveData;
 
-    public SearchSliceWrapper(Context context, SliceView sliceView,
-            SearchTarget searchTarget, String sessionId, int position) {
+    public SearchSliceWrapper(Context context, SliceView sliceView, SearchTarget searchTarget) {
         mLauncher = Launcher.getLauncher(context);
-        mPosition = position;
-        mSessionId = sessionId;
         mSearchTarget = searchTarget;
         mSliceView = sliceView;
         sliceView.setOnSliceActionListener(this);
@@ -76,16 +71,12 @@
 
     @Override
     public void onSliceAction(@NonNull EventInfo info, @NonNull SliceItem item) {
-        SearchTargetEvent searchTargetEvent = new SearchTargetEvent(
-                SearchTarget.ItemType.SETTINGS_SLICE,
-                SearchTargetEvent.CHILD_SELECT, mPosition,
-                mSessionId);
-        searchTargetEvent.bundle = new Bundle();
-        searchTargetEvent.bundle.putParcelable(URI_EXTRA_KEY, getSliceUri());
-        SearchEventTracker.INSTANCE.get(mLauncher).notifySearchTargetEvent(searchTargetEvent);
+        SearchEventTracker.INSTANCE.get(mLauncher).notifySearchTargetEvent(
+                new SearchTargetEvent.Builder(mSearchTarget,
+                        SearchTargetEvent.CHILD_SELECT).build());
     }
 
     private Uri getSliceUri() {
-        return mSearchTarget.bundle.getParcelable(URI_EXTRA_KEY);
+        return mSearchTarget.getExtras().getParcelable(URI_EXTRA_KEY);
     }
 }
diff --git a/src/com/android/launcher3/views/ThumbnailSearchResultView.java b/src/com/android/launcher3/views/ThumbnailSearchResultView.java
index 2121232..d11b1ef 100644
--- a/src/com/android/launcher3/views/ThumbnailSearchResultView.java
+++ b/src/com/android/launcher3/views/ThumbnailSearchResultView.java
@@ -15,6 +15,9 @@
  */
 package com.android.launcher3.views;
 
+import static com.android.launcher3.views.SearchResultIconRow.REMOTE_ACTION_SHOULD_START;
+import static com.android.launcher3.views.SearchResultIconRow.REMOTE_ACTION_TOKEN;
+
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
@@ -42,7 +45,10 @@
 public class ThumbnailSearchResultView extends androidx.appcompat.widget.AppCompatImageView
         implements AllAppsSearchBarController.SearchTargetHandler {
 
-    private final Object[] mTargetInfo = createTargetInfo();
+    public static final String TARGET_TYPE_SCREENSHOT = "screenshot";
+    public static final String TARGET_TYPE_SCREENSHOT_LEGACY = "screenshot_legacy";
+
+    private SearchTarget mSearchTarget;
 
     public ThumbnailSearchResultView(Context context) {
         super(context);
@@ -66,29 +72,29 @@
         } else {
             ItemClickHandler.onClickAppShortcut(this, (WorkspaceItemInfo) itemInfo, launcher);
         }
-        SearchTargetEvent e = getSearchTargetEvent(SearchTarget.ItemType.SCREENSHOT, eventType);
-        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(e);
+        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(
+                new SearchTargetEvent.Builder(mSearchTarget, eventType).build());
     }
 
     @Override
     public void applySearchTarget(SearchTarget target) {
+        mSearchTarget = target;
         Bitmap bitmap;
-        if (target.mRemoteAction != null) {
-            RemoteActionItemInfo itemInfo = new RemoteActionItemInfo(target.mRemoteAction,
-                    target.bundle.getString(SearchTarget.REMOTE_ACTION_TOKEN),
-                    target.bundle.getBoolean(SearchTarget.REMOTE_ACTION_SHOULD_START));
-            bitmap = ((BitmapDrawable) target.mRemoteAction.getIcon()
+        if (target.getRemoteAction() != null) {
+            RemoteActionItemInfo itemInfo = new RemoteActionItemInfo(target.getRemoteAction(),
+                    target.getExtras().getString(REMOTE_ACTION_TOKEN),
+                    target.getExtras().getBoolean(REMOTE_ACTION_SHOULD_START));
+            bitmap = ((BitmapDrawable) target.getRemoteAction().getIcon()
                     .loadDrawable(getContext())).getBitmap();
-            Bitmap crop = Bitmap.createBitmap(bitmap, 0,
+            // crop
+            bitmap = Bitmap.createBitmap(bitmap, 0,
                     bitmap.getHeight() / 2 - bitmap.getWidth() / 2,
                     bitmap.getWidth(), bitmap.getWidth());
-            bitmap = crop;
-            setTag(itemInfo);
         } else {
-            bitmap = (Bitmap) target.bundle.getParcelable("bitmap");
+            bitmap = (Bitmap) target.getExtras().getParcelable("bitmap");
             WorkspaceItemInfo itemInfo = new WorkspaceItemInfo();
             itemInfo.intent = new Intent(Intent.ACTION_VIEW)
-                    .setData(Uri.parse(target.bundle.getString("uri")))
+                    .setData(Uri.parse(target.getExtras().getString("uri")))
                     .setType("image/*")
                     .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             setTag(itemInfo);
@@ -99,9 +105,4 @@
         setOnClickListener(v -> handleSelection(SearchTargetEvent.SELECT));
         SearchEventTracker.INSTANCE.get(getContext()).registerWeakHandler(target, this);
     }
-
-    @Override
-    public Object[] getTargetInfo() {
-        return mTargetInfo;
-    }
 }
diff --git a/src_plugins/com/android/systemui/plugins/shared/SearchTarget.java b/src_plugins/com/android/systemui/plugins/shared/SearchTarget.java
index 3f0dc39..2c7972e 100644
--- a/src_plugins/com/android/systemui/plugins/shared/SearchTarget.java
+++ b/src_plugins/com/android/systemui/plugins/shared/SearchTarget.java
@@ -16,8 +16,10 @@
 package com.android.systemui.plugins.shared;
 
 import android.app.RemoteAction;
+import android.content.ComponentName;
 import android.content.pm.ShortcutInfo;
 import android.os.Bundle;
+import android.os.UserHandle;
 
 import java.util.List;
 
@@ -26,139 +28,145 @@
  */
 public class SearchTarget implements Comparable<SearchTarget> {
 
+    private final String mItemId;
+    private final String mItemType;
+    private final float mScore;
 
-    /**
-     * A bundle key for boolean value of whether remote action should be started in launcher or not
-     */
-    public static final String REMOTE_ACTION_SHOULD_START = "should_start_for_result";
-    public static final String REMOTE_ACTION_TOKEN = "action_token";
+    private final ComponentName mComponentName;
+    private final UserHandle mUserHandle;
+    private final List<ShortcutInfo> mShortcutInfos;
+    //TODO: (sfufa) replace with a list of a custom type
+    private final RemoteAction mRemoteAction;
+    private final Bundle mExtras;
 
-
-    public enum ViewType {
-
-        /**
-         * Consists of N number of icons. (N: launcher column count)
-         */
-        TOP_HIT(0),
-
-        /**
-         * Consists of 1 icon and two subsidiary icons.
-         */
-        HERO(1),
-
-        /**
-         * Main/sub/breadcrumb texts are rendered.
-         */
-        DETAIL(2),
-
-        /**
-         * Consists of an icon, three detail strings.
-         */
-        ROW(3),
-
-        /**
-         * Consists of an icon, three detail strings and a button.
-         */
-        ROW_WITH_BUTTON(4),
-
-        /**
-         * Consists of a single slice view
-         */
-        SLICE(5),
-
-        /**
-         * Similar to hero section.
-         */
-        SHORTCUT(6),
-
-        /**
-         * Person icon and handling app icons are rendered.
-         */
-        PEOPLE(7),
-
-        /**
-         * N number of 1x1 ratio thumbnail is rendered.
-         * (current N = 3)
-         */
-        THUMBNAIL(8),
-
-        /**
-         * Fallback search icon and relevant text is rendered.
-         */
-        SUGGEST(9);
-
-        private final int mId;
-
-        ViewType(int id) {
-            mId = id;
-        }
-
-        public int get() {
-            return mId;
-        }
+    private SearchTarget(String itemId, String itemType, float score,
+            ComponentName componentName, UserHandle userHandle, List<ShortcutInfo> shortcutInfos,
+            RemoteAction remoteAction, Bundle extras) {
+        mItemId = itemId;
+        mItemType = itemType;
+        mScore = score;
+        mComponentName = componentName;
+        mUserHandle = userHandle;
+        mShortcutInfos = shortcutInfos;
+        mExtras = extras;
+        mRemoteAction = remoteAction;
     }
 
-    public enum ItemType {
-        PLAY_RESULTS(0, "Play Store", ViewType.DETAIL),
-        SETTINGS_ROW(1, "Settings", ViewType.ROW),
-        SETTINGS_SLICE(2, "Settings", ViewType.SLICE),
-        APP(3, "", ViewType.TOP_HIT),
-        APP_HERO(4, "", ViewType.HERO),
-        SHORTCUT(5, "Shortcuts", ViewType.SHORTCUT),
-        PEOPLE(6, "People", ViewType.PEOPLE),
-        SCREENSHOT(7, "Screenshots", ViewType.THUMBNAIL),
-        ACTION(8, "Actions", ViewType.SHORTCUT),
-        SUGGEST(9, "Fallback Search", ViewType.SUGGEST),
-        CHROME_TAB(10, "Chrome Tab", ViewType.SHORTCUT);
-
-        private final int mId;
-
-        /** Used to render section title. */
-        private final String mTitle;
-        private final ViewType mViewType;
-
-        ItemType(int id, String title, ViewType type) {
-            mId = id;
-            mTitle = title;
-            mViewType = type;
-        }
-
-        public ViewType getViewType() {
-            return mViewType;
-        }
-
-        public String getTitle() {
-            return mTitle;
-        }
-
-        public int getId() {
-            return mId;
-        }
+    public String getItemId() {
+        return mItemId;
     }
 
-    public ItemType type;
-    public List<ShortcutInfo> shortcuts;
-    public Bundle bundle;
-    public float score;
-    public String mSessionId;
-    public RemoteAction mRemoteAction;
+    public String getItemType() {
+        return mItemType;
+    }
 
-    /**
-     * Constructor to create the search target. Bundle is currently temporary to hold
-     * search target primitives that cannot be expressed as java primitive objects
-     * or AOSP native objects.
-     */
-    public SearchTarget(ItemType itemType, List<ShortcutInfo> shortcuts,
-            Bundle bundle, float score, String sessionId) {
-        this.type = itemType;
-        this.shortcuts = shortcuts;
-        this.bundle = bundle;
-        this.score = score;
-        this.mSessionId = sessionId;
+    public ComponentName getComponentName() {
+        return mComponentName;
+    }
+
+    public UserHandle getUserHandle() {
+        return mUserHandle;
+    }
+
+    public float getScore() {
+        return mScore;
+    }
+
+    public List<ShortcutInfo> getShortcutInfos() {
+        return mShortcutInfos;
+    }
+
+    public Bundle getExtras() {
+        return mExtras;
+    }
+
+    public RemoteAction getRemoteAction() {
+        return mRemoteAction;
     }
 
     @Override
     public int compareTo(SearchTarget o) {
-        return Float.compare(o.score, score);
+        return Float.compare(o.mScore, mScore);
+    }
+
+    /**
+     * A builder for {@link SearchTarget}
+     */
+    public static final class Builder {
+
+
+        private String mItemId;
+
+        private final String mItemType;
+        private final float mScore;
+
+
+        private ComponentName mComponentName;
+        private UserHandle mUserHandle;
+        private List<ShortcutInfo> mShortcutInfos;
+        private Bundle mExtras;
+        private RemoteAction mRemoteAction;
+
+        public Builder(String itemType, float score) {
+            this(itemType, score, null, null);
+        }
+
+        public Builder(String itemType, float score, ComponentName cn,
+                UserHandle user) {
+            mItemType = itemType;
+            mScore = score;
+            mComponentName = cn;
+            mUserHandle = user;
+        }
+
+        public String getItemId() {
+            return mItemId;
+        }
+
+        public float getScore() {
+            return mScore;
+        }
+
+        public Builder setItemId(String itemId) {
+            mItemId = itemId;
+            return this;
+        }
+
+        public Builder setComponentName(ComponentName componentName) {
+            mComponentName = componentName;
+            return this;
+        }
+
+        public Builder setUserHandle(UserHandle userHandle) {
+            mUserHandle = userHandle;
+            return this;
+        }
+
+        public Builder setShortcutInfos(List<ShortcutInfo> shortcutInfos) {
+            mShortcutInfos = shortcutInfos;
+            return this;
+        }
+
+        public Builder setExtras(Bundle extras) {
+            mExtras = extras;
+            return this;
+        }
+
+        public Builder setRemoteAction(RemoteAction remoteAction) {
+            mRemoteAction = remoteAction;
+            return this;
+        }
+
+        /**
+         * Builds a {@link SearchTarget}
+         */
+        public SearchTarget build() {
+            if (mItemId == null) {
+                throw new IllegalStateException("Item ID is required for building SearchTarget");
+            }
+            return new SearchTarget(mItemId, mItemType, mScore, mComponentName, mUserHandle,
+                    mShortcutInfos,
+                    mRemoteAction, mExtras);
+        }
     }
 }
diff --git a/src_plugins/com/android/systemui/plugins/shared/SearchTargetEvent.java b/src_plugins/com/android/systemui/plugins/shared/SearchTargetEvent.java
index 5016abc..290fe54 100644
--- a/src_plugins/com/android/systemui/plugins/shared/SearchTargetEvent.java
+++ b/src_plugins/com/android/systemui/plugins/shared/SearchTargetEvent.java
@@ -15,32 +15,76 @@
  */
 package com.android.systemui.plugins.shared;
 
-import android.app.RemoteAction;
-import android.content.pm.ShortcutInfo;
 import android.os.Bundle;
 
 /**
  * Event used for the feedback loop to the plugin. (and future aiai)
  */
 public class SearchTargetEvent {
+    public static final int POSITION_NONE = -1;
+
     public static final int SELECT = 0;
     public static final int QUICK_SELECT = 1;
     public static final int LONG_PRESS = 2;
     public static final int CHILD_SELECT = 3;
 
-    public SearchTarget.ItemType type;
-    public ShortcutInfo shortcut;
-    public RemoteAction remoteAction;
-    public int eventType;
-    public Bundle bundle;
-    public int index;
-    public String sessionIdentifier;
+    private final SearchTarget mSearchTarget;
+    private final int mEventType;
+    private final int mShortcutPosition;
+    private final Bundle mExtras;
 
-    public SearchTargetEvent(SearchTarget.ItemType itemType, int eventType, int index,
-            String sessionId) {
-        this.type = itemType;
-        this.eventType = eventType;
-        this.index = index;
-        this.sessionIdentifier = sessionId;
+    public SearchTargetEvent(SearchTarget searchTarget, int eventType, int shortcutPosition,
+            Bundle extras) {
+        mSearchTarget = searchTarget;
+        mEventType = eventType;
+        mShortcutPosition = shortcutPosition;
+        mExtras = extras;
     }
+
+
+    public SearchTarget getSearchTarget() {
+        return mSearchTarget;
+    }
+
+    public int getShortcutPosition() {
+        return mShortcutPosition;
+    }
+
+    public int getEventType() {
+        return mEventType;
+    }
+
+    public Bundle getExtras() {
+        return mExtras;
+    }
+
+    /**
+     * A builder for {@link SearchTarget}
+     */
+    public static final class Builder {
+        private final SearchTarget mSearchTarget;
+        private final int mEventType;
+        private int mShortcutPosition = POSITION_NONE;
+        private Bundle mExtras;
+
+        public Builder(SearchTarget searchTarget, int eventType) {
+            mSearchTarget = searchTarget;
+            mEventType = eventType;
+        }
+
+        public Builder setShortcutPosition(int shortcutPosition) {
+            mShortcutPosition = shortcutPosition;
+            return this;
+        }
+
+        public Builder setExtras(Bundle extras) {
+            mExtras = extras;
+            return this;
+        }
+
+        public SearchTargetEvent build() {
+            return new SearchTargetEvent(mSearchTarget, mEventType, mShortcutPosition, mExtras);
+        }
+    }
+
 }
