diff --git a/gradle.properties b/gradle.properties
index bc1f8a0e2edb13853946e2aa5850530248f86af8..b71523789e4ad77920474381301812fe0680c398 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -10,7 +10,7 @@ micronautRxVersion = 2.1.1
 micronautPluginVersion = 3.1.1
 nodePluginVersion = 3.0.1
 nodeVersion = 16.3.0
-nshmpLibVersion = 0.9.10
+nshmpLibVersion = 0.9.11
 nshmpWsUtilsVersion = 0.1.7
 shadowVersion = 7.1.2
 spotbugsVersion = 4.7.0
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java b/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java
index b54668199f1745ef42b6b2ac17a116fb8efb7ec7..9d9087042cfb6043df301e903a6f9dd2a9f4f6b8 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java
@@ -52,6 +52,7 @@ import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.internal.Logging;
 import gov.usgs.earthquake.nshmp.model.HazardModel;
+import gov.usgs.earthquake.nshmp.model.SiteData;
 
 /**
  * Disaggregate probabilistic seismic hazard at a return period of interest or
@@ -165,7 +166,10 @@ public class DisaggCalc {
           : OptionalDouble.empty();
 
       /* Sites */
-      List<Site> sites = Sites.fromCsv(siteFile, model.siteData(), vs30);
+      SiteData siteData = config.hazard.useSiteData
+          ? model.siteData()
+          : SiteData.EMPTY;
+      List<Site> sites = Sites.fromCsv(siteFile, siteData, vs30);
       log.info("Sites: " + sites.size());
 
       Set<Imt> modelImts = model.config().hazard.imts;
@@ -288,7 +292,8 @@ public class DisaggCalc {
 
     log.info(PROGRAM + " (return period): calculating ...");
 
-    HazardExport handler = HazardExport.create(model, config, sites, out);
+    boolean namedSites = sites.get(0).name() != Site.NO_NAME;
+    HazardExport handler = HazardExport.create(model, config, namedSites, out);
     Path disaggDir = out.resolve("disagg");
     Files.createDirectory(disaggDir);
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/HazardCalc.java b/src/main/java/gov/usgs/earthquake/nshmp/HazardCalc.java
index f9fc796fbefee6dd8db5e1158aa7af9a481219e7..6b26713efa45c0f9ef41397843d231e1237b7396 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/HazardCalc.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/HazardCalc.java
@@ -12,7 +12,6 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 import java.util.OptionalDouble;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -111,10 +110,13 @@ public class HazardCalc {
       log.info("");
 
       Path out = createOutputDir(config.output.directory);
+      SiteData siteData = config.hazard.useSiteData
+          ? model.siteData()
+          : SiteData.EMPTY;
 
       if (config.hazard.vs30s.isEmpty()) {
 
-        List<Site> sites = readSites(args[1], model.siteData(), OptionalDouble.empty(), log);
+        List<Site> sites = readSites(args[1], siteData, OptionalDouble.empty(), log);
         log.info("Sites: " + Sites.toString(sites));
         calc(model, config, sites, out, log);
 
@@ -122,7 +124,7 @@ public class HazardCalc {
 
         for (double vs30 : config.hazard.vs30s) {
           log.info("Vs30 batch: " + vs30);
-          List<Site> sites = readSites(args[1], model.siteData(), OptionalDouble.of(vs30), log);
+          List<Site> sites = readSites(args[1], siteData, OptionalDouble.of(vs30), log);
           log.info("Sites: " + Sites.toString(sites));
           Path vs30dir = out.resolve("vs30-" + ((int) vs30));
           Files.createDirectory(vs30dir);
@@ -177,14 +179,15 @@ public class HazardCalc {
       CalcConfig config,
       List<Site> sites,
       Path out,
-      Logger log) throws IOException, InterruptedException, ExecutionException {
+      Logger log) throws IOException {
 
     int threadCount = config.performance.threadCount.value();
     final ExecutorService exec = initExecutor(threadCount);
     log.info("Threads: " + ((ThreadPoolExecutor) exec).getCorePoolSize());
     log.info(PROGRAM + ": calculating ...");
 
-    HazardExport handler = HazardExport.create(model, config, sites, out);
+    boolean namedSites = sites.get(0).name() != Site.NO_NAME;
+    HazardExport handler = HazardExport.create(model, config, namedSites, out);
     Stopwatch stopwatch = Stopwatch.createStarted();
     int logInterval = sites.size() < 100 ? 1 : sites.size() < 1000 ? 10 : 100;