merge in oc-release history after reset to master
diff --git a/src/java/com/android/internal/telephony/MccTable.java b/src/java/com/android/internal/telephony/MccTable.java
index 23c0c52..f18f6d5 100644
--- a/src/java/com/android/internal/telephony/MccTable.java
+++ b/src/java/com/android/internal/telephony/MccTable.java
@@ -423,7 +423,7 @@
 		sTable.add(new MccEntry(225,"va",2));	//Vatican City State
 		sTable.add(new MccEntry(226,"ro",2));	//Romania
 		sTable.add(new MccEntry(228,"ch",2));	//Switzerland (Confederation of)
-		sTable.add(new MccEntry(230,"cz",2));	//Czech Republic
+		sTable.add(new MccEntry(230,"cz",2));	//Czechia
 		sTable.add(new MccEntry(231,"sk",2));	//Slovak Republic
 		sTable.add(new MccEntry(232,"at",2));	//Austria
 		sTable.add(new MccEntry(234,"gb",2));	//United Kingdom of Great Britain and Northern Ireland
diff --git a/src/java/com/android/internal/telephony/ims/ImsServiceController.java b/src/java/com/android/internal/telephony/ims/ImsServiceController.java
index bce8c70..2df52c7 100644
--- a/src/java/com/android/internal/telephony/ims/ImsServiceController.java
+++ b/src/java/com/android/internal/telephony/ims/ImsServiceController.java
@@ -65,10 +65,10 @@
 
         @Override
         public void binderDied() {
-            Log.e(LOG_TAG, "ImsService(" + mComponentName + ") died. Cleaning up.");
+            Log.e(LOG_TAG, "ImsService(" + mComponentName + ") died. Restarting...");
             notifyAllFeaturesRemoved();
             cleanUpService();
-            mHandler.postDelayed(mRestartImsServiceRunnable, mRebindRetry.getRetryTimeout());
+            startDelayedRebindToService();
         }
     }
 
@@ -76,16 +76,18 @@
 
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
-            if (service != null) {
-                synchronized (mLock) {
+            synchronized (mLock) {
+                mIsBound = true;
+                mIsBinding = false;
+                grantPermissionsToService();
+                Log.d(LOG_TAG, "ImsService(" + name + "): onServiceConnected with binder: "
+                        + service);
+                if (service != null) {
                     mImsDeathRecipient = new ImsDeathRecipient(name);
                     try {
                         service.linkToDeath(mImsDeathRecipient, 0);
                         mImsServiceControllerBinder = service;
                         mIImsServiceController = IImsServiceController.Stub.asInterface(service);
-                        mIsBound = true;
-                        mIsBinding = false;
-                        grantPermissionsToService();
                         // create all associated features in the ImsService
                         for (Pair<Integer, Integer> i : mImsFeatures) {
                             addImsServiceFeature(i);
@@ -114,7 +116,8 @@
             }
             notifyAllFeaturesRemoved();
             cleanUpService();
-            mHandler.postDelayed(mRestartImsServiceRunnable, mRebindRetry.getRetryTimeout());
+            Log.w(LOG_TAG, "ImsService(" + name + "): onServiceDisconnected. Rebinding...");
+            startDelayedRebindToService();
         }
     }
 
@@ -358,6 +361,13 @@
         }
     }
 
+    // Only add a new rebind if there are no pending rebinds waiting.
+    private void startDelayedRebindToService() {
+        if (!mHandler.hasCallbacks(mRestartImsServiceRunnable)) {
+            mHandler.postDelayed(mRestartImsServiceRunnable, mRebindRetry.getRetryTimeout());
+        }
+    }
+
     // Grant runtime permissions to ImsService. PackageManager ensures that the ImsService is
     // system/signed before granting permissions.
     private void grantPermissionsToService() {