diff --git a/access_vectors b/access_vectors
index f8c0110f5ad7d8e83f2e79032cdb844d8aefebea..5e7834140f28997ac66bb988aba6c2c45a8cc0ba 100644
--- a/access_vectors
+++ b/access_vectors
@@ -892,6 +892,8 @@ class property_service
 class service_manager
 {
 	add
+	find
+	list
 }
 
 class keystore_key
diff --git a/attributes b/attributes
index 613ed8f35e2bd7c35318a66a22d40da4bd6e7a39..d40217aed9e08c404e188958aa69b9dffe71ceb4 100644
--- a/attributes
+++ b/attributes
@@ -67,3 +67,6 @@ attribute bluetoothdomain;
 
 # All domains used for binder service domains.
 attribute binderservicedomain;
+
+# All domains that are excluded from the domain.te auditallow.
+attribute service_manager_local_audit;
diff --git a/bluetooth.te b/bluetooth.te
index 2b108a9e8ae99e87f9c738e9d03c2aa9637bfc17..8ba56b0e2d39eebfb2e044d5b108fa9a2dde3876 100644
--- a/bluetooth.te
+++ b/bluetooth.te
@@ -49,6 +49,14 @@ allow bluetooth bluetooth_prop:property_service set;
 allow bluetooth pan_result_prop:property_service set;
 allow bluetooth ctl_dhcp_pan_prop:property_service set;
 
+# Audited locally.
+service_manager_local_audit_domain(bluetooth)
+auditallow bluetooth {
+    service_manager_type
+    -bluetooth_service
+    -system_server_service
+}:service_manager find;
+
 ###
 ### Neverallow rules
 ###
diff --git a/bootanim.te b/bootanim.te
index 3a0a76f0f737666b251a185def0c40cbd0f7e15e..759229553aa2e9ca335f63be94b81a2a406595a7 100644
--- a/bootanim.te
+++ b/bootanim.te
@@ -11,3 +11,7 @@ allow bootanim gpu_device:chr_file rw_file_perms;
 
 # /oem access
 allow bootanim oemfs:dir search;
+
+# Audited locally.
+service_manager_local_audit_domain(bootanim)
+auditallow bootanim { service_manager_type -surfaceflinger_service }:service_manager find;
diff --git a/domain.te b/domain.te
index 7d64cfa6c5594f23461c1365ea0234da3023e2e8..09134539868fd9e767f2525692df566107769d2e 100644
--- a/domain.te
+++ b/domain.te
@@ -158,6 +158,11 @@ allow domain security_file:lnk_file r_file_perms;
 allow domain asec_public_file:file r_file_perms;
 allow domain { asec_public_file asec_apk_file }:dir r_dir_perms;
 
+allow domain servicemanager:service_manager list;
+auditallow domain servicemanager:service_manager list;
+allow domain service_manager_type:service_manager find;
+auditallow { domain -service_manager_local_audit } service_manager_type:service_manager find;
+
 ###
 ### neverallow rules
 ###
diff --git a/drmserver.te b/drmserver.te
index 19931766ebe29f59c223cdcb4c7f40258168e29a..12e3ac7c86d1045ed1c0b32c3d6ca2b18edd999d 100644
--- a/drmserver.te
+++ b/drmserver.te
@@ -46,3 +46,7 @@ allow drmserver asec_apk_file:file { read getattr };
 allow drmserver radio_data_file:file { read getattr };
 
 allow drmserver drmserver_service:service_manager add;
+
+# Audited locally.
+service_manager_local_audit_domain(drmserver)
+auditallow drmserver { service_manager_type -drmserver_service }:service_manager find;
diff --git a/healthd.te b/healthd.te
index ce6b8778e2e907104829545c07aeaa1078da0c77..940f7c4138d840b485f511dffa42090501d7949d 100644
--- a/healthd.te
+++ b/healthd.te
@@ -31,8 +31,13 @@ allow healthd ashmem_device:chr_file execute;
 allow healthd self:process execmem;
 allow healthd proc_sysrq:file rw_file_perms;
 allow healthd self:capability sys_boot;
+
 allow healthd healthd_service:service_manager add;
 
+# Audited locally.
+service_manager_local_audit_domain(healthd)
+auditallow healthd { service_manager_type -healthd_service }:service_manager find;
+
 # Healthd needs to tell init to continue the boot
 # process when running in charger mode.
 unix_socket_connect(healthd, property, init)
diff --git a/inputflinger.te b/inputflinger.te
index 283bbbaf37e0140d8dbb9525380985259d187ec0..4377a104f833fff9bddcae4ffdbf26f5b0496bde 100644
--- a/inputflinger.te
+++ b/inputflinger.te
@@ -9,3 +9,7 @@ binder_service(inputflinger)
 binder_call(inputflinger, system_server)
 
 allow inputflinger inputflinger_service:service_manager add;
+
+# Audited locally.
+service_manager_local_audit_domain(inputflinger)
+auditallow inputflinger { service_manager_type -inputflinger_service }:service_manager find;
diff --git a/isolated_app.te b/isolated_app.te
index a156838bbdb0c91392c252016409e1732851faaf..27b0e40c0b296e437ec78e267134a81f46891a2c 100644
--- a/isolated_app.te
+++ b/isolated_app.te
@@ -18,3 +18,7 @@ net_domain(isolated_app)
 # Needed to allow dlopen() from Chrome renderer processes.
 # See b/15902433 for details.
 allow isolated_app app_data_file:file execute;
+
+# Audited locally.
+service_manager_local_audit_domain(isolated_app)
+auditallow isolated_app service_manager_type:service_manager find;
diff --git a/keystore.te b/keystore.te
index afa701c7ee46b8eb3255c49ccc945dcbee7d9040..f2c5039b00ba5a1742399b93e924a4bc6201a799 100644
--- a/keystore.te
+++ b/keystore.te
@@ -28,5 +28,9 @@ neverallow domain keystore:process ptrace;
 
 allow keystore keystore_service:service_manager add;
 
+# Audited locally.
+service_manager_local_audit_domain(keystore)
+auditallow keystore { service_manager_type -keystore_service }:service_manager find;
+
 # Check SELinux permissions.
 selinux_check_access(keystore)
diff --git a/mediaserver.te b/mediaserver.te
index 55d1f20531e05060078d7cc401f34da48d9ea5ae..52c593e6e2b226de7765fa1f51ffbcd6fa9e2c41 100644
--- a/mediaserver.te
+++ b/mediaserver.te
@@ -79,3 +79,13 @@ unix_socket_connect(mediaserver, bluetooth, bluetooth)
 allow mediaserver tee:unix_stream_socket connectto;
 
 allow mediaserver mediaserver_service:service_manager add;
+
+# Audited locally.
+service_manager_local_audit_domain(mediaserver)
+auditallow mediaserver {
+    service_manager_type
+    -drmserver_service
+    -mediaserver_service
+    -system_server_service
+    -surfaceflinger_service
+}:service_manager find;
diff --git a/nfc.te b/nfc.te
index 65aaef76cbca14b6225259991ca27f9dfc1e88d7..c32e9d5970b09bf6269136c1921f008cc50e7d5a 100644
--- a/nfc.te
+++ b/nfc.te
@@ -15,3 +15,11 @@ allow nfc sysfs_nfc_power_writable:file rw_file_perms;
 allow nfc sysfs:file write;
 
 allow nfc nfc_service:service_manager add;
+
+# Audited locally.
+service_manager_local_audit_domain(nfc)
+auditallow nfc {
+    service_manager_type
+    -mediaserver_service
+    -system_server_service
+}:service_manager find;
diff --git a/platform_app.te b/platform_app.te
index 7ff8d62e23b20e8c61e0893837113958c152a3a9..a44e35d8acb8c87403f05b7ddcdede7d97100d42 100644
--- a/platform_app.te
+++ b/platform_app.te
@@ -27,3 +27,13 @@ allow platform_app media_rw_data_file:file create_file_perms;
 # Write to /cache.
 allow platform_app cache_file:dir create_dir_perms;
 allow platform_app cache_file:file create_file_perms;
+
+# Audited locally.
+service_manager_local_audit_domain(platform_app)
+auditallow platform_app {
+    service_manager_type
+    -mediaserver_service
+    -radio_service
+    -surfaceflinger_service
+    -system_server_service
+}:service_manager find;
diff --git a/radio.te b/radio.te
index d0018eac209daf5dab3fe238460d8fe447931417..11691cb52a16b260d08d782352c32378f0e29c86 100644
--- a/radio.te
+++ b/radio.te
@@ -28,3 +28,12 @@ auditallow radio system_radio_prop:property_service set;
 allow radio ctl_rildaemon_prop:property_service set;
 
 allow radio radio_service:service_manager add;
+
+# Audited locally.
+service_manager_local_audit_domain(radio)
+auditallow radio {
+    service_manager_type
+    -mediaserver_service
+    -radio_service
+    -system_server_service
+}:service_manager find;
diff --git a/servicemanager.te b/servicemanager.te
index f3dbca8f105c5ce6cab041ffa949d59c326f75b3..a92891641fad535a3ffd21ff465b18a3346fa63a 100644
--- a/servicemanager.te
+++ b/servicemanager.te
@@ -13,9 +13,5 @@ init_daemon_domain(servicemanager)
 allow servicemanager self:binder set_context_mgr;
 allow servicemanager domain:binder transfer;
 
-# Get contexts of binder services that call servicemanager.
-allow servicemanager binderservicedomain:dir search;
-allow servicemanager binderservicedomain:file { read open };
-allow servicemanager binderservicedomain:process getattr;
 # Check SELinux permissions.
 selinux_check_access(servicemanager)
diff --git a/surfaceflinger.te b/surfaceflinger.te
index c5086120996b0ab444c463c4e5f8ab115f907600..ff91993ec4d3c14be974ae63850a8a483e094a1c 100644
--- a/surfaceflinger.te
+++ b/surfaceflinger.te
@@ -59,6 +59,14 @@ allow surfaceflinger tee_device:chr_file rw_file_perms;
 
 allow surfaceflinger surfaceflinger_service:service_manager add;
 
+# Audited locally.
+service_manager_local_audit_domain(surfaceflinger)
+auditallow surfaceflinger {
+    service_manager_type
+    -surfaceflinger_service
+    -system_server_service
+}:service_manager find;
+
 ###
 ### Neverallow rules
 ###
diff --git a/system_app.te b/system_app.te
index 2a7421b39f76a6b08d75f8334b30b28affe987b1..24b135e5d0040c0b8ad9cbe6e99ba7d0364a58d6 100644
--- a/system_app.te
+++ b/system_app.te
@@ -64,3 +64,12 @@ allow system_app keystore:keystore_key {
 };
 
 control_logd(system_app)
+
+# Audited locally.
+service_manager_local_audit_domain(system_app)
+auditallow system_app {
+    service_manager_type
+    -nfc_service
+    -surfaceflinger_service
+    -system_server_service
+}:service_manager find;
diff --git a/system_server.te b/system_server.te
index d7453ad2f516abea5002559d93d26e8933d3d659..62cbce750c4702613aa6ff997de38bbb4198a8b3 100644
--- a/system_server.te
+++ b/system_server.te
@@ -361,6 +361,18 @@ allow system_server pstorefs:file r_file_perms;
 
 allow system_server system_server_service:service_manager add;
 
+# Audited locally.
+service_manager_local_audit_domain(system_server)
+auditallow system_server {
+    service_manager_type
+    -healthd_service
+    -keystore_service
+    -mediaserver_service
+    -radio_service
+    -surfaceflinger_service
+    -system_server_service
+}:service_manager find;
+
 allow system_server keystore:keystore_key {
 	test
 	get
diff --git a/te_macros b/te_macros
index 4199d6e30941027bfba7640e0aaa3267829ee5f5..b2913f3cdcf300920a7f488cd47bf90e8ee3db8d 100644
--- a/te_macros
+++ b/te_macros
@@ -109,6 +109,7 @@ typeattribute $1 appdomain;
 tmpfs_domain($1)
 # Map with PROT_EXEC.
 allow $1 $1_tmpfs:file execute;
+service_manager_local_audit_domain($1)
 ')
 
 #####################################
@@ -149,6 +150,10 @@ allow $1 $3:unix_dgram_socket sendto;
 define(`binder_use', `
 # Call the servicemanager and transfer references to it.
 allow $1 servicemanager:binder { call transfer };
+# servicemanager performs getpidcon on clients.
+allow servicemanager $1:dir search;
+allow servicemanager $1:file { read open };
+allow servicemanager $1:process getattr;
 # rw access to /dev/binder and /dev/ashmem is presently granted to
 # all domains in domain.te.
 ')
@@ -354,3 +359,11 @@ define(`use_keystore', `
   allow keystore $1:process getattr;
   binder_call($1, keystore)
 ')
+
+###########################################
+# service_manager_local_audit_domain(domain)
+# Has its own auditallow rule on service_manager
+# and should be excluded from the domain.te auditallow.
+define(`service_manager_local_audit_domain', `
+  typeattribute $1 service_manager_local_audit;
+')
diff --git a/untrusted_app.te b/untrusted_app.te
index f29149e3d2f8d39fc69cd3abcbbac1042599ecc1..346716ab859eea5059ec1b00cba92e692c156155 100644
--- a/untrusted_app.te
+++ b/untrusted_app.te
@@ -64,6 +64,17 @@ allow untrusted_app media_rw_data_file:file create_file_perms;
 allow untrusted_app cache_file:dir create_dir_perms;
 allow untrusted_app cache_file:file create_file_perms;
 
+# Audited locally.
+service_manager_local_audit_domain(untrusted_app)
+auditallow untrusted_app {
+    service_manager_type
+    -drmserver_service
+    -mediaserver_service
+    -nfc_service
+    -surfaceflinger_service
+    -system_server_service
+}:service_manager find;
+
 ###
 ### neverallow rules
 ###