diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4fc82cb..71648e8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -486,9 +486,7 @@
             </intent-filter>
         </receiver>
         <service
-            android:name=".service.EmailBroadcastProcessorService"
-            android:permission="android.permission.BIND_JOB_SERVICE"
-            android:exported="true" />
+            android:name=".service.EmailBroadcastProcessorService" />
 
         <!-- Support for DeviceAdmin / DevicePolicyManager.  See SecurityPolicy class for impl. -->
         <receiver
@@ -508,7 +506,6 @@
         <service
             android:name=".service.AttachmentService"
             android:enabled="false"
-            android:permission="android.permission.BIND_JOB_SERVICE"
             >
         </service>
 
@@ -728,7 +725,6 @@
         </service>
 
         <service android:name="com.android.email.EmailIntentService"
-                 android:permission="android.permission.BIND_JOB_SERVICE"
                  android:exported="false">
             <intent-filter>
                 <action android:name="com.android.mail.action.RESEND_NOTIFICATIONS" />
diff --git a/provider_src/com/android/email/EmailIntentService.java b/provider_src/com/android/email/EmailIntentService.java
index 5924c90..0c6d761 100644
--- a/provider_src/com/android/email/EmailIntentService.java
+++ b/provider_src/com/android/email/EmailIntentService.java
@@ -29,12 +29,12 @@
     private static final String LOG_TAG = LogTag.getLogTag();
 
     public EmailIntentService() {
-        super();
+        super("EmailIntentService");
     }
 
     @Override
-    protected void onHandleWork(final Intent intent) {
-        super.onHandleWork(intent);
+    protected void onHandleIntent(final Intent intent) {
+        super.onHandleIntent(intent);
 
         if (UIProvider.ACTION_UPDATE_NOTIFICATION.equals(intent.getAction())) {
             final NotificationController nc =
diff --git a/provider_src/com/android/email/provider/EmailProvider.java b/provider_src/com/android/email/provider/EmailProvider.java
index 1f0956b..00d608f 100644
--- a/provider_src/com/android/email/provider/EmailProvider.java
+++ b/provider_src/com/android/email/provider/EmailProvider.java
@@ -6357,7 +6357,7 @@
         // Start/stop the various services depending on whether there are any accounts
         // TODO: Make sure that the AttachmentService responds to this request as it
         // expects a particular set of data in the intents that it receives or it ignores.
-        startOrStopService(enabled, context);
+        startOrStopService(enabled, context, new Intent(context, AttachmentService.class));
         final NotificationController controller =
                 NotificationControllerCreatorHolder.getInstance(context);
 
@@ -6367,16 +6367,16 @@
     }
 
     /**
-     * Starts or stops the attachment service as necessary.
-     *
+     * Starts or stops the service as necessary.
      * @param enabled If {@code true}, the service will be started. Otherwise, it will be stopped.
      * @param context The context to manage the service with.
+     * @param intent The intent of the service to be managed.
      */
-    private static void startOrStopService(boolean enabled, Context context) {
+    private static void startOrStopService(boolean enabled, Context context, Intent intent) {
         if (enabled) {
-            AttachmentService.startWithoutSpecificAttachmentChange(context);
+            context.startService(intent);
         } else {
-            AttachmentService.stop(context);
+            context.stopService(intent);
         }
     }
 
diff --git a/provider_src/com/android/email/service/AttachmentService.java b/provider_src/com/android/email/service/AttachmentService.java
index 50ee429..6321049 100644
--- a/provider_src/com/android/email/service/AttachmentService.java
+++ b/provider_src/com/android/email/service/AttachmentService.java
@@ -27,20 +27,15 @@
 import android.database.Cursor;
 import android.net.ConnectivityManager;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.text.format.DateUtils;
 
-import androidx.core.os.BuildCompat;
-
 import com.android.email.AttachmentInfo;
 import com.android.email.EmailConnectivityManager;
-import com.android.email.EmailNotificationController;
 import com.android.email.NotificationControllerCreatorHolder;
 import com.android.email.NotificationController;
-import com.android.email.R;
 import com.android.emailcommon.provider.Account;
 import com.android.emailcommon.provider.EmailContent;
 import com.android.emailcommon.provider.EmailContent.Attachment;
@@ -126,10 +121,6 @@
     // Signify that we are being shut down & destroyed.
     private volatile boolean mStop = false;
 
-    // Indicates whether this service is currently running. Currently, only used for Android O+ to
-    // decide whether to call startForegroundService or startService in start method.
-    private static volatile boolean isRunning = false;
-
     EmailConnectivityManager mConnectivityManager;
 
     // Helper class that keeps track of in progress downloads to make sure that they
@@ -595,35 +586,7 @@
         debugTrace("Calling startService with extras %d & %d", id, flags);
         intent.putExtra(EXTRA_ATTACHMENT_ID, id);
         intent.putExtra(EXTRA_ATTACHMENT_FLAGS, flags);
-        start(context, intent);
-    }
-
-    public static void startWithoutSpecificAttachmentChange(Context context) {
-        LogUtils.d(LOG_TAG, "Going to start AttachmentService without specifying an attachment.");
-
-        Intent intent = new Intent(context, AttachmentService.class);
-        start(context, intent);
-    }
-
-    /**
-     * Starts running attachment service.
-     *
-     * @param intent an intent set to run AttachmentService class
-     */
-    public static void start(Context context, Intent intent) {
-        if (context.getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O &&
-                !isRunning) {
-            LogUtils.i(LOG_TAG, "startForegroundService");
-            context.startForegroundService(intent);
-        } else {
-            LogUtils.i(LOG_TAG, "startService");
-            context.startService(intent);
-        }
-    }
-
-    public static void stop(Context context) {
-        Intent intent = new Intent(context, AttachmentService.class);
-        context.stopService(intent);
+        context.startService(intent);
     }
 
     /**
@@ -659,16 +622,6 @@
      */
     @Override
     public void onCreate() {
-        isRunning = true;
-        if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O) {
-            LogUtils.i(LOG_TAG, "startForeground");
-            startForeground(
-                    EmailNotificationController.NOTIFICATION_ID_ONGOING_ATTACHMENT,
-                    EmailNotificationController.getOngoingDownloadNotification(
-                            getApplicationContext(),
-                            getApplicationContext().getString(
-                                    R.string.notification_downloading_attachments_title)));
-        }
         // Start up our service thread.
         new Thread(this, "AttachmentService").start();
     }
@@ -696,7 +649,6 @@
             mConnectivityManager.stopWait();
             mConnectivityManager = null;
         }
-        isRunning = false;
     }
 
     /**
diff --git a/provider_src/com/android/email/service/EmailBroadcastProcessorService.java b/provider_src/com/android/email/service/EmailBroadcastProcessorService.java
index 5d264f0..7aa5467 100644
--- a/provider_src/com/android/email/service/EmailBroadcastProcessorService.java
+++ b/provider_src/com/android/email/service/EmailBroadcastProcessorService.java
@@ -17,6 +17,7 @@
 package com.android.email.service;
 
 import android.accounts.AccountManager;
+import android.app.IntentService;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.ContentUris;
@@ -33,8 +34,6 @@
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 
-import androidx.core.app.JobIntentService;
-
 import com.android.email.EmailIntentService;
 import com.android.email.Preferences;
 import com.android.email.R;
@@ -70,9 +69,7 @@
  * This also handles the DeviceAdminReceiver in SecurityPolicy, because it is also
  * a BroadcastReceiver and requires the same processing semantics.
  */
-public class EmailBroadcastProcessorService extends JobIntentService {
-    public static final int JOB_ID = 200;
-
+public class EmailBroadcastProcessorService extends IntentService {
     // Action used for BroadcastReceiver entry point
     private static final String ACTION_BROADCAST = "broadcast_receiver";
 
@@ -84,11 +81,11 @@
     private static final String ACTION_UPGRADE_BROADCAST = "upgrade_broadcast_receiver";
 
     public EmailBroadcastProcessorService() {
-        super();
-    }
+        // Class name will be the thread name.
+        super(EmailBroadcastProcessorService.class.getName());
 
-    public static void enqueueWork(Context context, Intent work) {
-        enqueueWork(context, EmailBroadcastProcessorService.class, JOB_ID, work);
+        // Intent should be redelivered if the process gets killed before completing the job.
+        setIntentRedelivery(true);
     }
 
     /**
@@ -98,13 +95,13 @@
         Intent i = new Intent(context, EmailBroadcastProcessorService.class);
         i.setAction(ACTION_BROADCAST);
         i.putExtra(Intent.EXTRA_INTENT, broadcastIntent);
-        EmailBroadcastProcessorService.enqueueWork(context, i);
+        context.startService(i);
     }
 
     public static void processUpgradeBroadcastIntent(final Context context) {
         final Intent i = new Intent(context, EmailBroadcastProcessorService.class);
         i.setAction(ACTION_UPGRADE_BROADCAST);
-        EmailBroadcastProcessorService.enqueueWork(context, i);
+        context.startService(i);
     }
 
     /**
@@ -116,11 +113,11 @@
         Intent i = new Intent(context, EmailBroadcastProcessorService.class);
         i.setAction(ACTION_DEVICE_POLICY_ADMIN);
         i.putExtra(EXTRA_DEVICE_POLICY_ADMIN, message);
-        EmailBroadcastProcessorService.enqueueWork(context, i);
+        context.startService(i);
     }
 
     @Override
-    protected void onHandleWork(Intent intent) {
+    protected void onHandleIntent(Intent intent) {
         // This method is called on a worker thread.
 
         // Dispatch from entry point
diff --git a/res/values/strings.xml b/res/values/strings.xml
index dd1d5c1..2f39425 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -110,9 +110,6 @@
     <!-- Notification title when a forwarded attachment couldn't be sent [CHAR LIMIT=30]-->
     <string name="forward_download_failed_title">Attachment not forwarded</string>
 
-    <!-- Notification title when an attachment is being downloaded on Android O and later [CHAR LIMIT=30] -->
-    <string name="notification_downloading_attachments_title">Syncing mail&#8230;</string>
-
     <!-- Notification ticker when email account authentication fails [CHAR LIMIT=none] -->
     <string name="login_failed_ticker">
         <xliff:g id="account_name">%s</xliff:g> signin unsuccessful.</string>
diff --git a/src/com/android/email/EmailNotificationController.java b/src/com/android/email/EmailNotificationController.java
index c9254ad..6773f1b 100644
--- a/src/com/android/email/EmailNotificationController.java
+++ b/src/com/android/email/EmailNotificationController.java
@@ -68,10 +68,6 @@
     private static final int NOTIFICATION_ID_ATTACHMENT_WARNING = 3;
     private static final int NOTIFICATION_ID_PASSWORD_EXPIRING = 4;
     private static final int NOTIFICATION_ID_PASSWORD_EXPIRED = 5;
-    private static final int NOTIFICATION_ID_PERMISSIONS_NEEDED = 6;
-    public static final int NOTIFICATION_ID_ONGOING_ATTACHMENT = 7;
-
-    public static final String NOTIFICATION_CHANNEL_ID_ATTACHMENTS = "^nc_~_z_attachments";
 
     private static final int NOTIFICATION_ID_BASE_MASK = 0xF0000000;
     private static final int NOTIFICATION_ID_BASE_LOGIN_WARNING = 0x20000000;
@@ -405,31 +401,6 @@
     }
 
     /**
-     * Creates a notification to be used with {@link com.android.email.service.AttachmentService},
-     * which should be launched as a foreground service on Android O+.
-     *
-     * <p>The notification is sent with the lowest priority and contains an indefinite loading bar,
-     * hence "ongoing".
-     *
-     * @param title The text that will be displayed on the ongoing notification.
-     */
-    public static Notification getOngoingDownloadNotification(Context context, String title) {
-        NotificationCompat.Builder builder =
-                new NotificationCompat.Builder(context)
-                        .setContentTitle(title)
-                        .setVisibility(Notification.VISIBILITY_SECRET)
-                        .setProgress(0, 0, true)
-                        .setSmallIcon(R.drawable.ic_notification_mail_24dp)
-                        .setOngoing(true);
-
-        if (context.getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O) {
-            builder.setChannelId(NOTIFICATION_CHANNEL_ID_ATTACHMENTS);
-        }
-
-        return builder.build();
-    }
-
-    /**
      * Returns a notification ID for login failed notifications for the given account account.
      */
     private static int getLoginFailedNotificationId(long accountId) {
diff --git a/src/com/android/email/activity/ComposeActivityEmailExternal.java b/src/com/android/email/activity/ComposeActivityEmailExternal.java
index a5cbe9d..a94313a 100644
--- a/src/com/android/email/activity/ComposeActivityEmailExternal.java
+++ b/src/com/android/email/activity/ComposeActivityEmailExternal.java
@@ -49,6 +49,9 @@
     Intent sanitizedIntent = getIntent();
     if (sanitizedIntent != null) {
       Bundle originalExtras = sanitizedIntent.getExtras();
+       if (originalExtras == null) {
+        originalExtras = new Bundle();
+      }
       sanitizedIntent.replaceExtras(new Bundle());
       copyStringExtraIfExists(ComposeActivity.EXTRA_SUBJECT, originalExtras, sanitizedIntent);
       copyStringExtraIfExists(ComposeActivity.EXTRA_TO, originalExtras, sanitizedIntent);
