implement PackageManager.getPackageInstaller()
diff --git a/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java b/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java
index ca4bb49..74d5aad 100644
--- a/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java
+++ b/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java
@@ -6,16 +6,31 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.PatternMatcher;
 import android.util.Pair;
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.ShadowsAdapter;
+import org.robolectric.manifest.ActivityData;
+import org.robolectric.manifest.AndroidManifest;
+import org.robolectric.manifest.BroadcastReceiverData;
+import org.robolectric.manifest.ContentProviderData;
+import org.robolectric.manifest.IntentFilterData;
+import org.robolectric.manifest.ServiceData;
+import org.robolectric.res.ResName;
+import org.robolectric.res.ResourceIndex;
+import org.robolectric.res.ResourceLoader;
+import org.robolectric.util.TempDirectory;
 
 import java.io.File;
 import java.nio.file.Paths;
@@ -31,18 +46,6 @@
 import java.util.Set;
 import java.util.TreeMap;
 
-import org.robolectric.ShadowsAdapter;
-import org.robolectric.manifest.ActivityData;
-import org.robolectric.manifest.AndroidManifest;
-import org.robolectric.manifest.BroadcastReceiverData;
-import org.robolectric.manifest.ContentProviderData;
-import org.robolectric.manifest.IntentFilterData;
-import org.robolectric.manifest.ServiceData;
-import org.robolectric.res.ResName;
-import org.robolectric.res.ResourceIndex;
-import org.robolectric.res.ResourceLoader;
-import org.robolectric.util.TempDirectory;
-
 public class DefaultPackageManager extends StubPackageManager implements RobolectricPackageManager {
 
   public DefaultPackageManager(ShadowsAdapter shadowsAdapter) {
@@ -125,6 +128,11 @@
   private HashMap<String, Integer> applicationEnabledSettingMap = new HashMap<>();
 
   @Override
+  public PackageInstaller getPackageInstaller() {
+    return new RoboPackageInstaller();
+  }
+
+  @Override
   public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException {
     if (packageInfos.containsKey(packageName)) {
       return packageInfos.get(packageName);
@@ -727,4 +735,26 @@
     }
     return bundle;
   }
+
+  private class RoboPackageInstaller extends PackageInstaller {
+    public RoboPackageInstaller() {
+      super(RuntimeEnvironment.application, DefaultPackageManager.this, null, null, -1);
+    }
+
+    @Override
+    public List<SessionInfo> getAllSessions() {
+      return ImmutableList.copyOf(Iterables.transform(packageInfos.keySet(), packageNameToSessionInfo()));
+    }
+
+    private Function<String, PackageInstaller.SessionInfo> packageNameToSessionInfo() {
+      return new Function<String, PackageInstaller.SessionInfo>() {
+        @Override
+        public PackageInstaller.SessionInfo apply(String packageName) {
+          PackageInstaller.SessionInfo sessionInfo = new PackageInstaller.SessionInfo();
+          sessionInfo.appPackageName = packageName;
+          return sessionInfo;
+        }
+      };
+    }
+  }
 }
diff --git a/robolectric/src/test/java/org/robolectric/res/DefaultRobolectricPackageManagerTest.java b/robolectric/src/test/java/org/robolectric/res/DefaultRobolectricPackageManagerTest.java
index d611beb..ac1b79c 100644
--- a/robolectric/src/test/java/org/robolectric/res/DefaultRobolectricPackageManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/res/DefaultRobolectricPackageManagerTest.java
@@ -7,26 +7,23 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.graphics.Color;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.*;
+import org.robolectric.R;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.manifest.AndroidManifest;
 import org.robolectric.res.builder.RobolectricPackageManager;
@@ -34,6 +31,13 @@
 import org.robolectric.shadows.ShadowDrawable;
 import org.robolectric.test.TemporaryFolder;
 
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -43,7 +47,7 @@
 import static org.robolectric.Robolectric.setupActivity;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
+@Config(manifest = Config.NONE, sdk = 23)
 public class DefaultRobolectricPackageManagerTest {
   private static final String TEST_PACKAGE_NAME = "com.some.other.package";
   private static final String TEST_PACKAGE_LABEL = "My Little App";
@@ -51,6 +55,39 @@
   @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
   @Test
+  public void getPackageInstaller() {
+    PackageInfo packageInfo = new PackageInfo();
+    packageInfo.packageName = TEST_PACKAGE_NAME;
+    packageInfo.applicationInfo = new ApplicationInfo();
+    packageInfo.applicationInfo.packageName = TEST_PACKAGE_NAME;
+    packageInfo.applicationInfo.name = TEST_PACKAGE_LABEL;
+    rpm.addPackage(packageInfo);
+
+    List<PackageInstaller.SessionInfo> allSessions = RuntimeEnvironment.getPackageManager().getPackageInstaller().getAllSessions();
+
+    List<String> allPackageNames = new LinkedList<>();
+    for (PackageInstaller.SessionInfo session : allSessions) {
+      allPackageNames.add(session.appPackageName);
+    }
+
+    assertThat(allPackageNames).contains(TEST_PACKAGE_NAME);
+  }
+
+  @Test
+  public void packageInstallerAndGetInstalledPackagesAreConsistent() {
+    PackageInfo packageInfo = new PackageInfo();
+    packageInfo.packageName = TEST_PACKAGE_NAME;
+    packageInfo.applicationInfo = new ApplicationInfo();
+    packageInfo.applicationInfo.packageName = TEST_PACKAGE_NAME;
+    packageInfo.applicationInfo.name = TEST_PACKAGE_LABEL;
+    rpm.addPackage(packageInfo);
+
+    List<PackageInstaller.SessionInfo> allSessions = RuntimeEnvironment.getPackageManager().getPackageInstaller().getAllSessions();
+
+    assertThat(allSessions).hasSameSizeAs(rpm.getInstalledPackages(0));
+  }
+
+  @Test
   public void getApplicationInfo_ThisApplication() throws Exception {
     ApplicationInfo info = rpm.getApplicationInfo(RuntimeEnvironment.application.getPackageName(), 0);
     assertThat(info).isNotNull();