diff --git a/tor-android-binary/src/main/java/org/torproject/jni/TorService.java b/tor-android-binary/src/main/java/org/torproject/jni/TorService.java
index 582f6bb081b4503e4707d6476aa12a02fcc8439b..6269a4abcbd1a8e7cc5f919037188dadef973168 100644
--- a/tor-android-binary/src/main/java/org/torproject/jni/TorService.java
+++ b/tor-android-binary/src/main/java/org/torproject/jni/TorService.java
@@ -119,6 +119,25 @@ public class TorService extends Service {
         return new File(getAppTorServiceDir(context), "torrc-defaults");
     }
 
+    public static String getBroadcastPackageName(Context context) {
+        if (broadcastPackageName == UNINITIALIZED) {
+            broadcastPackageName = context.getPackageName();
+        }
+        return broadcastPackageName;
+    }
+
+    /**
+     * Set the Package Name to send the status broadcasts to, or {@code null}
+     * to broadcast to all apps.
+     *
+     * @param packageName The name of the application package to send the
+     *                    status broadcasts to, or null to broadcast to all.
+     * @see Intent#setPackage(String)
+     */
+    public static void setBroadcastPackageName(String packageName) {
+        TorService.broadcastPackageName = packageName;
+    }
+
     private static File getControlSocket(Context context) {
         if (controlSocket == null) {
             controlSocket = new File(getAppTorServiceDataDir(context), CONTROL_SOCKET_NAME);
@@ -163,6 +182,8 @@ public class TorService extends Service {
     private static File appTorServiceDir = null;
     private static File controlSocket = null;
     private static final String CONTROL_SOCKET_NAME = "ControlSocket";
+    private static final String UNINITIALIZED = "UNINITIALIZED";
+    private static String broadcastPackageName = UNINITIALIZED;
 
     public static int socksPort = -1;
     public static int httpTunnelPort = -1;
@@ -453,8 +474,7 @@ public class TorService extends Service {
      * Broadcasts the current status to any apps following the status of TorService.
      */
     static void sendBroadcastStatusIntent(Context context) {
-        Intent intent = getBroadcastIntent(ACTION_STATUS, currentStatus);
-        intent.putExtra(EXTRA_SERVICE_PACKAGE_NAME, context.getPackageName());
+        Intent intent = getBroadcastIntent(context, ACTION_STATUS, currentStatus);
         context.sendBroadcast(intent);
     }
 
@@ -464,8 +484,7 @@ public class TorService extends Service {
      */
     static void broadcastStatus(Context context, String currentStatus) {
         TorService.currentStatus = currentStatus;
-        Intent intent = getBroadcastIntent(ACTION_STATUS, currentStatus);
-        intent.putExtra(EXTRA_SERVICE_PACKAGE_NAME, context.getPackageName());
+        Intent intent = getBroadcastIntent(context, ACTION_STATUS, currentStatus);
         LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
         context.sendBroadcast(intent);
     }
@@ -479,12 +498,16 @@ public class TorService extends Service {
         if (e != null) {
             intent.putExtra(Intent.EXTRA_TEXT, e.getLocalizedMessage());
         }
+        intent.setPackage(getBroadcastPackageName(context));
+        intent.putExtra(EXTRA_SERVICE_PACKAGE_NAME, context.getPackageName());
         LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
         context.sendBroadcast(intent);
     }
 
-    private static Intent getBroadcastIntent(String action, String currentStatus) {
+    private static Intent getBroadcastIntent(Context context, String action, String currentStatus) {
         Intent intent = new Intent(action);
+        intent.putExtra(EXTRA_SERVICE_PACKAGE_NAME, context.getPackageName());
+        intent.setPackage(getBroadcastPackageName(context));
         intent.putExtra(EXTRA_STATUS, currentStatus);
         return intent;
     }