diff --git a/public/hal_allocator.te b/public/hal_allocator.te
index 0f3983bdf5aaa432c063a7a7d349aa72c3ce5fa0..a312e598f6f0fed2bb967dc78937e655401d7346 100644
--- a/public/hal_allocator.te
+++ b/public/hal_allocator.te
@@ -1,5 +1,7 @@
 # allocator subsystem
-type hal_allocator, domain, haldomain;
+type hal_allocator, domain;
+hal_impl_domain(hal_allocator)
+
 type hal_allocator_exec, exec_type, file_type;
 
 # hwbinder access
diff --git a/public/hal_boot.te b/public/hal_boot.te
index d04ced28b2e388f11ab82f7672be98e46ae1560e..6688f7fdb8ffdcbde0afd5fd7c70a896c6e411cf 100644
--- a/public/hal_boot.te
+++ b/public/hal_boot.te
@@ -1,5 +1,7 @@
 # boot_control subsystem
-type hal_boot, domain, boot_control_hal, haldomain;
+type hal_boot, domain, boot_control_hal;
+hal_impl_domain(hal_boot)
+
 type hal_boot_exec, exec_type, file_type;
 
 # hwbinder access
diff --git a/public/te_macros b/public/te_macros
index d1267ec2d5a591a10bbee688633249e6896d04fe..d4e1324309598858cf1c1888108b64eb50aa1489 100644
--- a/public/te_macros
+++ b/public/te_macros
@@ -116,9 +116,14 @@ typeattribute $1 bluetoothdomain;
 ')
 
 #####################################
-# hal_impl_domain(domain, hal_type_attr)
+# hal_impl_domain(domain[, hal_type_attr])
 # Allow a base set of permissions required for a domain to host a
-# HAL implementation of the specified HAL type.
+# HAL implementation.
+#
+# Optionally, the type of the HAL can be specified as the second
+# argument. This is useful for HALs which may have multiple
+# implementations. Attributes are used to group the various
+# implementations of such HALs.
 #
 # For example, default implementation of Foo HAL:
 #   type hal_foo_default, domain;
@@ -126,7 +131,7 @@ typeattribute $1 bluetoothdomain;
 #
 define(`hal_impl_domain', `
 typeattribute $1 haldomain;
-typeattribute $1 $2;
+ifelse($2, `', `', `typeattribute $1 $2;')
 ')
 
 #####################################