diff --git a/private/atrace.te b/private/atrace.te
index 37e9702a3d3f96cb1f5a8139cb253ae3719e6593..a60370d783a6ea25c27a64816cd925e36322f7c0 100644
--- a/private/atrace.te
+++ b/private/atrace.te
@@ -33,6 +33,7 @@ allow atrace {
   service_manager_type
   -apex_service
   -incident_service
+  -iorapd_service
   -netd_service
   -stats_service
   -dumpstate_service
diff --git a/private/compat/26.0/26.0.ignore.cil b/private/compat/26.0/26.0.ignore.cil
index f985d958c7014b8a70474851fdc3160efd92a134..54edb40b8d8e0a2bb73a1058abf615ebcd482f12 100644
--- a/private/compat/26.0/26.0.ignore.cil
+++ b/private/compat/26.0/26.0.ignore.cil
@@ -89,6 +89,11 @@
     hal_wifi_offload_hwservice
     incident_helper
     incident_helper_exec
+    iorapd
+    iorapd_data_file
+    iorapd_exec
+    iorapd_service
+    iorapd_tmpfs
     kmsg_debug_device
     last_boot_reason_prop
     llkd
diff --git a/private/compat/27.0/27.0.ignore.cil b/private/compat/27.0/27.0.ignore.cil
index df3f95aed2ffb6e5e045ec67a269a26d9ba00f39..1df6a0e5219532355fd3b7c89f22339c4c67aa57 100644
--- a/private/compat/27.0/27.0.ignore.cil
+++ b/private/compat/27.0/27.0.ignore.cil
@@ -80,6 +80,11 @@
     hal_wifi_hostapd_hwservice
     incident_helper
     incident_helper_exec
+    iorapd
+    iorapd_data_file
+    iorapd_exec
+    iorapd_service
+    iorapd_tmpfs
     last_boot_reason_prop
     llkd
     llkd_exec
diff --git a/private/compat/28.0/28.0.ignore.cil b/private/compat/28.0/28.0.ignore.cil
index c1b126b20b7fa5f6d2e8effccf43d090ba8f6e92..e02421d90f26db86eb2e3249bb26284e3c652715 100644
--- a/private/compat/28.0/28.0.ignore.cil
+++ b/private/compat/28.0/28.0.ignore.cil
@@ -31,6 +31,11 @@
     llkd_prop
     llkd_tmpfs
     looper_stats_service
+    iorapd
+    iorapd_exec
+    iorapd_data_file
+    iorapd_service
+    iorapd_tmpfs
     mnt_product_file
     overlayfs_file
     recovery_socket
diff --git a/private/file_contexts b/private/file_contexts
index 264735d6d7ca9b1d45aba4408bb92f62e69eab3e..3b852136f02151e82ab2ad9a27171649c380aa23 100644
--- a/private/file_contexts
+++ b/private/file_contexts
@@ -273,6 +273,7 @@
 # patchoat executable has (essentially) the same requirements as dex2oat.
 /system/bin/patchoat(d)?    u:object_r:dex2oat_exec:s0
 /system/bin/profman(d)?     u:object_r:profman_exec:s0
+/system/bin/iorapd          u:object_r:iorapd_exec:s0
 /system/bin/sgdisk      u:object_r:sgdisk_exec:s0
 /system/bin/blkid       u:object_r:blkid_exec:s0
 /system/bin/tzdatacheck u:object_r:tzdatacheck_exec:s0
@@ -451,6 +452,7 @@
 /data/misc/wifi/sockets/wpa_ctrl.*   u:object_r:system_wpa_socket:s0
 /data/misc/zoneinfo(/.*)?       u:object_r:zoneinfo_data_file:s0
 /data/misc/vold(/.*)?           u:object_r:vold_data_file:s0
+/data/misc/iorapd(/.*)?         u:object_r:iorapd_data_file:s0
 /data/misc/perfprofd(/.*)?      u:object_r:perfprofd_data_file:s0
 /data/misc/update_engine(/.*)?  u:object_r:update_engine_data_file:s0
 /data/misc/update_engine_log(/.*)?  u:object_r:update_engine_log_data_file:s0
@@ -516,6 +518,9 @@
 /data/misc_de/[0-9]+/vold(/.*)?           u:object_r:vold_data_file:s0
 /data/misc_ce/[0-9]+/vold(/.*)?           u:object_r:vold_data_file:s0
 
+# iorapd per-user data
+/data/misc_ce/[0-9]+/iorapd(/.*)?           u:object_r:iorapd_data_file:s0
+
 #############################
 # efs files
 #
diff --git a/private/iorapd.te b/private/iorapd.te
new file mode 100644
index 0000000000000000000000000000000000000000..602da03de701d2e4cfdd362d2da935c811b2db10
--- /dev/null
+++ b/private/iorapd.te
@@ -0,0 +1,3 @@
+typeattribute iorapd coredomain;
+
+init_daemon_domain(iorapd)
diff --git a/private/service_contexts b/private/service_contexts
index b68ab8e2651d4d7d99dd7d6d3a8a9bd0170a7169..1398b1936e874f7ff06fd4b03cfac9df455375d1 100644
--- a/private/service_contexts
+++ b/private/service_contexts
@@ -70,6 +70,7 @@ inputflinger                              u:object_r:inputflinger_service:s0
 input_method                              u:object_r:input_method_service:s0
 input                                     u:object_r:input_service:s0
 installd                                  u:object_r:installd_service:s0
+iorapd                                    u:object_r:iorapd_service:s0
 iphonesubinfo_msim                        u:object_r:radio_service:s0
 iphonesubinfo2                            u:object_r:radio_service:s0
 iphonesubinfo                             u:object_r:radio_service:s0
diff --git a/private/system_app.te b/private/system_app.te
index 245496f8f304cb785c2d5a60e36534cdfa16a0e7..40fec6acfdbad96383351d11657f120a9ddb58dc 100644
--- a/private/system_app.te
+++ b/private/system_app.te
@@ -73,6 +73,7 @@ allow system_app {
   -apex_service
   -dumpstate_service
   -installd_service
+  -iorapd_service
   -netd_service
   -virtual_touchpad_service
   -vold_service
@@ -82,6 +83,7 @@ allow system_app {
 dontaudit system_app {
   dumpstate_service
   installd_service
+  iorapd_service
   netd_service
   virtual_touchpad_service
   vold_service
diff --git a/public/dumpstate.te b/public/dumpstate.te
index 5663e80ea58ea9a97037f7b7d7037cfff729459d..79faafa7efd6f93ad2797e5cb02a26bc26a36969 100644
--- a/public/dumpstate.te
+++ b/public/dumpstate.te
@@ -209,6 +209,7 @@ allow dumpstate {
   -dumpstate_service
   -gatekeeper_service
   -incident_service
+  -iorapd_service
   -virtual_touchpad_service
   -vold_service
   -vr_hwc_service
@@ -218,6 +219,7 @@ dontaudit dumpstate {
   dumpstate_service
   gatekeeper_service
   incident_service
+  iorapd_service
   virtual_touchpad_service
   vold_service
   vr_hwc_service
diff --git a/public/file.te b/public/file.te
index 8e31f2cda2af8925c05b30d0b60e52620b2ca682..48c2a693d7e855c2707b5bd8c624d590571ef88e 100644
--- a/public/file.te
+++ b/public/file.te
@@ -296,6 +296,7 @@ type vpn_data_file, file_type, data_file_type, core_data_file_type;
 type wifi_data_file, file_type, data_file_type, core_data_file_type;
 type zoneinfo_data_file, file_type, data_file_type, core_data_file_type;
 type vold_data_file, file_type, data_file_type, core_data_file_type;
+type iorapd_data_file, file_type, data_file_type, core_data_file_type;
 type perfprofd_data_file, file_type, data_file_type, core_data_file_type, mlstrustedobject;
 type tee_data_file, file_type, data_file_type;
 type update_engine_data_file, file_type, data_file_type, core_data_file_type;
diff --git a/public/init.te b/public/init.te
index 42d364f02fbf2ddead6f9a4a752b4055a0a07786..18d11b6c69b2d7e174d32dbfbe9766c64fe91bf3 100644
--- a/public/init.te
+++ b/public/init.te
@@ -158,6 +158,7 @@ allow init {
   file_type
   -app_data_file
   -exec_type
+  -iorapd_data_file
   -keystore_data_file
   -misc_logd_file
   -nativetest_data_file
@@ -173,6 +174,7 @@ allow init {
   file_type
   -app_data_file
   -exec_type
+  -iorapd_data_file
   -keystore_data_file
   -misc_logd_file
   -nativetest_data_file
@@ -189,6 +191,7 @@ allow init {
   file_type
   -app_data_file
   -exec_type
+  -iorapd_data_file
   -keystore_data_file
   -misc_logd_file
   -nativetest_data_file
@@ -204,6 +207,7 @@ allow init {
   file_type
   -app_data_file
   -exec_type
+  -iorapd_data_file
   -keystore_data_file
   -misc_logd_file
   -nativetest_data_file
diff --git a/public/iorapd.te b/public/iorapd.te
new file mode 100644
index 0000000000000000000000000000000000000000..c056943f8e45ae6d27332edc8951462331de1281
--- /dev/null
+++ b/public/iorapd.te
@@ -0,0 +1,75 @@
+# volume manager
+type iorapd, domain;
+type iorapd_exec, exec_type, file_type, system_file_type;
+
+r_dir_file(iorapd, rootfs)
+
+# Allow read/write /proc/sys/vm/drop/caches
+allow iorapd proc_drop_caches:file rw_file_perms;
+
+# Give iorapd a place where only iorapd can store files; everyone else is off limits
+allow iorapd iorapd_data_file:dir create_dir_perms;
+allow iorapd iorapd_data_file:file create_file_perms;
+
+# Allow iorapd to publish a binder service and make binder calls.
+binder_use(iorapd)
+add_service(iorapd, iorapd_service)
+
+# Allow iorapd to call into the system server so it can check permissions.
+binder_call(iorapd, system_server)
+allow iorapd permission_service:service_manager find;
+# IUserManager
+allow iorapd user_service:service_manager find;
+# IPackageManagerNative
+allow iorapd package_native_service:service_manager find;
+
+# talk to batteryservice
+binder_call(iorapd, healthd)
+
+# TODO: does each of the service_manager allow finds above need the binder_call?
+
+# iorapd temporarily changes its priority when running benchmarks
+allow iorapd self:global_capability_class_set sys_nice;
+
+
+###
+### neverallow rules
+###
+
+neverallow {
+    domain
+    -iorapd
+} iorapd_data_file:dir ~{ open create read getattr setattr search relabelto ioctl };
+
+neverallow {
+    domain
+    -init
+    -iorapd
+} iorapd_data_file:dir *;
+
+neverallow {
+    domain
+    -kernel
+    -iorapd
+} iorapd_data_file:notdevfile_class_set ~{ relabelto getattr };
+
+neverallow {
+    domain
+    -init
+    -kernel
+    -vendor_init
+    -iorapd
+} { iorapd_data_file }:notdevfile_class_set *;
+
+# Only system_server can interact with iorapd over binder
+neverallow { domain -system_server -iorapd } iorapd_service:service_manager find;
+neverallow iorapd {
+  domain
+  -healthd
+  -servicemanager
+  -system_server
+  userdebug_or_eng(`-su')
+}:binder call;
+
+neverallow { domain -init } iorapd:process { transition dyntransition };
+neverallow iorapd domain:{ tcp_socket udp_socket rawip_socket } *;
diff --git a/public/service.te b/public/service.te
index 7a60ad405689da1fe2a7f04f79502448a85ee941..dd80f92bc82591820aee02dc1d162008857625d1 100644
--- a/public/service.te
+++ b/public/service.te
@@ -10,6 +10,7 @@ type fingerprintd_service,      service_manager_type;
 type hal_fingerprint_service,   service_manager_type;
 type gatekeeper_service,        app_api_service, service_manager_type;
 type gpu_service,               service_manager_type;
+type iorapd_service,            service_manager_type;
 type inputflinger_service,      service_manager_type;
 type incident_service,          service_manager_type;
 type installd_service,          service_manager_type;
diff --git a/public/shell.te b/public/shell.te
index 339b58632cb08f9b035f74602c733c4b40d8044a..cef1b0a355cc1e9dda03b6ffc1cc493818740af5 100644
--- a/public/shell.te
+++ b/public/shell.te
@@ -108,6 +108,7 @@ allow shell {
   -gatekeeper_service
   -incident_service
   -installd_service
+  -iorapd_service
   -netd_service
   -virtual_touchpad_service
   -vold_service
diff --git a/public/traceur_app.te b/public/traceur_app.te
index c18984e2f8cb5634b3c116af5fa148ed05af61b2..aea13ef708bb42c650a80b4fd080eca42dd7540c 100644
--- a/public/traceur_app.te
+++ b/public/traceur_app.te
@@ -11,6 +11,7 @@ allow traceur_app {
   -gatekeeper_service
   -incident_service
   -installd_service
+  -iorapd_service
   -netd_service
   -virtual_touchpad_service
   -vold_service
diff --git a/public/vold.te b/public/vold.te
index 8db19fcef291a4019242fab80b4c6e5588bfe212..cd2d4f74561daeeb3e61e5a8391dccece7effd28 100644
--- a/public/vold.te
+++ b/public/vold.te
@@ -272,6 +272,7 @@ neverallow vold {
   -hal_bootctl
   -healthd
   -hwservicemanager
+  -iorapd_service
   -servicemanager
   -system_server
   userdebug_or_eng(`-su')