diff --git a/src/com/android/customization/model/ResourcesApkProvider.java b/src/com/android/customization/model/ResourcesApkProvider.java
index f770dbc..92e03b9 100644
--- a/src/com/android/customization/model/ResourcesApkProvider.java
+++ b/src/com/android/customization/model/ResourcesApkProvider.java
@@ -25,8 +25,8 @@
             Resources apkResources = null;
             try {
                 PackageManager pm = mContext.getPackageManager();
-                ApplicationInfo stubAppInfo = pm.getApplicationInfo(
-                        mStubPackageName, PackageManager.GET_META_DATA);
+                ApplicationInfo stubAppInfo = pm.getApplicationInfo(mStubPackageName,
+                        PackageManager.GET_META_DATA | PackageManager.MATCH_SYSTEM_ONLY);
                 if (stubAppInfo != null) {
                     apkResources = pm.getResourcesForApplication(stubAppInfo);
                 }
diff --git a/src/com/android/customization/module/StatsLogUserEventLogger.java b/src/com/android/customization/module/StatsLogUserEventLogger.java
index b77d7dc..37c64ac 100644
--- a/src/com/android/customization/module/StatsLogUserEventLogger.java
+++ b/src/com/android/customization/module/StatsLogUserEventLogger.java
@@ -39,32 +39,33 @@
 public class StatsLogUserEventLogger extends NoOpUserEventLogger implements ThemesUserEventLogger {
 
     private static final String TAG = "StatsLogUserEventLogger";
+    private static final int CODE = 179;
 
     @Override
     public void logResumed(boolean provisioned, boolean wallpaper) {
-        StatsLogCompat.write(StyleEnums.ONRESUME, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        WallpaperStatsLog.write(CODE, StyleEnums.ONRESUME, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logStopped() {
-        StatsLogCompat.write(StyleEnums.ONSTOP, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        WallpaperStatsLog.write(CODE, StyleEnums.ONSTOP, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logActionClicked(String collectionId, int actionLabelResId) {
-        StatsLogCompat.write(StyleEnums.WALLPAPER_EXPLORE, 0, 0, 0, 0, 0, collectionId.hashCode(),
+        WallpaperStatsLog.write(CODE, StyleEnums.WALLPAPER_EXPLORE, 0, 0, 0, 0, 0, collectionId.hashCode(),
                 0, 0, 0);
     }
 
     @Override
     public void logIndividualWallpaperSelected(String collectionId) {
-        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT, 0, 0, 0, 0, 0, 0,
+        WallpaperStatsLog.write(CODE, StyleEnums.WALLPAPER_SELECT, 0, 0, 0, 0, 0, 0,
                 collectionId.hashCode(), 0, 0);
     }
 
     @Override
     public void logCategorySelected(String collectionId) {
-        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
+        WallpaperStatsLog.write(CODE, StyleEnums.WALLPAPER_SELECT,
                 0, 0, 0, 0, 0,
                 collectionId.hashCode(),
                 0, 0, 0);
@@ -72,7 +73,7 @@
 
     @Override
     public void logWallpaperSet(String collectionId, @Nullable String wallpaperId) {
-        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
+        WallpaperStatsLog.write(CODE, StyleEnums.WALLPAPER_SELECT,
                 0, 0, 0, 0, 0,
                 collectionId.hashCode(),
                 0, 0, 0);
@@ -86,7 +87,7 @@
 
     @Override
     public void logThemeSelected(ThemeBundle theme, boolean isCustomTheme) {
-        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
+        WallpaperStatsLog.write(CODE, StyleEnums.PICKER_SELECT,
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
                 Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
@@ -95,7 +96,7 @@
 
     @Override
     public void logThemeApplied(ThemeBundle theme, boolean isCustomTheme) {
-        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
+        WallpaperStatsLog.write(CODE, StyleEnums.PICKER_APPLIED,
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
                 Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
@@ -104,7 +105,7 @@
 
     @Override
     public void logClockSelected(Clockface clock) {
-        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
+        WallpaperStatsLog.write(CODE, StyleEnums.PICKER_SELECT,
                 0, 0, 0,
                 Objects.hashCode(clock.getId()),
                 0, 0, 0, 0, 0);
@@ -112,7 +113,7 @@
 
     @Override
     public void logClockApplied(Clockface clock) {
-        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
+        WallpaperStatsLog.write(CODE, StyleEnums.PICKER_APPLIED,
                 0, 0, 0,
                 Objects.hashCode(clock.getId()),
                 0, 0, 0, 0, 0);
@@ -120,7 +121,7 @@
 
     @Override
     public void logGridSelected(GridOption grid) {
-        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
+        WallpaperStatsLog.write(CODE, StyleEnums.PICKER_SELECT,
                 0, 0, 0, 0,
                 grid.cols,
                 0, 0, 0, 0);
@@ -128,7 +129,7 @@
 
     @Override
     public void logGridApplied(GridOption grid) {
-        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
+        WallpaperStatsLog.write(CODE, StyleEnums.PICKER_APPLIED,
                 0, 0, 0, 0,
                 grid.cols,
                 0, 0, 0, 0);
diff --git a/src/com/android/customization/module/WallpaperStatsLog.java b/src/com/android/customization/module/WallpaperStatsLog.java
new file mode 100644
index 0000000..9f5761f
--- /dev/null
+++ b/src/com/android/customization/module/WallpaperStatsLog.java
@@ -0,0 +1,147 @@
+// This file is autogenerated
+
+package com.android.customization.module;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import android.util.StatsLog;
+import android.os.SystemClock;
+
+import java.util.ArrayList;
+
+
+/**
+ * Utility class for logging statistics events.
+ */
+public class WallpaperStatsLog {
+    private static final int LOGGER_ENTRY_MAX_PAYLOAD = 4068;
+    private static final int MAX_EVENT_PAYLOAD = LOGGER_ENTRY_MAX_PAYLOAD - 4;
+    private static final byte INT_TYPE = 0;
+    private static final byte LONG_TYPE = 1;
+    private static final byte STRING_TYPE = 2;
+    private static final byte LIST_TYPE = 3;
+    private static final byte FLOAT_TYPE = 4;
+    private static final int INT_TYPE_SIZE = 5;
+    private static final int FLOAT_TYPE_SIZE = 5;
+    private static final int LONG_TYPE_SIZE = 9;
+    private static final int STRING_TYPE_OVERHEAD = 5;
+    private static final int LIST_TYPE_OVERHEAD = 2;
+    // Constants for atom codes.
+
+    /**
+     * StyleUIChanged style_ui_changed<br>
+     * Usage: StatsLog.write(StatsLog.STYLE_UI_CHANGED, int action, int color_package_hash, int font_package_hash, int shape_package_hash, int clock_package_hash, int launcher_grid, int wallpaper_category_hash, int wallpaper_id_hash, int color_preference, int location_preference);<br>
+     */
+    public static final int STYLE_UI_CHANGED = 179;
+
+    // Constants for enum values.
+
+    // Values for StyleUIChanged.action
+    public static final int STYLE_UICHANGED__ACTION__DEFAULT_ACTION = 0;
+    public static final int STYLE_UICHANGED__ACTION__ONRESUME = 1;
+    public static final int STYLE_UICHANGED__ACTION__ONSTOP = 2;
+    public static final int STYLE_UICHANGED__ACTION__PICKER_SELECT = 3;
+    public static final int STYLE_UICHANGED__ACTION__PICKER_APPLIED = 4;
+    public static final int STYLE_UICHANGED__ACTION__WALLPAPER_OPEN_CATEGORY = 5;
+    public static final int STYLE_UICHANGED__ACTION__WALLPAPER_SELECT = 6;
+    public static final int STYLE_UICHANGED__ACTION__WALLPAPER_APPLIED = 7;
+    public static final int STYLE_UICHANGED__ACTION__WALLPAPER_EXPLORE = 8;
+    public static final int STYLE_UICHANGED__ACTION__WALLPAPER_DOWNLOAD = 9;
+    public static final int STYLE_UICHANGED__ACTION__WALLPAPER_REMOVE = 10;
+    public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DOWNLOAD_SUCCESS = 11;
+    public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DOWNLOAD_FAILED = 12;
+    public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DOWNLOAD_CANCELLED = 13;
+    public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DELETE_SUCCESS = 14;
+    public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_DELETE_FAILED = 15;
+    public static final int STYLE_UICHANGED__ACTION__LIVE_WALLPAPER_APPLIED = 16;
+
+    // Values for StyleUIChanged.location_preference
+    public static final int STYLE_UICHANGED__LOCATION_PREFERENCE__LOCATION_PREFERENCE_UNSPECIFIED = 0;
+    public static final int STYLE_UICHANGED__LOCATION_PREFERENCE__LOCATION_UNAVAILABLE = 1;
+    public static final int STYLE_UICHANGED__LOCATION_PREFERENCE__LOCATION_CURRENT = 2;
+    public static final int STYLE_UICHANGED__LOCATION_PREFERENCE__LOCATION_MANUAL = 3;
+
+    // Write methods
+    public static void write(int code, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10) {
+        // Initial overhead of the list, timestamp, and atom tag.
+        int needed = LIST_TYPE_OVERHEAD + LONG_TYPE_SIZE + INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        needed += INT_TYPE_SIZE;
+        if (needed > MAX_EVENT_PAYLOAD) {
+            return;
+        }
+        byte[] buff = new byte[needed];
+        int pos = 0;
+        buff[pos] = LIST_TYPE;
+        buff[pos + 1] = 12;
+        pos += LIST_TYPE_OVERHEAD;
+        long elapsedRealtime = SystemClock.elapsedRealtimeNanos();
+        buff[pos] = LONG_TYPE;
+        copyLong(buff, pos + 1, elapsedRealtime);
+        pos += LONG_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, code);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg1);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg2);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg3);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg4);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg5);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg6);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg7);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg8);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg9);
+        pos += INT_TYPE_SIZE;
+        buff[pos] = INT_TYPE;
+        copyInt(buff, pos + 1, arg10);
+        pos += INT_TYPE_SIZE;
+        StatsLog.writeRaw(buff, pos);
+    }
+
+    // Helper methods for copying primitives
+    private static void copyInt(byte[] buff, int pos, int val) {
+        buff[pos] = (byte) (val);
+        buff[pos + 1] = (byte) (val >> 8);
+        buff[pos + 2] = (byte) (val >> 16);
+        buff[pos + 3] = (byte) (val >> 24);
+        return;
+    }
+
+    private static void copyLong(byte[] buff, int pos, long val) {
+        buff[pos] = (byte) (val);
+        buff[pos + 1] = (byte) (val >> 8);
+        buff[pos + 2] = (byte) (val >> 16);
+        buff[pos + 3] = (byte) (val >> 24);
+        buff[pos + 4] = (byte) (val >> 32);
+        buff[pos + 5] = (byte) (val >> 40);
+        buff[pos + 6] = (byte) (val >> 48);
+        buff[pos + 7] = (byte) (val >> 56);
+        return;
+    }
+
+}
