diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazards.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazards.java
index 447eb749f47ca612e18205572bd479d1d3e29689..76a772327e2ea05b6c4a93c6b8b1f10d4e05adba 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazards.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazards.java
@@ -1,52 +1,20 @@
 package gov.usgs.earthquake.nshmp.netcdf.reader;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 
 import java.util.HashMap;
-import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
 import gov.usgs.earthquake.nshmp.geo.Location;
 
-public class BoundingHazards implements Iterable<Entry<Location, StaticHazards>> {
+@SuppressWarnings("serial")
+public class BoundingHazards extends LinkedHashMap<Location, StaticHazards> {
 
-  private final Map<Location, StaticHazards> boundingHazards;
+  public BoundingHazards() {}
 
-  BoundingHazards(Map<Location, StaticHazards> boundingHazards) {
-    this.boundingHazards = boundingHazards;
-  }
-
-  public Map<Location, StaticHazards> boundingHazards() {
-    return Map.copyOf(boundingHazards);
-  }
-
-  public boolean containsKey(Location location) {
-    return boundingHazards.containsKey(location);
-  }
-
-  public Set<Entry<Location, StaticHazards>> entrySet() {
-    return boundingHazards.entrySet();
-  }
-
-  public StaticHazards get(Location location) {
-    checkArgument(boundingHazards.containsKey(location), "Location [" + location + "] not found");
-    return boundingHazards.get(location);
-  }
-
-  public Set<Location> keySet() {
-    return boundingHazards.keySet();
-  }
-
-  public int size() {
-    return boundingHazards.size();
-  }
-
-  @Override
-  public Iterator<Entry<Location, StaticHazards>> iterator() {
-    return entrySet().iterator();
+  private BoundingHazards(Map<Location, StaticHazards> boundingHazards) {
+    putAll(boundingHazards);
   }
 
   public static Builder builder() {
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazardsReader.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazardsReader.java
index c55e2547b4590ce84d4d62739cfddfb79182ef0b..338f0664003be437eeac47f3a64062bd9e95bd8d 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazardsReader.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazardsReader.java
@@ -93,7 +93,7 @@ public class BoundingHazardsReader {
     var fracLat = NetcdfUtils.calcGridFrac(latitudes, idxLatLL, site.latitude);
 
     var builder = BoundingHazards.builder();
-    hazards.forEach(entry -> builder.put(entry.getKey(), entry.getValue()));
+    hazards.forEach((key, value) -> builder.put(key, value));
     builder.put(
         site,
         calcTargetHazards(hazards, fracLon, fracLat))
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/StaticHazard.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/StaticHazard.java
index a52652fdf382155fa31df1c9c4129a3c93e2d8dc..28dc0f0262274f1232ae9c8205ed8a54feac219f 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/StaticHazard.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/StaticHazard.java
@@ -1,53 +1,24 @@
 package gov.usgs.earthquake.nshmp.netcdf.reader;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
 import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
 
-public class StaticHazard implements Iterable<Entry<Imt, XySequence>> {
+@SuppressWarnings("serial")
+public class StaticHazard extends HashMap<Imt, XySequence> {
 
-  private final Map<Imt, XySequence> staticHazard;
+  public StaticHazard() {}
 
-  StaticHazard(Map<Imt, XySequence> staticHazard) {
-    this.staticHazard = staticHazard;
-  }
-
-  public Set<Entry<Imt, XySequence>> entrySet() {
-    return staticHazard.entrySet();
-  }
-
-  public boolean containsKey(Imt imt) {
-    return staticHazard.containsKey(imt);
-  }
-
-  public XySequence get(Imt imt) {
-    checkArgument(staticHazard.containsKey(imt), "Imt [" + imt + "] not found");
-    return staticHazard.get(imt);
-  }
-
-  public Set<Imt> keySet() {
-    return staticHazard.keySet();
-  }
-
-  public int size() {
-    return staticHazard.size();
+  private StaticHazard(Map<Imt, XySequence> staticHazard) {
+    putAll(staticHazard);
   }
 
   public Map<Imt, XySequence> staticHazard() {
-    return Map.copyOf(staticHazard);
-  }
-
-  @Override
-  public Iterator<Entry<Imt, XySequence>> iterator() {
-    return entrySet().iterator();
+    return Map.copyOf(this);
   }
 
   public static Builder builder() {
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/StaticHazards.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/StaticHazards.java
index f95cdbfdb568308b60b2cd39045476d0e7ae60f9..0bba7f00946e615ea23549487d967e946d8c886a 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/StaticHazards.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/StaticHazards.java
@@ -1,52 +1,19 @@
 package gov.usgs.earthquake.nshmp.netcdf.reader;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
 import gov.usgs.earthquake.nshmp.netcdf.SiteClass;
 
-public class StaticHazards implements Iterable<Entry<SiteClass, StaticHazard>> {
+@SuppressWarnings("serial")
+public class StaticHazards extends HashMap<SiteClass, StaticHazard> {
 
-  private final Map<SiteClass, StaticHazard> staticHazards;
+  public StaticHazards() {}
 
-  StaticHazards(Map<SiteClass, StaticHazard> staticHazards) {
-    this.staticHazards = staticHazards;
-  }
-
-  public boolean containsKey(SiteClass siteClass) {
-    return staticHazards.containsKey(siteClass);
-  }
-
-  public Set<Entry<SiteClass, StaticHazard>> entrySet() {
-    return staticHazards.entrySet();
-  }
-
-  public StaticHazard get(SiteClass siteClass) {
-    checkArgument(staticHazards.containsKey(siteClass), "Site class [" + siteClass + "] not found");
-    return staticHazards.get(siteClass);
-  }
-
-  public Set<SiteClass> keySet() {
-    return staticHazards.keySet();
-  }
-
-  public int size() {
-    return staticHazards.size();
-  }
-
-  public Map<SiteClass, StaticHazard> staticHazards() {
-    return Map.copyOf(staticHazards);
-  }
-
-  @Override
-  public Iterator<Entry<SiteClass, StaticHazard>> iterator() {
-    return entrySet().iterator();
+  private StaticHazards(Map<SiteClass, StaticHazard> staticHazards) {
+    this.putAll(staticHazards);
   }
 
   public static Builder builder() {
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfUtilsTests.java b/src/test/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfUtilsTests.java
index 00f90792ef6b978b0290105d701675a805022459..0f7357d6bb1f9391bcff56c17d1705ffd9d66fab 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfUtilsTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfUtilsTests.java
@@ -87,19 +87,19 @@ class NetcdfUtilsTests {
 
     // Add extra site class
     var mapDiffScSizeBuilder = StaticHazards.builder();
-    mapHaz0.forEach(entry -> mapDiffScSizeBuilder.put(entry.getKey(), entry.getValue()));
+    mapHaz0.forEach((key, value) -> mapDiffScSizeBuilder.put(key, value));
     mapDiffScSizeBuilder.put(SiteClass.A, mapHaz0.get(siteClasses.get(0)));
     mapDiffScSize = mapDiffScSizeBuilder.build();
 
     // Add extra IMT
     var mapDiffImtSizeBuilder = StaticHazards.builder();
-    mapHaz0.forEach(entry -> {
+    mapHaz0.forEach((siteClass, staticHazard) -> {
       var builder = StaticHazard.builder();
-      entry.getValue().forEach(imtEntry -> {
-        builder.put(imtEntry.getKey(), imtEntry.getValue());
+      staticHazard.forEach((imt, xy) -> {
+        builder.put(imt, xy);
       });
       builder.put(Imt.SA10P0, XySequence.create(imlValues, new double[N_IML]));
-      mapDiffImtSizeBuilder.put(entry.getKey(), builder.build());
+      mapDiffImtSizeBuilder.put(siteClass, builder.build());
     });
 
     mapDiffImtSize = mapDiffImtSizeBuilder.build();
@@ -151,11 +151,11 @@ class NetcdfUtilsTests {
     var actual = NetcdfUtils.linearInterpolate(mapHaz0, mapHaz1, FRAC);
     assertTrue(mapHazTarget.keySet().containsAll(actual.keySet()));
 
-    mapHazTarget.forEach(entry -> {
-      assertTrue(entry.getValue().keySet().containsAll(actual.get(entry.getKey()).keySet()));
-      entry.getValue().forEach(imtEntry -> {
-        var actualXy = actual.get(entry.getKey()).get(imtEntry.getKey());
-        assertArrayEquals(imtEntry.getValue().xValues().toArray(), actualXy.xValues().toArray(), 0);
+    mapHazTarget.forEach((siteClass, staticHazard) -> {
+      assertTrue(staticHazard.keySet().containsAll(actual.get(siteClass).keySet()));
+      staticHazard.forEach((imt, xy) -> {
+        var actualXy = actual.get(siteClass).get(imt);
+        assertArrayEquals(xy.xValues().toArray(), actualXy.xValues().toArray(), 0);
       });
     });