diff --git a/init.hardware.rc b/init.hardware.rc
index 93514333..8347797e 100644
--- a/init.hardware.rc
+++ b/init.hardware.rc
@@ -689,6 +689,18 @@ service loc_launcher /vendor/bin/loc_launcher
service pd_mapper /vendor/bin/pd-mapper
class core
+service atfwd /vendor/bin/ATFWD-daemon
+ class late_start
+ user system
+ group system radio
+ disabled
+
+on property:persist.radio.atfwd.start=true
+ start atfwd
+
+on property:persist.radio.atfwd.start=false
+ stop atfwd
+
# bugreport is triggered by holding down volume down, volume up and power
service bugreport /system/bin/dumpstate -d -p -B -z \
-o /data/user_de/0/com.android.shell/files/bugreports/bugreport
diff --git a/manifest.xml b/manifest.xml
index 4ef58946..6ea940ed 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -412,4 +412,13 @@
cnd
+
+ vendor.qti.atcmdfwd
+ hwbinder
+ 1.0
+
+ IAtCmdFwd
+ AtCmdFwdService
+
+
diff --git a/sepolicy/vendor/atfwd.te b/sepolicy/vendor/atfwd.te
new file mode 100644
index 00000000..ad96a120
--- /dev/null
+++ b/sepolicy/vendor/atfwd.te
@@ -0,0 +1,16 @@
+type atfwd, domain;
+type atfwd_exec, exec_type, vendor_file_type, file_type;
+
+init_daemon_domain(atfwd)
+
+hwbinder_use(atfwd)
+get_prop(atfwd, hwservicemanager_prop)
+allow atfwd vnd_atcmdfwd_hwservice:hwservice_manager find;
+binder_call(atfwd, qtelephony);
+
+allow atfwd self:socket create_socket_perms;
+allowxperm atfwd self:socket ioctl msm_sock_ipc_ioctls;
+
+r_dir_file(atfwd, sysfs_type)
+
+set_prop(atfwd, radio_prop)
diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts
index 0690949e..4475ed46 100644
--- a/sepolicy/vendor/file_contexts
+++ b/sepolicy/vendor/file_contexts
@@ -152,6 +152,7 @@
/vendor/bin/ipacm-diag u:object_r:hal_tetheroffload_default_exec:s0
/vendor/bin/qmuxd u:object_r:qmuxd_exec:s0
/vendor/bin/cnd u:object_r:cnd_exec:s0
+/vendor/bin/ATFWD-daemon u:object_r:atfwd_exec:s0
# Remove after b/38447389
/vendor/bin/esed u:object_r:esed_exec:s0
# Rename to android.hardware.[XXX] after b/38447431
diff --git a/sepolicy/vendor/hwservice.te b/sepolicy/vendor/hwservice.te
index 4a1ae5f8..4e13ddb1 100644
--- a/sepolicy/vendor/hwservice.te
+++ b/sepolicy/vendor/hwservice.te
@@ -1,4 +1,5 @@
type vnd_ims_radio_hwservice, hwservice_manager_type;
type vnd_qcrilhook_hwservice, hwservice_manager_type;
+type vnd_atcmdfwd_hwservice, hwservice_manager_type;
type hal_imsrtp_hwservice, hwservice_manager_type;
type hal_ipacm_hwservice, hwservice_manager_type;
diff --git a/sepolicy/vendor/hwservice_contexts b/sepolicy/vendor/hwservice_contexts
index 3b6bf789..89f75101 100644
--- a/sepolicy/vendor/hwservice_contexts
+++ b/sepolicy/vendor/hwservice_contexts
@@ -1,6 +1,7 @@
com.qualcomm.qti.ims.radio::IImsRadio u:object_r:vnd_ims_radio_hwservice:s0
com.qualcomm.qti.qcril.qcrilhook::IQtiOemHook u:object_r:vnd_qcrilhook_hwservice:s0
com.qualcomm.qti.uceservice::IUceService u:object_r:hal_imsrcsd_hwservice:s0
+vendor.qti.atcmdfwd::IAtCmdFwd u:object_r:vnd_atcmdfwd_hwservice:s0
vendor.qti.qcril.am::IQcRilAudio u:object_r:vnd_qcrilhook_hwservice:s0
com.qualcomm.qti.imsrtpservice::IRTPService u:object_r:hal_imsrtp_hwservice:s0
android.hardware.tetheroffload.config::IOffloadConfig u:object_r:hal_tetheroffload_hwservice:s0
diff --git a/sepolicy/vendor/property.te b/sepolicy/vendor/property.te
index 371170bf..b8e8e53f 100644
--- a/sepolicy/vendor/property.te
+++ b/sepolicy/vendor/property.te
@@ -13,3 +13,4 @@ type thermal_prop, property_type;
type modem_diag_prop, property_type;
type tel_mon_prop, property_type;
type sys_time_prop, property_type;
+type atfwd_start_prop, property_type;
diff --git a/sepolicy/vendor/property_contexts b/sepolicy/vendor/property_contexts
index fcc78c42..9635f48a 100644
--- a/sepolicy/vendor/property_contexts
+++ b/sepolicy/vendor/property_contexts
@@ -22,3 +22,4 @@ persist.sys.modem.diag. u:object_r:modem_diag_prop:s0
sys.modem.diag. u:object_r:modem_diag_prop:s0
persist.radio.enable_tel_mon u:object_r:tel_mon_prop:s0
sys.time.set u:object_r:sys_time_prop:s0
+persist.radio.atfwd.start u:object_r:atfwd_start_prop:s0
diff --git a/sepolicy/vendor/qtelephony.te b/sepolicy/vendor/qtelephony.te
new file mode 100644
index 00000000..0788cdfe
--- /dev/null
+++ b/sepolicy/vendor/qtelephony.te
@@ -0,0 +1,15 @@
+# Qualcomm telephony apps, such as AtFwd and FastDormancy
+type qtelephony, domain;
+
+app_domain(qtelephony)
+
+hwbinder_use(qtelephony)
+add_hwservice(qtelephony, vnd_atcmdfwd_hwservice)
+
+allow qtelephony { app_api_service }:service_manager find;
+
+# Read and write /data/data subdirectory.
+allow qtelephony system_app_data_file:dir create_dir_perms;
+allow qtelephony system_app_data_file:{ file lnk_file } create_file_perms;
+
+set_prop(qtelephony, atfwd_start_prop)
diff --git a/sepolicy/vendor/seapp_contexts b/sepolicy/vendor/seapp_contexts
index 7e694ca7..67bff643 100644
--- a/sepolicy/vendor/seapp_contexts
+++ b/sepolicy/vendor/seapp_contexts
@@ -2,6 +2,9 @@ user=system seinfo=platform name=com.google.SSRestartDetector domain=ssr_detecto
user=_app seinfo=platform name=com.android.nexuslogger domain=logger_app type=app_data_file levelFrom=all
user=_app seinfo=platform name=com.android.ramdump domain=ramdump_app type=app_data_file levelFrom=all
+#TODO Remove user "system" when b/63588267 is resolved
+user=system seinfo=platform name=com.qualcomm.telephony domain=qtelephony type=system_app_data_file
+
#Add new domain for DataServices
#TODO Remove user "system" when b/38043081 is resolved
user=system seinfo=platform name=.dataservices domain=dataservice_app type=system_app_data_file