diff --git a/tests/functional/launchertests/Android.mk b/tests/functional/launchertests/Android.mk
index 5166049..56120fe 100644
--- a/tests/functional/launchertests/Android.mk
+++ b/tests/functional/launchertests/Android.mk
@@ -19,7 +19,9 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_MODULE_TAGS := tests
 
-LOCAL_STATIC_JAVA_LIBRARIES := ub-uiautomator timeresult-helper-lib launcher-helper-lib android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := ub-uiautomator timeresult-helper-lib \
+                               launcher-helper-lib android-support-test \
+                               settings-app-helper \
 
 LOCAL_SDK_VERSION := current
 
diff --git a/tests/functional/launchertests/AndroidManifest.xml b/tests/functional/launchertests/AndroidManifest.xml
index 86b75f3..f48cbfe 100644
--- a/tests/functional/launchertests/AndroidManifest.xml
+++ b/tests/functional/launchertests/AndroidManifest.xml
@@ -24,6 +24,7 @@
     <uses-sdk android:minSdkVersion="19"
           android:targetSdkVersion="23"/>
 
+    <uses-permission android:name="android.permission.SET_WALLPAPER" />
     <instrumentation
             android:name="android.support.test.runner.AndroidJUnitRunner"
             android:targetPackage="android.launcher.functional"
diff --git a/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperHelper.java b/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperHelper.java
new file mode 100644
index 0000000..73ebd96
--- /dev/null
+++ b/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperHelper.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2016 The Android Open Source 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.
+ */
+
+package android.launcher.functional;
+
+import android.app.Instrumentation;
+import android.app.WallpaperManager;
+import android.app.UiAutomation;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.Context;
+import android.graphics.Point;
+import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.support.test.launcherhelper.ILauncherStrategy;
+import android.support.test.launcherhelper.LauncherStrategyFactory;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Direction;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.UiObjectNotFoundException;
+import android.support.test.uiautomator.Until;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Assert;
+
+public class WallpaperHelper {
+
+    private static final int TIMEOUT = 3000;
+    private static final int LONG_TIMEOUT = 10000;
+    private static final String WALLPAPER_PACKAGE = "com.google.android.apps.wallpaper";
+    private static final String SET_WALLPAPER = "set_wallpaper";
+    private UiDevice mDevice;
+    private Instrumentation mInstrumentation;
+    private WallpaperManager wallpaperManager;
+
+    public enum WallpaperScreen {
+        HOME, LOCK, BOTH, LIVE
+    }
+
+    public WallpaperHelper(UiDevice device, Instrumentation inst, WallpaperManager wpManager) {
+        this.mDevice = device;
+        mInstrumentation = inst;
+        wallpaperManager = wpManager;
+    }
+
+    public String getLauncherPackage() {
+        return mDevice.getLauncherPackageName();
+    }
+
+    public void launchWallpaperPickerWithIntent() {
+        Intent appIntent = new Intent()
+                .setClassName("com.google.android.apps.wallpaper",
+                        "com.google.android.apps.wallpaper.picker.CategoryPickerActivity")
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mInstrumentation.getContext().startActivity(appIntent);
+        SystemClock.sleep(TIMEOUT);
+    }
+
+    public void setWallpaperFromGivenCategory(String category, String wallpaperName,
+            WallpaperScreen wallpaperScreen) throws Exception {
+        clearAllWallpapers();
+        int[] oldWallpaperIds = returnWallpaperIdsForHomeAndLockScreen();
+        launchWallpaperPickerWithIntent();
+        findAndClickOnObjectInGrid(category, "category_grid");
+        // Pick the wallpaper
+        findAndClickOnObjectInGrid(wallpaperName, "wallpaper_grid");
+        // If live wallpaper, then there's no need to pick Home/Lockscreen
+        // since for security reasons, live wallpaper cannot be set on just
+        // the lockscreen.
+        switch (wallpaperScreen) {
+            case HOME:
+                mDevice.wait(Until.findObject(By.res(WALLPAPER_PACKAGE, SET_WALLPAPER)),
+                        LONG_TIMEOUT).click();
+                mDevice.wait(Until.findObject(By.res(WALLPAPER_PACKAGE,
+                        "set_home_wallpaper_button")), TIMEOUT).click();
+                break;
+            case LOCK:
+                mDevice.wait(Until.findObject(By.res(WALLPAPER_PACKAGE, SET_WALLPAPER)),
+                        LONG_TIMEOUT).click();
+                mDevice.wait(Until.findObject(By.res(WALLPAPER_PACKAGE,
+                        "set_lock_wallpaper_button")), TIMEOUT).click();
+                break;
+            case BOTH:
+                mDevice.wait(Until.findObject(By.res(WALLPAPER_PACKAGE, SET_WALLPAPER)),
+                        LONG_TIMEOUT).click();
+                mDevice.wait(Until.findObject(By.res(WALLPAPER_PACKAGE,
+                        "set_both_wallpaper_button")), TIMEOUT).click();
+                break;
+            // Note: The 'Live' case doesn't show a 'Home' OR 'Home and Lock' dialog box
+            // if both the home and the lockscreen wallpaper are set to the same option.
+            // This is why clearing the wallpaper manager flags at the beginning of
+            // this method is crucial to this option.
+            case LIVE:
+                mDevice.wait(Until.findObject
+                        (By.res("com.android.wallpaper.livepicker:id/set_wallpaper")),
+                        LONG_TIMEOUT).click();
+                break;
+        }
+        mDevice.waitForIdle();
+        Thread.sleep(TIMEOUT);
+        // Assert test is on Home screen
+        UiObject2 homeWorkspace = mDevice.wait(Until.findObject
+                (By.res(getLauncherPackage(), "workspace")), TIMEOUT);
+        Assert.assertNotNull("Test is not on Home screen after setting wallpaper", homeWorkspace);
+        // Assert the wallpaper property
+        int[] newWallpaperIds = returnWallpaperIdsForHomeAndLockScreen();
+        checkIfWallpaperIdChanged(wallpaperScreen, oldWallpaperIds, newWallpaperIds);
+    }
+
+    public int[] returnWallpaperIdsForHomeAndLockScreen() {
+        int[] wallpaperIds = {-1, -1};
+        wallpaperIds[0] = wallpaperManager.getWallpaperId(wallpaperManager.FLAG_SYSTEM);
+        wallpaperIds[1] = wallpaperManager.getWallpaperId(wallpaperManager.FLAG_LOCK);
+        return wallpaperIds;
+    }
+
+    public void checkIfWallpaperIdChanged(WallpaperScreen wallpaperScreen,
+            int[] oldWallpapers, int[] newWallpapers) {
+        switch (wallpaperScreen) {
+            case HOME:
+                Assert.assertNotEquals("Home wallpaper not changed", oldWallpapers[0],
+                        newWallpapers[0]);
+                break;
+            case LOCK:
+                Assert.assertNotEquals("Lockscreen wallpaper not changed", oldWallpapers[1],
+                        newWallpapers[1]);
+                break;
+            // The lockscreen wallpaper is set to -1 when the SYSTEM and LOCKSCREEN wallpaper
+            // are the same. The general wallpaper (FLAG_SYSTEM) applies to both screens in
+            // this case.
+            case BOTH:
+            case LIVE:
+                Assert.assertNotEquals("Home wallpaper not changed", oldWallpapers[0],
+                        newWallpapers[0]);
+                Assert.assertEquals("Lockscreen wallpaper not changed to match System wallpaper",
+                        -1, newWallpapers[1]);
+                break;
+        }
+    }
+
+    public void clearAllWallpapers() throws IOException {
+        wallpaperManager.clear(wallpaperManager.FLAG_SYSTEM);
+        wallpaperManager.clear(wallpaperManager.FLAG_LOCK);
+    }
+
+    public void findAndClickOnObjectInGrid(String objectText, String gridResId)
+            throws IOException {
+        UiObject2 gridObject = mDevice.wait(Until.findObject
+                (By.res(WALLPAPER_PACKAGE, gridResId)), TIMEOUT);
+        UiObject2 wantedObject = null;
+        int scrollCount = 0;
+        // Scroll to the top of the grid object if not already on top
+        while ((scrollCount < 5) && (gridObject != null) &&
+                gridObject.scroll(Direction.UP, 10.0f)) {
+            scrollCount++;
+        }
+        scrollCount = 0;
+        // Tap on specific category
+        while (scrollCount < 8) {
+            if (gridResId == "category_grid" || objectText.contains("IMG_")) {
+                wantedObject = mDevice.wait(Until.findObject(By.textContains(objectText)),
+                        TIMEOUT);
+            }
+            else {
+                wantedObject = mDevice.wait(Until.findObject(By.descContains(objectText)),
+                        TIMEOUT);
+            }
+            if (wantedObject == null) {
+                gridObject.scroll(Direction.DOWN, 0.5f);
+                mDevice.waitForIdle();
+                scrollCount++;
+            }
+            else {
+                break;
+            }
+        }
+        Assert.assertNotNull("The given object " + objectText +
+                " wasn't found in the grid " + gridResId, wantedObject);
+        wantedObject.click();
+        mDevice.waitForIdle();
+    }
+}
diff --git a/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperLargeTests.java b/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperLargeTests.java
new file mode 100644
index 0000000..36293d4
--- /dev/null
+++ b/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperLargeTests.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2016 The Android Open Source 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.
+ */
+
+package android.launcher.functional;
+
+import android.app.WallpaperManager;
+import android.app.UiAutomation;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.Context;
+import android.graphics.Point;
+import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.platform.test.helpers.SettingsHelperImpl;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.launcherhelper.ILauncherStrategy;
+import android.support.test.launcherhelper.LauncherStrategyFactory;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Direction;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.UiObjectNotFoundException;
+import android.support.test.uiautomator.Until;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import junit.framework.TestCase;
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Assert;
+
+public class WallpaperLargeTests extends TestCase {
+    private static final int TIMEOUT = 3000;
+    private static final String WALLPAPER_PACKAGE = "com.google.android.apps.wallpaper";
+    private UiDevice mDevice;
+    private PackageManager mPackageManager;
+    private ILauncherStrategy mLauncherStrategy = null;
+    private WallpaperManager wallpaperManager;
+    private WallpaperHelper mWallpaperHelper;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        mPackageManager = InstrumentationRegistry
+                .getInstrumentation().getContext().getPackageManager();
+        mDevice.setOrientationNatural();
+        mLauncherStrategy = LauncherStrategyFactory
+                .getInstance(mDevice).getLauncherStrategy();
+        wallpaperManager = WallpaperManager.getInstance
+                 (InstrumentationRegistry.getInstrumentation().getContext());
+        mWallpaperHelper = new WallpaperHelper(mDevice,
+                 InstrumentationRegistry.getInstrumentation(), wallpaperManager);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mWallpaperHelper.clearAllWallpapers();
+        mDevice.pressBack();
+        mDevice.pressBack();
+        mDevice.pressHome();
+        mDevice.unfreezeRotation();
+        mDevice.waitForIdle();
+        super.tearDown();
+    }
+
+    /*
+    @LargeTest
+    public void testSetWallpaperPhoto() throws Exception {
+       // mCameraHelper.goToCameraMode();
+       // mCameraHelper.capturePhoto();
+       // Thread.sleep(LONG_TIMEOUT * 2);
+       mWallpaperHelper.setWallpaperFromGivenCategory("My photos",
+                 "IMG_", WallpaperHelper.WallpaperScreen.BOTH);
+    }
+    */
+
+    @LargeTest
+    public void testSetWallpaperLandscape() throws Exception {
+       mWallpaperHelper.setWallpaperFromGivenCategory("Landscape",
+                 "Photo by ", WallpaperHelper.WallpaperScreen.BOTH);
+    }
+
+    @LargeTest
+    public void testSetWallpaperCityScape() throws Exception {
+       mWallpaperHelper.setWallpaperFromGivenCategory("Cityscape",
+                 "Photo by ", WallpaperHelper.WallpaperScreen.BOTH);
+    }
+
+    @LargeTest
+    public void testSetWallpaperTextures() throws Exception {
+       mWallpaperHelper.setWallpaperFromGivenCategory("Textures",
+                 "Photo by ", WallpaperHelper.WallpaperScreen.BOTH);
+    }
+
+    @LargeTest
+    public void testSetWallpaperLife() throws Exception {
+       mWallpaperHelper.setWallpaperFromGivenCategory("Life",
+                 "Photo by ", WallpaperHelper.WallpaperScreen.BOTH);
+    }
+}
diff --git a/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperMediumTests.java b/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperMediumTests.java
new file mode 100644
index 0000000..57962da
--- /dev/null
+++ b/tests/functional/launchertests/src/com/android/launcher/functional/WallpaperMediumTests.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2016 The Android Open Source 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.
+ */
+
+package android.launcher.functional;
+
+import android.app.WallpaperManager;
+import android.app.UiAutomation;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.Context;
+import android.graphics.Point;
+import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.platform.test.helpers.SettingsHelperImpl;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.launcherhelper.ILauncherStrategy;
+import android.support.test.launcherhelper.LauncherStrategyFactory;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Direction;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.UiObjectNotFoundException;
+import android.support.test.uiautomator.Until;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import junit.framework.TestCase;
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Assert;
+
+public class WallpaperMediumTests extends TestCase {
+    private static final int TIMEOUT = 3000;
+    private static final String WALLPAPER_PACKAGE = "com.google.android.apps.wallpaper";
+    private UiDevice mDevice;
+    private PackageManager mPackageManager;
+    private ILauncherStrategy mLauncherStrategy = null;
+    private WallpaperManager wallpaperManager;
+    private WallpaperHelper mWallpaperHelper;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        mPackageManager = InstrumentationRegistry.getInstrumentation()
+                .getContext().getPackageManager();
+        mDevice.setOrientationNatural();
+        mLauncherStrategy = LauncherStrategyFactory.getInstance(mDevice).getLauncherStrategy();
+        wallpaperManager = WallpaperManager.getInstance
+                (InstrumentationRegistry.getInstrumentation().getContext());
+        mWallpaperHelper = new WallpaperHelper(mDevice,
+                InstrumentationRegistry.getInstrumentation(), wallpaperManager);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mWallpaperHelper.clearAllWallpapers();
+        mDevice.pressBack();
+        mDevice.pressBack();
+        mDevice.pressHome();
+        mDevice.unfreezeRotation();
+        mDevice.waitForIdle();
+        super.tearDown();
+    }
+
+    @MediumTest
+    public void testSetWallpaperLiveEarth() throws Exception {
+         mWallpaperHelper.setWallpaperFromGivenCategory("Live earth",
+                 "Arches National Park", WallpaperHelper.WallpaperScreen.LIVE);
+    }
+
+    @MediumTest
+    public void testSetWallpaperLiveData() throws Exception {
+         mWallpaperHelper.setWallpaperFromGivenCategory("Live data",
+                 "Orbit, Jazz black", WallpaperHelper.WallpaperScreen.LIVE);
+    }
+
+    @MediumTest
+    public void testSetWallpaperNewElements() throws Exception {
+         mWallpaperHelper.setWallpaperFromGivenCategory("New elements",
+                 "Water, Luminous blue", WallpaperHelper.WallpaperScreen.BOTH);
+    }
+
+    @MediumTest
+    public void testSetWallpaperSkyhigh() throws Exception {
+        mWallpaperHelper.setWallpaperFromGivenCategory("Sky high",
+                 "On a journey", WallpaperHelper.WallpaperScreen.BOTH);
+    }
+
+    @MediumTest
+    public void testChangeWallpaperOnHomeScreenOnly() throws Exception {
+        mWallpaperHelper.setWallpaperFromGivenCategory("Sky high",
+                 "On a journey", WallpaperHelper.WallpaperScreen.HOME);
+    }
+
+    @MediumTest
+    public void testChangeWallpaperOnLockScreenOnly() throws Exception {
+        mWallpaperHelper.setWallpaperFromGivenCategory("Sky high",
+                 "Coming to rest", WallpaperHelper.WallpaperScreen.LOCK);
+    }
+
+    @MediumTest
+    public void testChangeWallpaperOnBothScreens() throws Exception {
+        mWallpaperHelper.setWallpaperFromGivenCategory("Sky high",
+                 "Coming to rest", WallpaperHelper.WallpaperScreen.BOTH);
+    }
+}
+
+
