diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java
index 5f1d223fe315bc4409eda8e7b029f29d4d8b74cc..a0bdb002b8be81bd0a4f31bf275aea0b632de2a5 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java
@@ -8,6 +8,7 @@ import static java.util.stream.Collectors.toList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.OptionalDouble;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.CompletableFuture;
@@ -27,6 +28,7 @@ import gov.usgs.earthquake.nshmp.calc.Disaggregation;
 import gov.usgs.earthquake.nshmp.calc.Hazard;
 import gov.usgs.earthquake.nshmp.calc.HazardCalcs;
 import gov.usgs.earthquake.nshmp.calc.Site;
+import gov.usgs.earthquake.nshmp.calc.Sites;
 import gov.usgs.earthquake.nshmp.geo.Location;
 import gov.usgs.earthquake.nshmp.gmm.Gmm;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
@@ -147,7 +149,7 @@ public final class DisaggService {
         .build();
 
     Location loc = Location.create(request.longitude, request.latitude);
-    Site site = ServletUtil.createSite(loc, request.vs30, model.siteData());
+    Site site = Sites.locationToSite(loc, model.siteData(), OptionalDouble.of(request.vs30));
 
     // use HazardService.calcHazard() instead?
     CompletableFuture<Hazard> hazFuture = CompletableFuture.supplyAsync(
@@ -180,7 +182,7 @@ public final class DisaggService {
         .build();
 
     Location loc = Location.create(request.longitude, request.latitude);
-    Site site = ServletUtil.createSite(loc, request.vs30, model.siteData());
+    Site site = Sites.locationToSite(loc, model.siteData(), OptionalDouble.of(request.vs30));
 
     // could just get from HazardService
     CompletableFuture<Hazard> hazFuture = CompletableFuture.supplyAsync(
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java
index c6ba8adfb7472e9158da9734500444916b8a87ba..42830d66d40218da8e34f8686dbcc699787f5754 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java
@@ -12,6 +12,7 @@ import java.util.EnumMap;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
+import java.util.OptionalDouble;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -26,6 +27,7 @@ import gov.usgs.earthquake.nshmp.calc.DataType;
 import gov.usgs.earthquake.nshmp.calc.Hazard;
 import gov.usgs.earthquake.nshmp.calc.HazardCalcs;
 import gov.usgs.earthquake.nshmp.calc.Site;
+import gov.usgs.earthquake.nshmp.calc.Sites;
 import gov.usgs.earthquake.nshmp.data.MutableXySequence;
 import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.geo.Location;
@@ -114,7 +116,7 @@ public final class HazardService {
         .build();
 
     Location loc = Location.create(request.longitude, request.latitude);
-    Site site = ServletUtil.createSite(loc, request.vs30, model.siteData());
+    Site site = Sites.locationToSite(loc, model.siteData(), OptionalDouble.of(request.vs30));
 
     CompletableFuture<Hazard> future = CompletableFuture.supplyAsync(
         () -> HazardCalcs.hazard(