diff --git a/src/com/android/exchange/adapter/CalendarSyncParser.java b/src/com/android/exchange/adapter/CalendarSyncParser.java
index f059c09..0659024 100644
--- a/src/com/android/exchange/adapter/CalendarSyncParser.java
+++ b/src/com/android/exchange/adapter/CalendarSyncParser.java
@@ -566,7 +566,7 @@
             }
             // Tell UI that we don't have any attendees
             cv.put(Events.HAS_ATTENDEE_DATA, "0");
-            LogUtils.d(TAG, "Maximum number of attendees exceeded; redacting");
+            LogUtils.i(TAG, "Maximum number of attendees exceeded; redacting");
         } else if (numAttendees > 0) {
             StringBuilder sb = new StringBuilder();
             for (ContentValues attendee: attendeeValues) {
@@ -882,7 +882,7 @@
             ops.newReminder(reminderMins, exceptionStart);
         }
         if (attendeesRedacted) {
-            LogUtils.d(TAG, "Attendees redacted in this exception");
+            LogUtils.i(TAG, "Attendees redacted in this exception");
         }
     }
 
diff --git a/src/com/android/exchange/adapter/FolderSyncParser.java b/src/com/android/exchange/adapter/FolderSyncParser.java
index 9226ff2..20ce279 100644
--- a/src/com/android/exchange/adapter/FolderSyncParser.java
+++ b/src/com/android/exchange/adapter/FolderSyncParser.java
@@ -289,7 +289,7 @@
                     final Cursor c = getServerIdCursor(serverId);
                     try {
                         if (c.moveToFirst()) {
-                            LogUtils.d(TAG, "Deleting %s", serverId);
+                            LogUtils.i(TAG, "Deleting %s", serverId);
                             final long mailboxId = c.getLong(MAILBOX_ID_COLUMNS_ID);
                             mOperations.add(ContentProviderOperation.newDelete(
                                     ContentUris.withAppendedId(Mailbox.CONTENT_URI,
@@ -514,7 +514,7 @@
             try {
                 // If we find the mailbox (using serverId), make the change
                 if (c.moveToFirst()) {
-                    LogUtils.d(TAG, "Updating %s", serverId);
+                    LogUtils.i(TAG, "Updating %s", serverId);
                     final ContentValues cv = new ContentValues();
                     // Store the new parent key.
                     cv.put(Mailbox.PARENT_SERVER_ID, parentId);
diff --git a/src/com/android/exchange/adapter/MeetingResponseParser.java b/src/com/android/exchange/adapter/MeetingResponseParser.java
index 7fc238c..3849acd 100644
--- a/src/com/android/exchange/adapter/MeetingResponseParser.java
+++ b/src/com/android/exchange/adapter/MeetingResponseParser.java
@@ -36,10 +36,10 @@
             if (tag == Tags.MREQ_STATUS) {
                 int status = getValueInt();
                 if (status != 1) {
-                    LogUtils.w(TAG, "Error in meeting response: %d", status);
+                    LogUtils.i(TAG, "Error in meeting response: %d", status);
                 }
             } else if (tag == Tags.MREQ_CAL_ID) {
-                LogUtils.d(TAG, "Meeting response calender id: %s", getValue());
+                LogUtils.i(TAG, "Meeting response calender id: %s", getValue());
             } else {
                 skipTag();
             }
diff --git a/src/com/android/exchange/adapter/MoveItemsParser.java b/src/com/android/exchange/adapter/MoveItemsParser.java
index aa5d787..f593bcf 100644
--- a/src/com/android/exchange/adapter/MoveItemsParser.java
+++ b/src/com/android/exchange/adapter/MoveItemsParser.java
@@ -88,14 +88,14 @@
                 }
                 if (status != STATUS_SUCCESS) {
                     // There's not much to be done if this fails
-                    LogUtils.w(TAG, "Error in MoveItems: %d", status);
+                    LogUtils.i(TAG, "Error in MoveItems: %d", status);
                 }
             } else if (tag == Tags.MOVE_DSTMSGID) {
                 mNewServerId = getValue();
-                LogUtils.d(TAG, "Moved message id is now: %s", mNewServerId);
+                LogUtils.i(TAG, "Moved message id is now: %s", mNewServerId);
             } else if (tag == Tags.MOVE_SRCMSGID) {
                 mSourceServerId = getValue();
-                LogUtils.d(TAG, "Source message id is: %s", mNewServerId);
+                LogUtils.i(TAG, "Source message id is: %s", mNewServerId);
             } else {
                 skipTag();
             }
diff --git a/src/com/android/exchange/adapter/PingParser.java b/src/com/android/exchange/adapter/PingParser.java
index 58d252a..4134884 100644
--- a/src/com/android/exchange/adapter/PingParser.java
+++ b/src/com/android/exchange/adapter/PingParser.java
@@ -203,7 +203,7 @@
                 }
                 parsePingFolders();
                 final int count = mSyncList.size();
-                LogUtils.d(TAG, "Folders has %d elements", count);
+                LogUtils.i(TAG, "Folders has %d elements", count);
                 if (count == 0) {
                     throw new IOException("Folders was empty");
                 }
diff --git a/src/com/android/exchange/adapter/ProvisionParser.java b/src/com/android/exchange/adapter/ProvisionParser.java
index d7be0d8..08f0ed7 100644
--- a/src/com/android/exchange/adapter/ProvisionParser.java
+++ b/src/com/android/exchange/adapter/ProvisionParser.java
@@ -535,13 +535,13 @@
             switch (tag) {
                 case Tags.PROVISION_POLICY_TYPE:
                     policyType = getValue();
-                    LogUtils.d(TAG, "Policy type: %s", policyType);
+                    LogUtils.i(TAG, "Policy type: %s", policyType);
                     break;
                 case Tags.PROVISION_POLICY_KEY:
                     mSecuritySyncKey = getValue();
                     break;
                 case Tags.PROVISION_STATUS:
-                    LogUtils.d(TAG, "Policy status: %s", getValue());
+                    LogUtils.i(TAG, "Policy status: %s", getValue());
                     break;
                 case Tags.PROVISION_DATA:
                     if (policyType.equalsIgnoreCase(EasProvision.EAS_2_POLICY_TYPE)) {
@@ -571,7 +571,7 @@
     private void parseDeviceInformation() throws IOException {
         while (nextTag(Tags.SETTINGS_DEVICE_INFORMATION) != END) {
             if (tag == Tags.SETTINGS_STATUS) {
-                LogUtils.d(TAG, "DeviceInformation status: %s", getValue());
+                LogUtils.i(TAG, "DeviceInformation status: %s", getValue());
             } else {
                 skipTag();
             }
@@ -588,7 +588,7 @@
             switch (tag) {
                 case Tags.PROVISION_STATUS:
                     int status = getValueInt();
-                    LogUtils.d(TAG, "Provision status: %d", status);
+                    LogUtils.i(TAG, "Provision status: %d", status);
                     res = (status == 1);
                     break;
                 case Tags.SETTINGS_DEVICE_INFORMATION:
diff --git a/src/com/android/exchange/adapter/SettingsParser.java b/src/com/android/exchange/adapter/SettingsParser.java
index 5551db6..1f177dc 100644
--- a/src/com/android/exchange/adapter/SettingsParser.java
+++ b/src/com/android/exchange/adapter/SettingsParser.java
@@ -45,7 +45,7 @@
         while (nextTag(START_DOCUMENT) != END_DOCUMENT) {
             if (tag == Tags.SETTINGS_STATUS) {
                 int status = getValueInt();
-                LogUtils.d(TAG, "Settings status = %d", status);
+                LogUtils.i(TAG, "Settings status = %d", status);
                 if (status == 1) {
                     res = true;
                 } else {
@@ -74,7 +74,7 @@
     public void parseSet() throws IOException {
         while (nextTag(Tags.SETTINGS_SET) != END) {
             if (tag == Tags.SETTINGS_STATUS) {
-                LogUtils.d(TAG, "Set status = %d", getValueInt());
+                LogUtils.i(TAG, "Set status = %d", getValueInt());
             } else {
                 skipTag();
             }
diff --git a/src/com/android/exchange/eas/EasConnectionCache.java b/src/com/android/exchange/eas/EasConnectionCache.java
index 3b1f140..175f3ca 100644
--- a/src/com/android/exchange/eas/EasConnectionCache.java
+++ b/src/com/android/exchange/eas/EasConnectionCache.java
@@ -78,7 +78,7 @@
      */
     private EmailClientConnectionManager createConnectionManager(final Context context,
             final HostAuth hostAuth) {
-        LogUtils.d(Eas.LOG_TAG, "Creating connection for HostAuth %d", hostAuth.mId);
+        LogUtils.i(Eas.LOG_TAG, "Creating connection for HostAuth %d", hostAuth.mId);
         final HttpParams params = new BasicHttpParams();
         params.setIntParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 25);
         params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, sConnPerRoute);
@@ -94,7 +94,7 @@
      */
     private synchronized EmailClientConnectionManager getCachedConnectionManager(
             final Context context, final HostAuth hostAuth) {
-        LogUtils.d(Eas.LOG_TAG, "Reusing cached connection for HostAuth %d", hostAuth.mId);
+        LogUtils.i(Eas.LOG_TAG, "Reusing cached connection for HostAuth %d", hostAuth.mId);
         EmailClientConnectionManager connectionManager = mConnectionMap.get(hostAuth.mId);
         if (connectionManager == null) {
             connectionManager = createConnectionManager(context, hostAuth);
@@ -130,7 +130,7 @@
      * @param hostAuth The {@link HostAuth} whose connection manager should be deleted.
      */
     public synchronized void uncacheConnectionManager(final HostAuth hostAuth) {
-        LogUtils.d(Eas.LOG_TAG, "Uncaching connection for HostAuth %d", hostAuth.mId);
+        LogUtils.i(Eas.LOG_TAG, "Uncaching connection for HostAuth %d", hostAuth.mId);
         mConnectionMap.remove(hostAuth.mId);
     }
 }
diff --git a/src/com/android/exchange/eas/EasFolderSync.java b/src/com/android/exchange/eas/EasFolderSync.java
index 5f81a91..63ea753 100644
--- a/src/com/android/exchange/eas/EasFolderSync.java
+++ b/src/com/android/exchange/eas/EasFolderSync.java
@@ -101,7 +101,7 @@
         if (mStatusOnly) {
             return RESULT_WRONG_OPERATION;
         }
-        LogUtils.d(LOG_TAG, "Performing sync for account %d", mAccount.mId);
+        LogUtils.i(LOG_TAG, "Performing sync for account %d", mAccount.mId);
         return performOperation(syncResult);
     }
 
@@ -115,7 +115,7 @@
             writeResultCode(bundle, RESULT_OTHER_FAILURE);
             return bundle;
         }
-        LogUtils.d(LOG_TAG, "Performing validation");
+        LogUtils.i(LOG_TAG, "Performing validation");
 
         if (!registerClientCert()) {
             bundle.putInt(EmailServiceProxy.VALIDATE_BUNDLE_RESULT_CODE,
diff --git a/src/com/android/exchange/eas/EasOperation.java b/src/com/android/exchange/eas/EasOperation.java
index 273d9fb..87c871f 100644
--- a/src/com/android/exchange/eas/EasOperation.java
+++ b/src/com/android/exchange/eas/EasOperation.java
@@ -578,7 +578,7 @@
         final Bundle extras = new Bundle(1);
         extras.putBoolean(Mailbox.SYNC_EXTRA_NOOP, true);
         ContentResolver.requestSync(amAccount, authority, extras);
-        LogUtils.d(LOG_TAG, "requestSync EasOperation requestNoOpSync %s, %s",
+        LogUtils.i(LOG_TAG, "requestSync EasOperation requestNoOpSync %s, %s",
                 amAccount.toString(), extras.toString());
     }
 }
diff --git a/src/com/android/exchange/eas/EasOptions.java b/src/com/android/exchange/eas/EasOptions.java
index 32d2c75..c6c4d03 100644
--- a/src/com/android/exchange/eas/EasOptions.java
+++ b/src/com/android/exchange/eas/EasOptions.java
@@ -114,7 +114,7 @@
         // The string is a comma separated list of EAS versions in ascending order
         // e.g. 1.0,2.0,2.5,12.0,12.1,14.0,14.1
         final String supportedVersions = versionHeader.getValue();
-        LogUtils.d(LOG_TAG, "Server supports versions: %s", supportedVersions);
+        LogUtils.i(LOG_TAG, "Server supports versions: %s", supportedVersions);
         final String[] supportedVersionsArray = supportedVersions.split(",");
         // Find the most recent version we support
         String newProtocolVersion = null;
diff --git a/src/com/android/exchange/service/CalendarSyncAdapterService.java b/src/com/android/exchange/service/CalendarSyncAdapterService.java
index 7f77193..376680a 100644
--- a/src/com/android/exchange/service/CalendarSyncAdapterService.java
+++ b/src/com/android/exchange/service/CalendarSyncAdapterService.java
@@ -25,7 +25,6 @@
 import android.database.Cursor;
 import android.os.Bundle;
 import android.provider.CalendarContract.Events;
-import android.util.Log;
 
 import com.android.emailcommon.provider.EmailContent;
 import com.android.emailcommon.provider.EmailContent.MailboxColumns;
@@ -65,14 +64,11 @@
         @Override
         public void onPerformSync(Account account, Bundle extras,
                 String authority, ContentProviderClient provider, SyncResult syncResult) {
-            if (LogUtils.isLoggable(TAG, Log.DEBUG)) {
-                LogUtils.d(TAG, "onPerformSync Calendar starting %s, %s", account.toString(),
-                        extras.toString());
-            } else {
-                LogUtils.i(TAG, "onPerformSync Calendar starting %s", extras.toString());
-            }
+            LogUtils.i(TAG, "onPerformSync Calendar starting %s, %s", account.toString(),
+                    extras.toString());
             CalendarSyncAdapterService.performSync(getContext(), account, extras);
-            LogUtils.d(TAG, "onPerformSync Calendar finished");
+            LogUtils.i(TAG, "onPerformSync Calendar finished %s, %s", account.toString(),
+                    extras.toString());
         }
     }
 
@@ -126,6 +122,7 @@
             mailExtras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
         }
         ContentResolver.requestSync(account, EmailContent.AUTHORITY, mailExtras);
-        LogUtils.d(TAG, "requestSync CalendarSyncAdapter %s", mailExtras.toString());
+        LogUtils.i(TAG, "requestSync CalendarSyncAdapter %s, %s",
+                account.toString(), mailExtras.toString());
     }
 }
diff --git a/src/com/android/exchange/service/ContactsSyncAdapterService.java b/src/com/android/exchange/service/ContactsSyncAdapterService.java
index 4c09617..77eac3d 100644
--- a/src/com/android/exchange/service/ContactsSyncAdapterService.java
+++ b/src/com/android/exchange/service/ContactsSyncAdapterService.java
@@ -27,7 +27,6 @@
 import android.os.Bundle;
 import android.provider.ContactsContract.Groups;
 import android.provider.ContactsContract.RawContacts;
-import android.util.Log;
 
 import com.android.emailcommon.provider.EmailContent;
 import com.android.emailcommon.provider.EmailContent.MailboxColumns;
@@ -65,14 +64,11 @@
         @Override
         public void onPerformSync(Account account, Bundle extras,
                 String authority, ContentProviderClient provider, SyncResult syncResult) {
-            if (LogUtils.isLoggable(TAG, Log.DEBUG)) {
-                LogUtils.d(TAG, "onPerformSync Contacts starting %s, %s", account.toString(),
-                        extras.toString());
-            } else {
-                LogUtils.i(TAG, "onPerformSync Contacts starting %s", extras.toString());
-            }
+            LogUtils.i(TAG, "onPerformSync Contacts starting %s, %s", account.toString(),
+                    extras.toString());
             ContactsSyncAdapterService.performSync(getContext(), account, extras);
-            LogUtils.d(TAG, "onPerformSync Contacts finished");
+            LogUtils.i(TAG, "onPerformSync Contacts ending %s, %s", account.toString(),
+                    extras.toString());
         }
     }
 
@@ -114,7 +110,7 @@
                 changed = hasDirtyRows(cr, uri, Groups.DIRTY);
             }
             if (!changed) {
-                LogUtils.d(TAG, "Upload sync; no changes");
+                LogUtils.i(TAG, "Upload sync; no changes");
                 return;
             }
         }
@@ -136,6 +132,7 @@
             mailExtras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
         }
         ContentResolver.requestSync(account, EmailContent.AUTHORITY, mailExtras);
-        LogUtils.d(TAG, "requestSync ContactsSyncAdapter %s", mailExtras.toString());
+        LogUtils.i(TAG, "requestSync ContactsSyncAdapter %s, %s",
+                account.toString(), mailExtras.toString());
     }
 }
diff --git a/src/com/android/exchange/service/EasCalendarSyncHandler.java b/src/com/android/exchange/service/EasCalendarSyncHandler.java
index afdee7b..396c116 100644
--- a/src/com/android/exchange/service/EasCalendarSyncHandler.java
+++ b/src/com/android/exchange/service/EasCalendarSyncHandler.java
@@ -271,7 +271,7 @@
 
         // Delete any orphaned exceptions
         for (final long orphan : orphanedExceptions) {
-            LogUtils.d(TAG, "Deleted orphaned exception: %d", orphan);
+            LogUtils.i(TAG, "Deleted orphaned exception: %d", orphan);
             mContentResolver.delete(asSyncAdapter(
                     ContentUris.withAppendedId(Events.CONTENT_URI, orphan)), null, null);
         }
@@ -309,7 +309,7 @@
                 CalendarUtilities.createMessageForEntity(mContext, entity,
                         Message.FLAG_OUTGOING_MEETING_DECLINE, clientId, mAccount);
         if (msg != null) {
-            LogUtils.d(TAG, "Queueing declined response to %s", msg.mTo);
+            LogUtils.i(TAG, "Queueing declined response to %s", msg.mTo);
             mOutgoingMailList.add(msg);
         }
     }
@@ -693,7 +693,7 @@
                     final Message msg = CalendarUtilities.createMessageForEntity(mContext, exEntity,
                             flag, clientId, mAccount);
                     if (msg != null) {
-                        LogUtils.d(TAG, "Queueing exception update to %s", msg.mTo);
+                        LogUtils.i(TAG, "Queueing exception update to %s", msg.mTo);
                         mOutgoingMailList.add(msg);
                     }
                 }
@@ -743,7 +743,7 @@
                 CalendarUtilities.createMessageForEventId(mContext, eventId,
                         Message.FLAG_OUTGOING_MEETING_INVITE, clientId, mAccount);
             if (msg != null) {
-                LogUtils.d(TAG, "Queueing invitation to %s", msg.mTo);
+                LogUtils.i(TAG, "Queueing invitation to %s", msg.mTo);
                 mOutgoingMailList.add(msg);
             }
             // Make a list out of our tokenized attendees, if we have any
@@ -790,7 +790,7 @@
                         removedAttendee);
                 if (cancelMsg != null) {
                     // Just send it to the removed attendee
-                    LogUtils.d(TAG, "Queueing cancellation to removed attendee %s", cancelMsg.mTo);
+                    LogUtils.i(TAG, "Queueing cancellation to removed attendee %s", cancelMsg.mTo);
                     mOutgoingMailList.add(cancelMsg);
                 }
             }
@@ -837,7 +837,7 @@
                     final Message msg = CalendarUtilities.createMessageForEventId(mContext, eventId,
                             messageFlag, clientId, mAccount);
                     if (msg != null) {
-                        LogUtils.d(TAG, "Queueing invitation reply to %s", msg.mTo);
+                        LogUtils.i(TAG, "Queueing invitation reply to %s", msg.mTo);
                         mOutgoingMailList.add(msg);
                     }
                 }
@@ -886,7 +886,7 @@
 
         if (first) {
             s.start(Tags.SYNC_COMMANDS);
-            LogUtils.d(TAG, "Sending Calendar changes to the server");
+            LogUtils.i(TAG, "Sending Calendar changes to the server");
         }
 
         final boolean selfOrganizer = organizerEmail.equalsIgnoreCase(mAccount.mEmailAddress);
@@ -899,7 +899,7 @@
         final long eventId = entityValues.getAsLong(Events._ID);
         if (serverId == null) {
             // This is a new event; create a clientId
-            LogUtils.d(TAG, "Creating new event with clientId: %s", clientId);
+            LogUtils.i(TAG, "Creating new event with clientId: %s", clientId);
             s.start(Tags.SYNC_ADD).data(Tags.SYNC_CLIENT_ID, clientId);
             // And save it in the Event as the local id
             final ContentValues cv = new ContentValues(2);
@@ -909,14 +909,14 @@
                     asSyncAdapter(ContentUris.withAppendedId(Events.CONTENT_URI, eventId)),
                     cv, null, null);
         } else if (entityValues.getAsInteger(Events.DELETED) == 1) {
-            LogUtils.d(TAG, "Deleting event with serverId: %s", serverId);
+            LogUtils.i(TAG, "Deleting event with serverId: %s", serverId);
             s.start(Tags.SYNC_DELETE).data(Tags.SYNC_SERVER_ID, serverId).end();
             mDeletedIdList.add(eventId);
             if (selfOrganizer) {
                 final Message msg = CalendarUtilities.createMessageForEventId(mContext,
                         eventId, Message.FLAG_OUTGOING_MEETING_CANCEL, null, mAccount);
                 if (msg != null) {
-                    LogUtils.d(TAG, "Queueing cancellation to %s", msg.mTo);
+                    LogUtils.i(TAG, "Queueing cancellation to %s", msg.mTo);
                     mOutgoingMailList.add(msg);
                 }
             } else {
@@ -925,7 +925,7 @@
             // For deletions, we don't need to add application data, so just bail here.
             return true;
         } else {
-            LogUtils.d(TAG, "Upsync change to event with serverId: %s", serverId);
+            LogUtils.i(TAG, "Upsync change to event with serverId: %s", serverId);
             s.start(Tags.SYNC_CHANGE).data(Tags.SYNC_SERVER_ID, serverId);
             // Save to the ContentResolver.
             final String version = getEntityVersion(entityValues);
diff --git a/src/com/android/exchange/service/EasContactsSyncHandler.java b/src/com/android/exchange/service/EasContactsSyncHandler.java
index 0262a03..890d630 100644
--- a/src/com/android/exchange/service/EasContactsSyncHandler.java
+++ b/src/com/android/exchange/service/EasContactsSyncHandler.java
@@ -683,14 +683,14 @@
                 final ArrayList<Integer> groupIds = new ArrayList<Integer>();
                 if (first) {
                     s.start(Tags.SYNC_COMMANDS);
-                    LogUtils.d(TAG, "Sending Contacts changes to the server");
+                    LogUtils.i(TAG, "Sending Contacts changes to the server");
                     first = false;
                 }
                 if (serverId == null) {
                     // This is a new contact; create a clientId
                     final String clientId =
                             "new_" + mMailbox.mId + '_' + System.currentTimeMillis();
-                    LogUtils.d(TAG, "Creating new contact with clientId: %s", clientId);
+                    LogUtils.i(TAG, "Creating new contact with clientId: %s", clientId);
                     s.start(Tags.SYNC_ADD).data(Tags.SYNC_CLIENT_ID, clientId);
                     // And save it in the raw contact
                     cidValues.put(ContactsContract.RawContacts.SYNC1, clientId);
@@ -699,13 +699,13 @@
                             cidValues, null, null);
                 } else {
                     if (entityValues.getAsInteger(ContactsContract.RawContacts.DELETED) == 1) {
-                        LogUtils.d(TAG, "Deleting contact with serverId: %s", serverId);
+                        LogUtils.i(TAG, "Deleting contact with serverId: %s", serverId);
                         s.start(Tags.SYNC_DELETE).data(Tags.SYNC_SERVER_ID, serverId).end();
                         mDeletedContacts.add(
                                 entityValues.getAsLong(ContactsContract.RawContacts._ID));
                         continue;
                     }
-                    LogUtils.d(TAG, "Upsync change to contact with serverId: %s", serverId);
+                    LogUtils.i(TAG, "Upsync change to contact with serverId: %s", serverId);
                     s.start(Tags.SYNC_CHANGE).data(Tags.SYNC_SERVER_ID, serverId);
                 }
                 s.start(Tags.SYNC_APPLICATION_DATA);
diff --git a/src/com/android/exchange/service/EasServerConnection.java b/src/com/android/exchange/service/EasServerConnection.java
index 79af56f..a14a2be 100644
--- a/src/com/android/exchange/service/EasServerConnection.java
+++ b/src/com/android/exchange/service/EasServerConnection.java
@@ -525,7 +525,7 @@
             final String authority, final long mailboxId) {
         final Bundle extras = Mailbox.createSyncBundle(mailboxId);
         ContentResolver.requestSync(amAccount, authority, extras);
-        LogUtils.d(TAG, "requestSync EasServerConnection requestSyncForMailbox %s, %s",
+        LogUtils.i(TAG, "requestSync EasServerConnection requestSyncForMailbox %s, %s",
                 amAccount.toString(), extras.toString());
     }
 }
diff --git a/src/com/android/exchange/service/EasSyncHandler.java b/src/com/android/exchange/service/EasSyncHandler.java
index da5d76d..a1196c8 100644
--- a/src/com/android/exchange/service/EasSyncHandler.java
+++ b/src/com/android/exchange/service/EasSyncHandler.java
@@ -265,7 +265,7 @@
     private Serializer buildEasRequest(
             final String syncKey, final boolean initialSync, int numWindows) throws IOException {
         final String className = getFolderClassName();
-        LogUtils.d(TAG, "Syncing account %d mailbox %d (class %s) with syncKey %s", mAccount.mId,
+        LogUtils.i(TAG, "Syncing account %d mailbox %d (class %s) with syncKey %s", mAccount.mId,
                 mMailbox.mId, className, syncKey);
 
         final Serializer s = new Serializer();
diff --git a/src/com/android/exchange/service/EmailSyncAdapterService.java b/src/com/android/exchange/service/EmailSyncAdapterService.java
index 36bfd41..93aa0a4 100644
--- a/src/com/android/exchange/service/EmailSyncAdapterService.java
+++ b/src/com/android/exchange/service/EmailSyncAdapterService.java
@@ -36,7 +36,6 @@
 import android.provider.ContactsContract;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
-import android.util.Log;
 
 import com.android.emailcommon.Api;
 import com.android.emailcommon.TempDirectory;
@@ -531,7 +530,7 @@
 
     @Override
     public void onCreate() {
-        LogUtils.v(TAG, "onCreate()");
+        LogUtils.i(TAG, "onCreate()");
         super.onCreate();
         startService(new Intent(this, EmailSyncAdapterService.class));
         // Restart push for all accounts that need it.
@@ -541,7 +540,7 @@
 
     @Override
     public void onDestroy() {
-        LogUtils.v(TAG, "onDestroy()");
+        LogUtils.i(TAG, "onDestroy()");
         super.onDestroy();
         for (PingTask task : mSyncHandlerMap.mPingHandlers.values()) {
             if (task != null) {
@@ -595,11 +594,7 @@
         public void onPerformSync(final android.accounts.Account acct, final Bundle extras,
                 final String authority, final ContentProviderClient provider,
                 final SyncResult syncResult) {
-            if (LogUtils.isLoggable(TAG, Log.DEBUG)) {
-                LogUtils.d(TAG, "onPerformSync: %s, %s", acct.toString(), extras.toString());
-            } else {
-                LogUtils.i(TAG, "onPerformSync: %s", extras.toString());
-            }
+            LogUtils.i(TAG, "onPerformSync: %s, %s", acct.toString(), extras.toString());
             TempDirectory.setTempDirectory(EmailSyncAdapterService.this);
 
             // TODO: Perform any connectivity checks, bail early if we don't have proper network
@@ -616,7 +611,8 @@
                 if (!accountCursor.moveToFirst()) {
                     // Could not load account.
                     // TODO: improve error handling.
-                    LogUtils.w(TAG, "onPerformSync: could not load account");
+                    LogUtils.w(TAG, "onPerformSync: could not load account %s, %s",
+                            acct.toString(), extras.toString());
                     return;
                 }
                 account = new Account();
@@ -642,7 +638,8 @@
             // If we're just twiddling the push, we do the lightweight thing and bail early.
             if (pushOnly && !isFolderSync) {
                 mSyncHandlerMap.modifyPing(account);
-                LogUtils.d(TAG, "onPerformSync: mailbox push only");
+                LogUtils.i(TAG, "onPerformSync: mailbox push only %s, %s",
+                        acct.toString(), extras.toString());
                 return;
             }
 
@@ -704,7 +701,7 @@
             // TODO: It may make sense to have common error handling here. Two possible mechanisms:
             // 1) performSync return value can signal some useful info.
             // 2) syncResult can contain useful info.
-            LogUtils.d(TAG, "onPerformSync: finished");
+            LogUtils.i(TAG, "onPerformSync: finished %s, %s", acct.toString(), extras.toString());
         }
 
         /**
diff --git a/src/com/android/exchange/service/PingTask.java b/src/com/android/exchange/service/PingTask.java
index 87a7b8e..b1cba07 100644
--- a/src/com/android/exchange/service/PingTask.java
+++ b/src/com/android/exchange/service/PingTask.java
@@ -58,7 +58,6 @@
 
     @Override
     protected Void doInBackground(Void... params) {
-        Log.i(TAG, "Ping task starting");
         int pingStatus;
         do {
             pingStatus = mOperation.doPing();
