diff --git a/acquia_search/acquia_search.module b/acquia_search/acquia_search.module
index 238f9a9..6ad0a61 100644
--- a/acquia_search/acquia_search.module
+++ b/acquia_search/acquia_search.module
@@ -256,6 +256,9 @@ function acquia_search_search_api_index_load($entities) {
       continue;
     }
 
+    // We will need this flag later to remove read-only flag.
+    $overridden_from_code = \Drupal::state()->get('acquia_search_index_overridden_' . $index->id());
+
     // Reset the overridden_by_acquia_search option.
     $options = $index->getOptions();
     if (!empty($options['overridden_by_acquia_search'])) {
@@ -264,10 +267,29 @@ function acquia_search_search_api_index_load($entities) {
     }
 
     if (acquia_search_should_set_read_only_mode()) {
-      // Set this index to read-only mode.
-      $index->set('read_only', TRUE);
-      // Flag this index as having been altered by this module.
-      $index->setOption('overridden_by_acquia_search', ACQUIA_SEARCH_AUTO_OVERRIDE_READ_ONLY);
+      // Check if index is already set to read only.
+      if (!$index->get('read_only')) {
+        // Set this index to read-only mode.
+        $index->set('read_only', TRUE);
+
+        // Flag this index as having been altered by this module.
+        $index->setOption('overridden_by_acquia_search', ACQUIA_SEARCH_AUTO_OVERRIDE_READ_ONLY);
+
+        \Drupal::state()->set('acquia_search_index_overridden_' . $index->id(), 1);
+      }
+    }
+    // If it was overridden by code and still read only, make it writable.
+    elseif ($overridden_from_code && $index->get('read_only')) {
+      $index->set('read_only', FALSE);
+
+      // Save the updated index.
+      $index->save();
+
+      // Update value in state variable.
+      \Drupal::state()->set('acquia_search_index_overridden_' . $index->id(), 0);
+
+      // Re-load the index.
+      $index = Index::load($index->id());
     }
   }
 }
