diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java
index 9d1ca70acdbe619d773a7a9da11172927ac568ea..ecbd29e712c1af6f275ee7238c95140291ca5280 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java
@@ -24,7 +24,6 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableMap;
@@ -341,7 +340,7 @@ public final class CalcConfig {
         if (that.truncationLevel != null) {
           this.truncationLevel = that.truncationLevel;
         }
-        if (that.imts != null) {
+        if (that.imts != null && !that.imts.isEmpty()) {
           this.imts = that.imts;
         }
         if (that.tectonicSettings != null) {
@@ -797,10 +796,7 @@ public final class CalcConfig {
 
     private Output(Builder b) {
       this.directory = b.directory;
-      Set<DataType> dataTypes = EnumSet.copyOf(b.dataTypes);
-      dataTypes.add(DataType.TOTAL);
-      dataTypes.add(DataType.MAP);
-      this.dataTypes = Collections.unmodifiableSet(dataTypes);
+      this.dataTypes = Collections.unmodifiableSet(b.dataTypes);
       this.returnPeriods = List.copyOf(b.returnPeriods);
     }
 
@@ -819,7 +815,7 @@ public final class CalcConfig {
 
       void copy(Output that) {
         this.directory = that.directory;
-        this.dataTypes = EnumSet.copyOf(that.dataTypes);
+        this.dataTypes = that.dataTypes;
         this.returnPeriods = that.returnPeriods;
       }
 
@@ -827,8 +823,8 @@ public final class CalcConfig {
         if (that.directory != null) {
           this.directory = that.directory;
         }
-        if (that.dataTypes != null) {
-          this.dataTypes = EnumSet.copyOf(that.dataTypes);
+        if (that.dataTypes != null && !that.dataTypes.isEmpty()) {
+          this.dataTypes.addAll(that.dataTypes);
         }
         if (that.returnPeriods != null) {
           this.returnPeriods = that.returnPeriods;
@@ -984,7 +980,8 @@ public final class CalcConfig {
 
     /**
      * Extend {@code this} builder to match {@code that} builder. Fields in
-     * {@code that} builder take precedence unless they are not set.
+     * {@code that} builder take precedence unless they are not set. Array based
+     * settings are replaced.
      */
     public Builder extend(Builder that) {
       checkNotNull(that);
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java b/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java
index a8933b7993324ea4ec8144a3dbf2f0b707fde71d..5324603329921e1ae26f07d50756d12631cf0a5b 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java
@@ -63,6 +63,8 @@ class CalcConfigTests {
   static final CalcConfig DEFAULTS;
   static final CalcConfig EXTENDS;
   static final CalcConfig EXTENDS_EMPTY; // same as DEFAULTS
+  // used to test that arrays are both non-null and not empty
+  static final CalcConfig EXTENDS_EMPTY_ARRAYS; // imts, types
 
   static {
     try {
@@ -73,6 +75,9 @@ class CalcConfigTests {
       EXTENDS_EMPTY = CalcConfig.defaults()
           .extend(CalcConfig.from(RESOURCES.resolve("calc-config-extends-empty.json")))
           .build();
+      EXTENDS_EMPTY_ARRAYS = CalcConfig.defaults()
+          .extend(CalcConfig.from(RESOURCES.resolve("calc-config-extends-empty-arrays.json")))
+          .build();
 
     } catch (IOException ioe) {
       throw new RuntimeException();
@@ -278,6 +283,9 @@ class CalcConfigTests {
     assertEquals(ValueFormat.ANNUAL_RATE, def.valueFormat);
     assertEquals(true, def.distanceFilterUpdate);
     assertEquals(true, def.gridFocalMechUpdate);
+
+    def = EXTENDS_EMPTY_ARRAYS.hazard;
+    assertEquals(IMTS, def.imts);
   }
 
   @Test
@@ -379,6 +387,9 @@ class CalcConfigTests {
     assertEquals(Path.of("hazout"), def.directory);
     assertEquals(Set.of(DataType.TOTAL, DataType.MAP), def.dataTypes);
     assertEquals(defaultReturnPeroiods, def.returnPeriods);
+
+    def = EXTENDS_EMPTY_ARRAYS.output;
+    assertEquals(Set.of(DataType.TOTAL, DataType.MAP), def.dataTypes);
   }
 
   @Test
diff --git a/src/test/resources/calc/calc-config-extends-empty-arrays.json b/src/test/resources/calc/calc-config-extends-empty-arrays.json
new file mode 100644
index 0000000000000000000000000000000000000000..1f82401fce1e452dc9f3886ff0867ab7db582171
--- /dev/null
+++ b/src/test/resources/calc/calc-config-extends-empty-arrays.json
@@ -0,0 +1,8 @@
+{
+  "hazard": {
+    "imts": []
+  },
+  "output": {
+  	"dataTypes": []
+  }
+}