diff --git a/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/CodeOwnerConfigOperationsImpl.java b/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/CodeOwnerConfigOperationsImpl.java
index cd91dda..fba2512 100644
--- a/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/CodeOwnerConfigOperationsImpl.java
+++ b/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/CodeOwnerConfigOperationsImpl.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkState;
 
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfig;
+import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigImportModification;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigUpdate;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerSetModification;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwners;
@@ -74,6 +75,8 @@
                 .setIgnoreParentCodeOwners(codeOwnerConfigCreation.ignoreParentCodeOwners())
                 .setCodeOwnerSetsModification(
                     CodeOwnerSetModification.set(codeOwnerConfigCreation.computeCodeOwnerSets()))
+                .setImportsModification(
+                    CodeOwnerConfigImportModification.set(codeOwnerConfigCreation.imports()))
                 .build())
         .orElseThrow(
             () ->
@@ -129,6 +132,7 @@
                   .setIgnoreParentCodeOwners(codeOwnerConfigUpdate.ignoreParentCodeOwners())
                   .setCodeOwnerSetsModification(
                       codeOwnerConfigUpdate.codeOwnerSetsModification()::apply)
+                  .setImportsModification(codeOwnerConfigUpdate.importsModification()::apply)
                   .build());
     }
   }
diff --git a/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/TestCodeOwnerConfigCreation.java b/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/TestCodeOwnerConfigCreation.java
index 557f477..c5ee2cd 100644
--- a/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/TestCodeOwnerConfigCreation.java
+++ b/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/TestCodeOwnerConfigCreation.java
@@ -23,6 +23,7 @@
 import com.google.gerrit.entities.BranchNameKey;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfig;
+import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigReference;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerReference;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerSet;
 import java.nio.file.Path;
@@ -90,6 +91,13 @@
   abstract ImmutableList<CodeOwnerSet> codeOwnerSets();
 
   /**
+   * Gets the imports that have been set for the new code owner config.
+   *
+   * @return the imports that have been set for the new code owner config
+   */
+  abstract ImmutableList<CodeOwnerConfigReference> imports();
+
+  /**
    * Gets the code owner sets that should be set in the newly created code owner config.
    *
    * <p>Includes the global code owners that are defined by {@link #globalCodeOwners()}.
@@ -132,7 +140,7 @@
 
   /** Returns whether the code owner config would be empty. */
   public boolean isEmpty() {
-    return !ignoreParentCodeOwners() && computeCodeOwnerSets().isEmpty();
+    return !ignoreParentCodeOwners() && computeCodeOwnerSets().isEmpty() && imports().isEmpty();
   }
 
   /**
@@ -269,6 +277,24 @@
     }
 
     /**
+     * Gets a builder to add imports.
+     *
+     * @return builder to add imports
+     */
+    abstract ImmutableList.Builder<CodeOwnerConfigReference> importsBuilder();
+
+    /**
+     * Adds an import.
+     *
+     * @param codeOwnerConfigReference reference to the code owner config that should be imported
+     * @return the Builder instance for chaining calls
+     */
+    public Builder addImport(CodeOwnerConfigReference codeOwnerConfigReference) {
+      importsBuilder().add(requireNonNull(codeOwnerConfigReference, "codeOwnerConfigReference"));
+      return this;
+    }
+
+    /**
      * Sets the function that creates the code owner config.
      *
      * @param codeOwnerConfigCreator the function that creates the code owner config
diff --git a/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/TestCodeOwnerConfigUpdate.java b/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/TestCodeOwnerConfigUpdate.java
index be15ea9..49e0004 100644
--- a/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/TestCodeOwnerConfigUpdate.java
+++ b/java/com/google/gerrit/plugins/codeowners/acceptance/testsuite/TestCodeOwnerConfigUpdate.java
@@ -17,6 +17,8 @@
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.acceptance.testsuite.ThrowingConsumer;
+import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigImportModification;
+import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigReference;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerSet;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerSetModification;
 import java.util.Optional;
@@ -47,6 +49,16 @@
   public abstract CodeOwnerSetModification codeOwnerSetsModification();
 
   /**
+   * Defines how the imports of the code owner config should be modified. By default (that is if
+   * nothing is specified), the imports remain unchanged.
+   *
+   * @return a function that modifies the imports of the code owner config, the input to the
+   *     function are the current imports of the code owner config, the output of the function are
+   *     the desired imports
+   */
+  public abstract CodeOwnerConfigImportModification importsModification();
+
+  /**
    * Gets the function that updates the code owner config.
    *
    * @return the function that updates the code owner config
@@ -63,7 +75,8 @@
       ThrowingConsumer<TestCodeOwnerConfigUpdate> codeOwnerConfigUpdater) {
     return new AutoValue_TestCodeOwnerConfigUpdate.Builder()
         .codeOwnerConfigUpdater(codeOwnerConfigUpdater)
-        .codeOwnerSetsModification(CodeOwnerSetModification.keep());
+        .codeOwnerSetsModification(CodeOwnerSetModification.keep())
+        .importsModification(CodeOwnerConfigImportModification.keep());
   }
 
   /** Builder for a {@link TestCodeOwnerConfigUpdate}. */
@@ -115,6 +128,48 @@
     }
 
     /**
+     * Adds an import.
+     *
+     * @param codeOwnerConfigReference reference to the code owner config that should be imported
+     * @return the Builder instance for chaining calls
+     */
+    public Builder addImport(CodeOwnerConfigReference codeOwnerConfigReference) {
+      CodeOwnerConfigImportModification previousModification = importsModification();
+      importsModification(
+          originalImports ->
+              new ImmutableList.Builder<CodeOwnerConfigReference>()
+                  .addAll(previousModification.apply(originalImports))
+                  .add(codeOwnerConfigReference)
+                  .build());
+      return this;
+    }
+
+    /**
+     * Sets the import modification.
+     *
+     * @return the Builder instance for chaining calls
+     * @see TestCodeOwnerConfigUpdate#importsModification()
+     */
+    public abstract Builder importsModification(
+        CodeOwnerConfigImportModification importsModification);
+
+    /**
+     * Gets the import modification.
+     *
+     * @see TestCodeOwnerConfigUpdate#importsModification()
+     */
+    abstract CodeOwnerConfigImportModification importsModification();
+
+    /**
+     * Removes all imports.
+     *
+     * @return the Builder instance for chaining calls
+     */
+    public Builder clearImports() {
+      return importsModification(CodeOwnerConfigImportModification.clear());
+    }
+
+    /**
      * Adds a code owner set.
      *
      * @param codeOwnerSet code owner set that should be added
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfig.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfig.java
index 57fcb6b..647f1e0 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfig.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfig.java
@@ -81,6 +81,23 @@
   }
 
   /**
+   * Gets the imports of this code owner config as list.
+   *
+   * <p>For some callers it's better to retrieve the imports as list since lists have a defined
+   * order, e.g. for:
+   *
+   * <ul>
+   *   <li>updating imports where the updater must be aware that the order matters
+   *   <li>doing test assertions where the order should be verified
+   * </ul>
+   *
+   * @return the imports of this code owner config as list
+   */
+  public ImmutableList<CodeOwnerConfigReference> importsAsList() {
+    return imports().asList();
+  }
+
+  /**
    * Relativizes the given path in relation to the folder path of this code owner config.
    *
    * @param path the path that should be relativized
@@ -140,6 +157,24 @@
      */
     public abstract Builder setIgnoreParentCodeOwners(boolean ignoreParentCodeOwners);
 
+    /**
+     * Sets the imports of this code owner config.
+     *
+     * @param imports the imports of this code owner config
+     * @return the Builder instance for chaining calls
+     */
+    public Builder setImports(ImmutableList<CodeOwnerConfigReference> imports) {
+      return setImports(ImmutableSet.copyOf(imports));
+    }
+
+    /**
+     * Sets the imports of this code owner config.
+     *
+     * @param imports the imports of this code owner config
+     * @return the Builder instance for chaining calls
+     */
+    abstract Builder setImports(ImmutableSet<CodeOwnerConfigReference> imports);
+
     /** Gets a builder to add references to code owner configs that should be imported. */
     abstract ImmutableSet.Builder<CodeOwnerConfigReference> importsBuilder();
 
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigFile.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigFile.java
index 9d9ca55..79a4b68 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigFile.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigFile.java
@@ -249,6 +249,8 @@
         codeOwnerConfigUpdate
             .codeOwnerSetsModification()
             .apply(codeOwnerConfig.codeOwnerSetsAsList()));
+    codeOwnerConfigBuilder.setImports(
+        codeOwnerConfigUpdate.importsModification().apply(codeOwnerConfig.importsAsList()));
     return codeOwnerConfigBuilder.build();
   }
 
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImportModification.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImportModification.java
new file mode 100644
index 0000000..08693ec
--- /dev/null
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImportModification.java
@@ -0,0 +1,102 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.plugins.codeowners.backend;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Representation of a code owner import modification as defined by {@link #apply(ImmutableList)}.
+ *
+ * <p>Used by {@link CodeOwnerConfigUpdate} to describe how the imports (aka {@link
+ * CodeOwnerConfigReference}s) in a {@link CodeOwnerConfig} should be changed on updated or be
+ * populated on creation.
+ *
+ * <p>This class provides a couple of static helper methods to modify imports that make changes to
+ * imports easier for callers.
+ */
+@FunctionalInterface
+public interface CodeOwnerConfigImportModification {
+  /**
+   * Create a {@link CodeOwnerConfigImportModification} instance that keeps the imports as they are.
+   *
+   * @return the created {@link CodeOwnerConfigImportModification} instance
+   */
+  public static CodeOwnerConfigImportModification keep() {
+    return originalImports -> originalImports;
+  }
+
+  /**
+   * Create a {@link CodeOwnerConfigImportModification} instance that clears the imports.
+   *
+   * <p>All imports are removed.
+   *
+   * @return the created {@link CodeOwnerConfigImportModification} instance
+   */
+  public static CodeOwnerConfigImportModification clear() {
+    return originalImports -> ImmutableList.of();
+  }
+
+  /**
+   * Create a {@link CodeOwnerConfigImportModification} instance that sets the given import.
+   *
+   * <p>This overrides all imports which have been set before.
+   *
+   * @param newImport the import that should be set
+   * @return the created {@link CodeOwnerConfigImportModification} instance
+   */
+  public static CodeOwnerConfigImportModification set(CodeOwnerConfigReference newImport) {
+    return set(ImmutableList.of(newImport));
+  }
+
+  /**
+   * Create a {@link CodeOwnerConfigImportModification} instance that sets the given imports.
+   *
+   * <p>This overrides imports which have been set before.
+   *
+   * @param newImports the imports that should be set
+   * @return the created {@link CodeOwnerConfigImportModification} instance
+   */
+  public static CodeOwnerConfigImportModification set(
+      ImmutableList<CodeOwnerConfigReference> newImports) {
+    return originalImports -> newImports;
+  }
+
+  /**
+   * Create a {@link CodeOwnerConfigImportModification} instance that removes the given import.
+   *
+   * <p>No-op if the given import doesn't exist.
+   *
+   * @param importToRemove the import that should be removed
+   * @return the created {@link CodeOwnerConfigImportModification} instance
+   */
+  public static CodeOwnerConfigImportModification remove(CodeOwnerConfigReference importToRemove) {
+    return originalImports ->
+        originalImports.stream()
+            .filter(codeOwnerConfigReference -> !codeOwnerConfigReference.equals(importToRemove))
+            .collect(toImmutableList());
+  }
+
+  /**
+   * Applies the modification to the given imports.
+   *
+   * @param originalImports the current imports of the code owner config that is being updated. If
+   *     used for a code owner config creation, this set is empty.
+   * @return the desired resulting imports (not the diff of the imports!)
+   */
+  ImmutableList<CodeOwnerConfigReference> apply(
+      ImmutableList<CodeOwnerConfigReference> originalImports);
+}
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
index d2b966c..5adc53b 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
@@ -66,6 +66,19 @@
   }
 
   /**
+   * Creates a code owner config reference.
+   *
+   * @param importMode the import mode
+   * @param filePath the path of the code owner config, may be absolute or relative to the path of
+   *     the importing code owner config
+   * @return the created code owner reference
+   */
+  public static CodeOwnerConfigReference create(
+      CodeOwnerConfigImportMode importMode, String filePath) {
+    return builder(importMode, filePath).build();
+  }
+
+  /**
    * Creates a builder for a code owner config reference.
    *
    * @param importMode the import mode
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigUpdate.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigUpdate.java
index 4ea94b7..48078b3 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigUpdate.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigUpdate.java
@@ -42,13 +42,23 @@
   public abstract CodeOwnerSetModification codeOwnerSetsModification();
 
   /**
+   * Defines how the imports of the code owner config should be modified. By default (that is if
+   * nothing is specified), the imports remain unchanged.
+   *
+   * @return a {@link CodeOwnerConfigImportModification} which gets the current imports of the code
+   *     owner config as input and outputs the desired resulting imports
+   */
+  public abstract CodeOwnerConfigImportModification importsModification();
+
+  /**
    * Creates a builder for a {@link CodeOwnerConfigUpdate}.
    *
    * @return builder for a {@link CodeOwnerConfigUpdate}
    */
   public static Builder builder() {
     return new AutoValue_CodeOwnerConfigUpdate.Builder()
-        .setCodeOwnerSetsModification(CodeOwnerSetModification.keep());
+        .setCodeOwnerSetsModification(CodeOwnerSetModification.keep())
+        .setImportsModification(CodeOwnerConfigImportModification.keep());
   }
 
   @AutoValue.Builder
@@ -82,6 +92,14 @@
         CodeOwnerSetModification codeOwnerSetsModification);
 
     /**
+     * Sets the imports modification.
+     *
+     * @see #importsModification()
+     */
+    public abstract Builder setImportsModification(
+        CodeOwnerConfigImportModification codeOwnerImportModification);
+
+    /**
      * Builds the {@link CodeOwnerConfigUpdate} instance.
      *
      * @return the {@link CodeOwnerConfigUpdate} instance
diff --git a/javatests/com/google/gerrit/plugins/codeowners/acceptance/testsuite/CodeOwnerConfigOperationsImplTest.java b/javatests/com/google/gerrit/plugins/codeowners/acceptance/testsuite/CodeOwnerConfigOperationsImplTest.java
index 7546bc0..bc4d247 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/acceptance/testsuite/CodeOwnerConfigOperationsImplTest.java
+++ b/javatests/com/google/gerrit/plugins/codeowners/acceptance/testsuite/CodeOwnerConfigOperationsImplTest.java
@@ -26,6 +26,9 @@
 import com.google.gerrit.plugins.codeowners.acceptance.AbstractCodeOwnersTest;
 import com.google.gerrit.plugins.codeowners.acceptance.testsuite.CodeOwnerConfigOperations.PerCodeOwnerConfigOperations;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfig;
+import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigImportMode;
+import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigImportModification;
+import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigReference;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigUpdate;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerSet;
 import com.google.gerrit.plugins.codeowners.backend.CodeOwnerSetModification;
@@ -252,6 +255,30 @@
   }
 
   @Test
+  public void specifiedImportsAreRespectedForCodeOwnerConfigCreation() throws Exception {
+    CodeOwnerConfigReference import1 =
+        CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/foo/OWNERS");
+    CodeOwnerConfigReference import2 =
+        CodeOwnerConfigReference.builder(
+                CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, "/bar/OWNERS")
+            .setProject(allProjects)
+            .build();
+
+    CodeOwnerConfig.Key codeOwnerConfigKey =
+        codeOwnerConfigOperations
+            .newCodeOwnerConfig()
+            .project(project)
+            .addImport(import1)
+            .addImport(import2)
+            .create();
+
+    assertThat(getCodeOwnerConfigFromServer(codeOwnerConfigKey))
+        .hasImportsThat()
+        .containsExactly(import1, import2)
+        .inOrder();
+  }
+
+  @Test
   public void cannotCreateEmptyCodeOwnerConfig() throws Exception {
     IllegalStateException exception =
         assertThrows(
@@ -459,6 +486,69 @@
   }
 
   @Test
+  public void addImport() throws Exception {
+    CodeOwnerConfigReference oldImport =
+        CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/foo/OWNERS");
+    CodeOwnerConfig codeOwnerConfig =
+        createCodeOwnerConfig(
+            false,
+            CodeOwnerSetModification.keep(),
+            CodeOwnerConfigImportModification.set(ImmutableList.of(oldImport)));
+    CodeOwnerConfigReference newImport =
+        CodeOwnerConfigReference.create(
+            CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, "/bar/OWNERS");
+    codeOwnerConfigOperations
+        .codeOwnerConfig(codeOwnerConfig.key())
+        .forUpdate()
+        .addImport(newImport)
+        .update();
+    assertThat(getCodeOwnerConfigFromServer(codeOwnerConfig.key()))
+        .hasImportsThat()
+        .containsExactly(oldImport, newImport)
+        .inOrder();
+  }
+
+  @Test
+  public void removeImport() throws Exception {
+    CodeOwnerConfigReference import1 =
+        CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/foo/OWNERS");
+    CodeOwnerConfigReference import2 =
+        CodeOwnerConfigReference.create(
+            CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, "/bar/OWNERS");
+    CodeOwnerConfig codeOwnerConfig =
+        createCodeOwnerConfig(
+            false,
+            CodeOwnerSetModification.keep(),
+            CodeOwnerConfigImportModification.set(ImmutableList.of(import1, import2)));
+    codeOwnerConfigOperations
+        .codeOwnerConfig(codeOwnerConfig.key())
+        .forUpdate()
+        .importsModification(CodeOwnerConfigImportModification.remove(import1))
+        .update();
+    assertThat(getCodeOwnerConfigFromServer(codeOwnerConfig.key()))
+        .hasImportsThat()
+        .containsExactly(import2);
+  }
+
+  @Test
+  public void clearImports() throws Exception {
+    CodeOwnerConfig codeOwnerConfig =
+        createCodeOwnerConfig(
+            false,
+            CodeOwnerSetModification.keep(),
+            CodeOwnerConfigImportModification.set(
+                CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/foo/OWNERS")));
+    codeOwnerConfigOperations
+        .codeOwnerConfig(codeOwnerConfig.key())
+        .forUpdate()
+        .clearImports()
+        .update();
+
+    // Removing all code owner sets leads to a deletion of the code owner config file.
+    assertThat(codeOwners.getFromCurrentRevision(codeOwnerConfig.key())).isEmpty();
+  }
+
+  @Test
   public void cannotUpdateNonExistingCodeOwnerConfig() throws Exception {
     CodeOwnerConfig.Key codeOwnerConfigKey = CodeOwnerConfig.Key.create(project, "master", "/");
     IllegalStateException exception =
@@ -495,11 +585,22 @@
 
   private CodeOwnerConfig createCodeOwnerConfig(
       boolean ignoreParentCodeOwners, CodeOwnerSetModification codeOwnerSetsModification) {
+    return createCodeOwnerConfig(
+        ignoreParentCodeOwners,
+        codeOwnerSetsModification,
+        CodeOwnerConfigImportModification.keep());
+  }
+
+  private CodeOwnerConfig createCodeOwnerConfig(
+      boolean ignoreParentCodeOwners,
+      CodeOwnerSetModification codeOwnerSetsModification,
+      CodeOwnerConfigImportModification codeOwnerImportModification) {
     CodeOwnerConfig.Key codeOwnerConfigKey = CodeOwnerConfig.Key.create(project, "master", "/");
     CodeOwnerConfigUpdate codeOwnerConfigUpdate =
         CodeOwnerConfigUpdate.builder()
             .setIgnoreParentCodeOwners(ignoreParentCodeOwners)
             .setCodeOwnerSetsModification(codeOwnerSetsModification)
+            .setImportsModification(codeOwnerImportModification)
             .build();
     return codeOwnersUpdate
         .get()
