diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 315d56e785ecf7207a104bc12e730c9e4c40b4f2..5347ec02ca800a6cdbe6ca424cd5fd93da2b8f70 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -171,6 +171,7 @@ Markdown Lint:
     - .java
   script:
     - ./gradlew markdownlint
+  allow_failure: true
 
 Unit Tests:
   artifacts:
diff --git a/docs/README.md b/docs/README.md
index a25b0ab483f9493a053e3aa252844da660b745c5..8b2bfaf034f9a1c144480f7b7e71414dfc140c29 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -18,8 +18,7 @@ use *nshmp-haz* as well as underlying model implementation details.
   * [Developer Basics](./pages/Developer-Basics.md)
   * [Calculation Configuration](./pages/Calculation-Configuration.md)
   * [Site Specification](./pages/Site-Specification.md)
-  * [Examples](../../etc/examples) (or
-    [on GitLab](https://code.usgs.gov/ghsc/nshmp/nshmp-haz/-/tree/main/etc/examples))
+  * [Examples](../../etc/examples)
 * [Hazard Model](./pages/Hazard-Model.md)
   * [Model Structure](./pages/Model-Structure.md)
   * [Model Files](./pages/Model-Files.md)
diff --git a/docs/pages/Building-&-Running.md b/docs/pages/Building-&-Running.md
index 0dfe9f0baedae37796f77fdf4551b6afd3ed49d0..fd91043957d9e256364065d5466269ae8bb5b717 100644
--- a/docs/pages/Building-&-Running.md
+++ b/docs/pages/Building-&-Running.md
@@ -59,16 +59,17 @@ See the [examples](../../etc/examples) directory for more details (or
 ### Computing Disaggregations
 
 Like `HazardCalc`, the `DisaggCalc` program performs disaggregations at one or more sites for a
-variety of intensity measures, but requires an additional `returnPeriod` argument, in years. For
-example:
+variety of intensity measures. The return period for the disaggregation is defined in the config,
+see [`disagg.returnPeriod`](./Calculation-Configuration.md#calculation-configuration-parameters).
+Example:
 
 ```bash
-java -cp nshmp-haz.jar gov.usgs.earthquake.nshmp.DisaggCalc model sites returnPeriod [config]
+java -cp nshmp-haz.jar gov.usgs.earthquake.nshmp.DisaggCalc model sites [config]
 ```
 
 Disaggregations build on and output `HazardCalc` results along with other disaggregation specific
 files. Disaggregations also have some independent
-[configuration](./Calculation-Configuration.md#config-disagg) options.
+[configuration](./Calculation-Configuration.md#calculation-configuration-parameters) options.
 
 ## Run with [Docker](https://docs.docker.com/install/)
 
diff --git a/etc/examples/1-hazard-curve/README.md b/etc/examples/1-hazard-curve/README.md
index 6891e5968155a05c4e77ae30a9f7286efcf21571..f136d550c47e40da878ecb9a7535110aab6289b0 100644
--- a/etc/examples/1-hazard-curve/README.md
+++ b/etc/examples/1-hazard-curve/README.md
@@ -5,7 +5,7 @@ __Working directory:__ `/path/to/nshmp-haz/etc/examples/1-hazard-curve`
 On the command line, navigate to the directory above and execute the following:
 
 ```Shell
-hazard ../../peer/models/Set1-Case1 "Test Site, -122.0, 38.0"
+hazard ../../peer/models/Set1-Case1 site.csv
 ```
 
 The PEER models, such as that designated above, consist of simple cases for different source
@@ -15,28 +15,31 @@ testing. See the [PEER directory](../../peer/) for more information.
 The result of this calculation should be available as a single comma-delimited file containing
 several total mean hazard curves for PGA in a newly created `hazout` directory. In this example,
 the calculation configuration was derived from the model directory and the site is defined in
-file `site.csv`. See the [site specification](https://github.com/usgs/nshmp-haz/wiki/sites)
+file `site.csv`. See the [site specification](../../../docs/pages/Site-Specification.md)
 page for more details.
 
-Note that not all [calculation configuration](https://github.com/usgs/nshmp-haz/wiki/Configuration)
+Note that not all [calculation configuration](../../../docs/pages/Calculation-Configuration.md)
 parameters need be supplied; see the [configuration file](../../peer/models/Set1-Case1/config.json)
 for this example model.
 
 Also note that all output is written to a `hazout` directory by default, but the output destination
 can be specified via the
-[`output.directory`](https://github.com/usgs/nshmp-haz/wiki/configuration#config-output) parameter.
-In addition to hazard curves, the calculation configuration and a log of the calculation
-are also saved.
+[`output.directory`](../../../docs/pages/Calculation-Configuration.md#calculation-configuration-parameters)
+parameter. In addition to hazard curves, the calculation configuration and a log of the calculation
+are also saved. The primary outputs are hazard curves, hazard curves truncated below about 10⁻⁴,
+and ground motion values derived from the curves for specific return periods.
 
 __Results directory structure:__
 
 ```text
 1-hazard-curve/
   └─ hazout/
-      ├─ config.json
+      ├─ calc-config.json
       ├─ HazardCalc.log
       └─ PGA/
-          └─ curves.csv
+          ├─ curves.csv
+          ├─ curves-truncated.csv
+          └─ map.csv
 ```
 
 In the next example, we'll override the model supplied configuration with a custom file.
diff --git a/etc/examples/2-custom-config/README.md b/etc/examples/2-custom-config/README.md
index ca5163209413c937d88b172a5215c677a1899f2c..fee21af31f3d6d280a35947895c9ec2c7d3c706d 100644
--- a/etc/examples/2-custom-config/README.md
+++ b/etc/examples/2-custom-config/README.md
@@ -13,12 +13,12 @@ In this example we've overridden the configuration supplied by the model. Specif
 * The upper end of each hazard curve has been truncated at 3 standard deviations.
 * Hazard curves have been saved as poisson probability instead of annual rate.
 * Hazard curves have been calculated for 3 `imts`
- ([intensity measures](http://usgs.github.io/nshmp-haz/javadoc/index.html?gov/usgs/earthquake/nshmp/gmm/Imt.html),
+ ([intensity measures](https://earthquake.usgs.gov/nshmp/docs/nshmp-lib/gov/usgs/earthquake/nshmp/gmm/Imt.html),
   or spectral periods).
 * The `imls` (intensity measure levels or x-values) of the resultant curves
 have been explicitely defined for each `imt`.
 
-See the [configuration specification](https://github.com/usgs/nshmp-haz/wiki/configuration)
+See the [configuration specification](../../../docs/pages/Calculation-Configuration.md)
 for details on default values and supported options and formats.
 
 __Results directory structure:__
@@ -26,14 +26,20 @@ __Results directory structure:__
 ```text
 2-custom-config/
   └─ hazout/
-      ├─ config.json
+      ├─ calc-config.json
       ├─ HazardCalc.log
       ├─ PGA/
-      │   └─ curves.csv
+      │   ├─ curves.csv
+      │   ├─ curves-truncated.csv
+      │   └─ map.csv
       ├─ SA0P2/
-      │   └─ curves.csv
+      │   ├─ curves.csv
+      │   ├─ curves-truncated.csv
+      │   └─ map.csv
       └─ SA1P0/
-          └─ curves.csv
+          ├─ curves.csv
+          ├─ curves-truncated.csv
+          └─ map.csv
 ```
 
 <!-- markdownlint-disable MD001 -->
diff --git a/etc/examples/3-sites-file/README.md b/etc/examples/3-sites-file/README.md
index 65aa2ba681db02df0ac2a9c789f6851e3b8b8657..97ec338b4e351fae1b11053e64817011b271f0ff 100644
--- a/etc/examples/3-sites-file/README.md
+++ b/etc/examples/3-sites-file/README.md
@@ -6,7 +6,7 @@ To compute hazard at more than one site, one may supply a comma-delimited (\*.cs
  or [GeoJSON](http://geojson.org) (\*.geojson) formatted site data file instead:
 
 ```Shell
-hazard ../../peer/models/Set1-Case1  sites.csv config.json
+hazard ../../peer/models/Set1-Case1 sites.csv config.json
 ```
 
 or
@@ -15,8 +15,8 @@ or
 hazard ../../peer/models/Set1-Case1 sites.geojson config.json
 ```
 
-The [site specification](https://github.com/usgs/nshmp-haz/wiki/sites)
-wiki page provides details on the two file formats. Note that with either format,
+The [site specification](../../../docs/pages/Site-Specification.md)
+page provides details on the two file formats. Note that with either format,
 if the name of a site is supplied, it will be included in the first column of any output curve files.
 
 __Results directory structure:__
@@ -24,14 +24,20 @@ __Results directory structure:__
 ```text
 3-sites-file/
   └─ hazout/
-      ├─ config.json
+      ├─ calc-config.json
       ├─ HazardCalc.log
       ├─ PGA/
-      │   └─ curves.csv
+      │   ├─ curves.csv
+      │   ├─ curves-truncated.csv
+      │   └─ map.csv
       ├─ SA0P2/
-      │   └─ curves.csv
+      │   ├─ curves.csv
+      │   ├─ curves-truncated.csv
+      │   └─ map.csv
       └─ SA1P0/
-          └─ curves.csv
+          ├─ curves.csv
+          ├─ curves-truncated.csv
+          └─ map.csv
 ```
 
 <!-- markdownlint-disable MD001 -->
diff --git a/etc/examples/4-hazard-map/README.md b/etc/examples/4-hazard-map/README.md
index da3708ea2464aa03afd53985b33b5b0486f02543..641feee179eb50977ff3f2195bb3d9e9f4486cb3 100644
--- a/etc/examples/4-hazard-map/README.md
+++ b/etc/examples/4-hazard-map/README.md
@@ -16,14 +16,20 @@ __Results directory structure:__
 ```text
 4-hazard-map/
   └─ hazout/
-      ├─ config.json
+      ├─ calc-config.json
       ├─ HazardCalc.log
       ├─ PGA/
-      │   └─ curves.csv
+      │   ├─ curves.csv
+      │   ├─ curves-truncated.csv
+      │   └─ map.csv
       ├─ SA0P2/
-      │   └─ curves.csv
+      │   ├─ curves.csv
+      │   ├─ curves-truncated.csv
+      │   └─ map.csv
       └─ SA1P0/
-          └─ curves.csv
+          ├─ curves.csv
+          ├─ curves-truncated.csv
+          └─ map.csv
 ```
 
 <!-- markdownlint-disable MD001 -->
diff --git a/etc/examples/5-complex-model/README.md b/etc/examples/5-complex-model/README.md
index 15616984654db3a8cc073e4fdb6c110cdea49a1c..29a3ee9b4c1a78f253a21432fc6c85a82c2f5092 100644
--- a/etc/examples/5-complex-model/README.md
+++ b/etc/examples/5-complex-model/README.md
@@ -39,7 +39,7 @@ hazard ../../../../nshm-conus map.geojson config-map.json
 ```
 
 This computes 121 curves over a 2° by 2° area and will give you a sense of how long a larger map
-might take. This small coarse map may take 10 minutes to complete. Note that in the above two
+might take. This small, coarse map may take 10 minutes to complete. Note that in the above two
 examples we specified different output directories in the config files for each calculation.
 
 __Results directory structure:__
@@ -47,20 +47,28 @@ __Results directory structure:__
 ```text
 5-complex-model/
   ├─ hazout-sites/
-  │   ├─ config.json
+  │   ├─ calc-config.json
   │   ├─ HazardCalc.log
   │   ├─ SA1P0/
-  │   │   └─ curves.csv
+  │   │   ├─ curves.csv
+  │   │   ├─ curves-truncated.csv
+  │   │   └─ map.csv
   │   └─ SA2P0/
-  │       └─ curves.csv
+  │       ├─ curves.csv
+  │       ├─ curves-truncated.csv
+  │       └─ map.csv
   │
   └─ hazout-map/
-      ├─ config.json
+      ├─ calc-config.json
       ├─ HazardCalc.log
       ├─ SA1P0/
-      │   └─ curves.csv
+      │   ├─ curves.csv
+      │   ├─ curves-truncated.csv
+      │   └─ map.csv
       └─ SA2P0/
-          └─ curves.csv
+          ├─ curves.csv
+          ├─ curves-truncated.csv
+          └─ map.csv
 ```
 
 <!-- markdownlint-disable MD001 -->
diff --git a/etc/examples/6-enhanced-output/README.md b/etc/examples/6-enhanced-output/README.md
index efed4971851d0928f43b062c5c4d76a6bc328e7c..c20c6d251d44547eab074082843b0167a23713ca 100644
--- a/etc/examples/6-enhanced-output/README.md
+++ b/etc/examples/6-enhanced-output/README.md
@@ -15,14 +15,15 @@ The config file for this example, `config.json`, specified `GMM` and `SOURCE` as
 [output data types][output_types]. Note that the output curves directory now contains additional
 directories of curves by source type and GMM.
 
-[output_types]: ../../../docs/pages/Calculation-Configuration.md#calculation-configuration
+[output_types]: ../../../docs/pages/Calculation-Configuration.md#calculation-configuration-parameters
 
-See the `nshmp-haz` wiki and javadocs for more information on source types ([Wiki][source_wiki],
-[JavaDoc][source_javadoc]) and GMMs ([Wiki][gmm_wiki], [JavaDoc][gmm_javadoc]).
+See the `nshmp-haz` documentation and javadocs for more information on source types
+([docs][source_docs], [JavaDoc][source_javadoc]) and GMMs
+([docs][gmm_docs], [JavaDoc][gmm_javadoc]).
 
-[source_wiki]: ../../../docs/pages/Source-Types.md
+[source_docs]: ../../../docs/pages/Source-Types.md
 [source_javadoc]: https://earthquake.usgs.gov/nshmp/docs/nshmp-lib/gov/usgs/earthquake/nshmp/model/SourceType.html
-[gmm_wiki]: ./../../docs/pages/Ground-Motion-Models.md
+[gmm_docs]: ./../../docs/pages/Ground-Motion-Models.md
 [gmm_javadoc]: https://earthquake.usgs.gov/nshmp/docs/nshmp-lib/gov/usgs/earthquake/nshmp/gmm/package-summary.html
 
 __Results directory structure:__
@@ -30,7 +31,7 @@ __Results directory structure:__
 ```text
 6-enhanced-output/
   └─ hazout/
-      ├─ config.json
+      ├─ calc-config.json
       ├─ HazardCalc.log
       ├─ PGA/
       │   ├─ curves-truncated.csv
diff --git a/etc/examples/7-disaggregation/README.md b/etc/examples/7-disaggregation/README.md
index ea60c780c8022a225536f941cb2358b7b3d533fe..a01f54397295e2ba55c14878526aae6785b7aff1 100644
--- a/etc/examples/7-disaggregation/README.md
+++ b/etc/examples/7-disaggregation/README.md
@@ -3,77 +3,54 @@
 __Working directory:__ `/path/to/nshmp-haz/etc/examples/7-disaggregation`
 
 To perform a disaggregation of hazard, one must use the program `DisaggCalc`. Internally,
-`DisaggCalc` calls `HazardCalc` and then reprocesses the data to generate a comma-delimited
-file of distance, magnitude, and epsilon bins, and a text file of summary statistics and primary
-contributing sources. For this, it can be helpful to create a second system alias:
+`DisaggCalc` calls `HazardCalc` and then reprocesses the data to generate output files of
+disaggregation summary statistics and primary contributing sources. For this, it can be helpful
+to create a second system alias:
 
 ```Shell
 alias disagg='java -Xms4g -Xmx8g -cp /path/to/nshmp-haz/build/libs/nshmp-haz.jar gov.usgs.earthquake.nshmp.DisaggCalc'
 ```
 
-`DisaggCalc` is similar to `HazardCalc` in every way except that the return-period of interest
-must be specified. For example, execute:
+The command line arguments for `DisaggCalc` are the same as those for `HazardCalc`. The target
+return period for a disaggregation is specified in the config
+[`disagg.returnPeriod`](../../../docs/pages/Calculation-Configuration.md#calculation-configuration-parameters)
+field. For compute the disaggregation in this example, execute:
 
 ```Shell
-disagg ../../../../nshm-conus sites.geojson 2475 config.json
+disagg ../../../../nshm-conus sites.csv config.json
 ```
 
-The results of the disaggregation are saved along with hazard curves in `disagg` directories.
-As with `HazardCalc`, if the `GMM` data type has been specified (as it has in the
+The results of the disaggregation are saved alongside hazard curves in a `disagg` directory.
+Disaggregation results are stored in JSON format with one file for each site. The results for
+each IMT are stored within that file as well. As with `HazardCalc`, if the `GMM` data type has
+been specified (as it has in the
 [config](../../../docs/pages/Calculation-Configuration.md#calculation-configuration)
 file for this example) additional disaggregation results for each GMM are generated as well.
 Disaggregations by individual `SOURCE` type are also possible.
 
+Note that `DisaggCalc` will only process a CSV file of sites (not GeoJSON).
+
 __Results directory structure:__
 
 ```text
 7-disaggregation/
   └─ hazout/
-      ├─ config.json
+      ├─ calc-config.json
       ├─ DisaggCalc.log
+      ├─ disagg/Los Angeles CA.json
+      │   ├─ Los Angeles CA.json
+      │   ├─ Salt Lake City UT.json
+      │   ├─ San Francisco CA.json
+      │   └─ Seattle WA.json
       ├─ PGA/
       │   ├─ curves-truncated.csv
       │   ├─ curves.csv
-      │   ├─ disagg/
-      │   │   ├─ Los Angeles CA/
-      │   │   │   ├─ data.csv
-      │   │   │   └─ summary.txt
-      │   │   ├─ Salt Lake City UT/
-      │   │   │   ├─ data.csv
-      │   │   │   └─ summary.txt
-      │   │   ├─ San Francisco CA/
-      │   │   │   ├─ data.csv
-      │   │   │   └─ summary.txt
-      │   │   └─ Seattle WA/
-      │   │       ├─ data.csv
-      │   │       └─ summary.txt
       │   └─ gmm/
       │       ├─ AM_09_INTERFACE_BASIN/
-      │       │   ├─ curves.csv
-      │       │   └─ disagg/
-      │       │       ├─ San Francisco CA/
-      │       │       │   ├─ data.csv
-      │       │       │   └─ summary.txt
-      │       │       └─ Seattle WA/
-      │       │           ├─ data.csv
-      │       │           └─ summary.txt
+      │       │   └─ curves.csv
       │       ├─ ...
-      │       ├─ CB_14_BASIN/
-      │       │   ├─ curves.csv
-      │       │   └─ disagg/
-      │       │       ├─ Los Angeles CA/
-      │       │       │   ├─ data.csv
-      │       │       │   └─ dsummary.txt
-      │       │       ├─ Salt Lake City UT/
-      │       │       │   ├─ data.csv
-      │       │       │   └─ summary.txt
-      │       │       ├─ San Francisco CA/
-      │       │       │   ├─ data.csv
-      │       │       │   └─ summary.txt
-      │       │       └─ Seattle WA/
-      │       │           ├─ data.csv
-      │       │           └─ summary.txt
-      │       └─ ...
+      │       └─ ZHAO_06_SLAB_BASIN/
+      │           └─ curves.csv
       ├─ SA0P1/
       │   └─ ...
       └─ ...
@@ -84,7 +61,7 @@ Note that in the output above, there are only disaggregation results for subduct
 will not be saved.
 
 <!-- markdownlint-disable MD001 -->
-#### Next: [Example 8 – Earthquake probabilities and rates](../8-probabilities/README.md)
+<!--  #### Next: [Example 8 – Earthquake probabilities and rates](../8-probabilities/README.md) -->
 
 ---
 
diff --git a/etc/examples/7-disaggregation/sites.csv b/etc/examples/7-disaggregation/sites.csv
new file mode 100644
index 0000000000000000000000000000000000000000..bed28dd3d11ad7a40ad9c85a44b962f4fb5bdac2
--- /dev/null
+++ b/etc/examples/7-disaggregation/sites.csv
@@ -0,0 +1,5 @@
+name,                  lon,   lat
+Los Angeles CA,    -118.25, 34.05
+San Francisco CA,  -122.40, 37.75
+Seattle WA,        -122.30, 47.60
+Salt Lake City UT, -111.90, 40.75
diff --git a/etc/examples/7-disaggregation/sites.geojson b/etc/examples/7-disaggregation/sites.geojson
deleted file mode 100644
index 2275ce3bbc6674402a6f8bbefa93d7dc56f9b925..0000000000000000000000000000000000000000
--- a/etc/examples/7-disaggregation/sites.geojson
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "type": "Feature",
-      "geometry": {
-        "type": "Point",
-        "coordinates": [-118.25, 34.05]
-      },
-      "properties": {
-        "marker-size": "small",
-        "marker-color": "#ff0080",
-        "title": "Los Angeles CA"
-      }
-    },
-    {
-      "type": "Feature",
-      "geometry": {
-        "type": "Point",
-        "coordinates": [-122.40, 37.75]
-      },
-      "properties": {
-        "marker-size": "small",
-        "marker-color": "#ff0080",
-        "title": "San Francisco CA"
-      }
-    },
-    {
-      "type": "Feature",
-      "geometry": {
-        "type": "Point",
-        "coordinates": [-122.30, 47.60]
-      },
-      "properties": {
-        "marker-size": "small",
-        "marker-color": "#ff0080",
-        "title": "Seattle WA"
-      }
-    },
-    {
-      "type": "Feature",
-      "geometry": {
-        "type": "Point",
-        "coordinates": [-111.90, 40.75]
-      },
-      "properties": {
-        "marker-size": "small",
-        "marker-color": "#ff0080",
-        "title": "Salt Lake City UT"
-      }
-    }
-  ]
-}
diff --git a/etc/examples/8-probabilities/README.md b/etc/examples/8-probabilities/README.md
deleted file mode 100644
index 4647c3da9ddfabc645d0f4404c6edc0f1329e889..0000000000000000000000000000000000000000
--- a/etc/examples/8-probabilities/README.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Example 8: Earthquake probabilities and rates
-
-__Working directory:__ `/path/to/nshmp-haz/etc/examples/8-probabilities`
-
-`nshmp-haz` can also calculate earthquake probabilities and rates at a location.
-As with the `HazardCalc` and `DisaggCalc` programs, `RateCalc` takes a model, a site data file
-or string, and an optional config file, which will control whether the distributions generated
-are incremental or cumulative, and whether the distribution values are expressed as annual rates
-or Poisson probabilities. The default (no config supplied) settings are for incremental
-annual-rates. The `config.rate` elements also specify the cutoff `distance`, within which
-all sources should be included, and a `timespan` used for conversion to Poisson probabilities.
-
-For this example, the following system alias is helpful:
-
-```Shell
-alias rate='java -Xms4g -Xmx8g -cp /path/to/nshmp-haz/build/libs/nshmp-haz.jar gov.usgs.earthquake.nshmp.RateCalc'
-```
-
-Assuming a copy of the CONUS NSHM is available (see [Example 5](../5-complex-model)), execute:
-
-```Shell
-rate ../../../../nshm-conus sites.csv config-sites.json
-```
-
-to generate incremental, annual-rate output for a list of sites, or
-
-```Shell
-rate ../../../../nshm-conus map.geojson config-map.json
-```
-
-to generate a map of cumulative Poisson probabilities (i.e. P ≥ M).
-
-Like `HazardCalc`, `RateCalc` observes the `config.output.dataTypes` `SOURCE`
-option and will include a `source` directory with rates or probabilities for all
-contributing source types.
-
-__Results directory structure:__
-
-```text
-8-probabilities/
-  ├─ hazout-rate-sites/
-  │   ├─ config.json
-  │   ├─ RateCalc.log
-  │   ├─ rates.csv
-  │   └─ source/
-  │       ├─ FAULT/
-  │       │   └─ probs.csv
-  │       └─ ...
-  └─ hazout-prob-map/
-      ├─ config.json
-      ├─ RateCalc.log
-      └─ probs.csv
-      └─ source/
-          ├─ FAULT/
-          │   └─ rates.csv
-          └─ ...
-```
-
----
-
-* [**Documentation Index**](../../../docs/README.md)
diff --git a/etc/examples/8-probabilities/config-map.json b/etc/examples/8-probabilities/config-map.json
deleted file mode 100644
index 8fe1479387b26dec348c70da4046e7cc8108e829..0000000000000000000000000000000000000000
--- a/etc/examples/8-probabilities/config-map.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "output": {
-    "dataTypes": ["SOURCE"],
-    "directory": "hazout-prob-map"
-  },
-  "rate": {
-    "distance": 10.0,
-    "valueFormat": "POISSON_PROBABILITY",
-    "distributionFormat": "CUMULATIVE",
-    "timespan": 50.0
-  }
-}
diff --git a/etc/examples/8-probabilities/config-sites.json b/etc/examples/8-probabilities/config-sites.json
deleted file mode 100644
index fa865014fc0b306cfd5bd603a7c02b56712bdac0..0000000000000000000000000000000000000000
--- a/etc/examples/8-probabilities/config-sites.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "output": {
-    "dataTypes": ["SOURCE"],
-    "directory": "hazout-rate-sites"
-  }
-}
diff --git a/etc/examples/8-probabilities/map.geojson b/etc/examples/8-probabilities/map.geojson
deleted file mode 100644
index 77ba418305feb514f068c8ed64dd223065fb32ef..0000000000000000000000000000000000000000
--- a/etc/examples/8-probabilities/map.geojson
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "type": "Feature",
-      "geometry": {
-        "type": "Polygon",
-        "coordinates": [[
-            [-123.0, 37.0],
-            [-121.0, 37.0],
-            [-121.0, 39.0],
-            [-123.0, 39.0],
-            [-123.0, 37.0]
-          ]]
-      },
-      "properties": {
-        "spacing": 0.2,
-        "title": "San Francisco Bay Area"
-      }
-    }
-  ]
-}
diff --git a/etc/examples/8-probabilities/sites.csv b/etc/examples/8-probabilities/sites.csv
deleted file mode 100644
index b55826d0fd00d2c5ba3b83fa2250cca4a9d91af3..0000000000000000000000000000000000000000
--- a/etc/examples/8-probabilities/sites.csv
+++ /dev/null
@@ -1,14 +0,0 @@
-name,                  lon,    lat
-Fresno CA,         -119.75,  36.75
-Los Angeles CA,    -118.25,  34.05
-Oakland CA,        -122.25,  37.80
-San Francisco CA,  -122.40,  37.75
-San Jose CA,       -121.90,  37.35
-Santa Rosa CA,     -122.70,  38.45
-Vallejo CA,        -122.25,  38.10
-Las Vegas NV,      -115.15,  36.20
-Reno NV,           -119.80,  39.55
-Eugene OR,         -123.10,  44.05
-Salt Lake City UT, -111.90,  40.75
-Tacoma WA,         -122.45,  47.25
-Jackson WY,        -110.75,  43.50
diff --git a/etc/examples/README.md b/etc/examples/README.md
index b557f3baae6ef5ffda228f41c8bcd4d2d489fc20..343bc5b7fc525aa731e601cd2aebeeabc27459c5 100644
--- a/etc/examples/README.md
+++ b/etc/examples/README.md
@@ -1,6 +1,6 @@
 # Examples
 
-These examples are designed to be executed locally while following the READMEs on GitHub.
+These examples are designed to be executed locally while following the READMEs on GitLub.
 All examples avoid a lengthy call to Java and the `HazardCalc` program by using the following
 system alias:
 
diff --git a/etc/matlab/README.md b/etc/matlab/README.md
index 1c512892c06184470cd438d569c9932f1da10b31..e6ae912c9572a058886e0c1f22aab36a009d82ee 100644
--- a/etc/matlab/README.md
+++ b/etc/matlab/README.md
@@ -1,15 +1,5 @@
 # Using nshmp-haz with Matlab
 
-This is out of date.
-
->**NOTE:** *nshmp-haz* was recently upgraded to Java 8, which supercedes and is
-incompatable with the Java 7 JVM that ships with Matlab. Users will need to set the
-`MATLAB_JAVA` environment variable to point to a Java 8 runtime.
-
-All recent versions of Matlab include a Java runtime environment and it is therefore
-relatively straightforward to use the nshmp-haz library.
-
-## Requirements
-
-1. Matlab R2013B or higher (nshmp-haz targets Java 7; prior versions of Matlab use Java 6).
-2. A [build](https://github.com/usgs/nshmp-haz/wiki/building-&-running) of nshmp-haz.
+The best way to use _nshmp-haz_ with matlab is as a web service. The scripts in this directory
+provide examples of how to access web services for ground motion models (GMMs) that are based
+on the code in this repository.
diff --git a/etc/python/README.md b/etc/python/README.md
deleted file mode 100644
index 4fb2e5dd2e549126d23f8dcf47d2cb3626796f15..0000000000000000000000000000000000000000
--- a/etc/python/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Using nshmp-haz with Python
-
-There are a few different packages that will allow you to call Java code from Python.
-This example uses jpype.  It also uses NumPy to simplify working with the arrays
-returned by the ground motion model calculators.
-
-## Requirements
-
-1. A [build](https://github.com/usgs/nshmp-haz/wiki/building-&-running) of nshmp-haz.
-2. [jpype](http://jpype.readthedocs.io/en/latest/install.html)
-3. [NumPy](http://www.numpy.org/)
diff --git a/etc/python/gmm-inputs.csv b/etc/python/gmm-inputs.csv
deleted file mode 100644
index dc4f5e207506b53a41b5e7fe9a0fc78178b47392..0000000000000000000000000000000000000000
--- a/etc/python/gmm-inputs.csv
+++ /dev/null
@@ -1,38 +0,0 @@
- dip, 
-0,
-2.5,
-5,
-7.5,
-10,
-12.5,
-15,
-17.5,
-20,
-22.5,
-25,
-27.5,
-30,
-32.5,
-35,
-37.5,
-40,
-42.5,
-45,
-47.5,
-50,
-52.5,
-55,
-57.5,
-60,
-62.5,
-65,
-67.5,
-70,
-72.5,
-75,
-77.5,
-80,
-82.5,
-85,
-87.5,
-90,
\ No newline at end of file
diff --git a/etc/python/gmmBatchExample.py b/etc/python/gmmBatchExample.py
deleted file mode 100644
index ff5c3dd4da960ec7f53da49b9cd1071f2c60dbaa..0000000000000000000000000000000000000000
--- a/etc/python/gmmBatchExample.py
+++ /dev/null
@@ -1,90 +0,0 @@
-## nshmp-haz Ground Motion Model (GMM) batch processing example script
-
-import requests
-
-## Read CSV file of GMM inputs
-#
-# Each column of the CSV file is a GMM input parameter with the
-# first row dictating that GMM input field.
-#
-# Example CSV to change only dip:
-# dip,
-# 0.0,
-# 45.0,
-# 90.0,
-#
-# For a full list of GMM input paramters see:
-# http://usgs.github.io/nshmp-haz/javadoc/gov/usgs/earthquake/nshmp/gmm/GmmInput.html
-#
-# If 'null' is supplied as a value or a GMM input field and values are
-# not given, the default values are used:
-# http://usgs.github.io/nshmp-haz/javadoc/gov/usgs/earthquake/nshmp/gmm/GmmInput.Builder.html#withDefaults--
-file = open('gmm-inputs.csv', 'r')
-
-inputs = file.read()
-
-file.close()
-
-
-## URL to POST the CSV file of GMM inputs
-# 
-# Must update the URL host if not on localhost.
-#
-# The GMMs must be specified in the URL query string.
-#
-# All GMM services are available to call for batch processing.
-host = 'http://localhost:8080'
-
-service = '/nshmp-haz/gmm/spectra'
-
-url = host + service
-
-query = { 'gmm': [ 'AB_06_PRIME', 'CAMPBELL_03', 'FRANKEL_96' ] }
-
-
-## Conduct HTTP POST Request
-#
-# Conduct a HTTP POST request, sending the CSV file of GMM inputs.
-#
-# The POST response is loaded into a object
-# following the returned JSON structure.
-svcResponse = requests.post(url, data = inputs, params = query).json()
-
-
-## Check Response
-#
-# Check to see if the response returned an error and check
-# to see if the field 'response' exists in the object.
-#
-# If the URL does not contain a query string of GMMs the response
-# returned will be the service usage.
-if svcResponse['status'] == 'error' and ~hasattr(svcResponse, 'response'):
-  exit()
-
-
-## Retreive the data
-#
-# Loop through each response spectrum response and obtain the means
-# and sigmas.
-for response in svcResponse['response']:
-
-  # Request structure contains the GMMs and GMM input parameters used
-  request = response['request']
-
-  # The GMMs used for the calculation
-  gmms = request['gmms']
- 
-  # The GMM input parameters used for the calculation
-  gmmInput = request['input']
-
-  # Get the means
-  for means in response['means']['data']:
-    data = means['data']
-    xMeans = data['xs']
-    yMeans = data['ys']
-
-  # Get the sigmas
-  for sigmas in response['sigmas']['data']:
-    data = sigmas['data']
-    xSigmas = data['xs']
-    ySigmas = data['ys']
diff --git a/etc/python/gmmExample.py b/etc/python/gmmExample.py
deleted file mode 100644
index 5819560c29f8cb10e9970e05d1b3dac497a14bb1..0000000000000000000000000000000000000000
--- a/etc/python/gmmExample.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env python
-## nshmp-haz Ground Motion Model (GMM) calculator example script
-
-# =========================================================================
-# This script provides instruction on how to access ground motion models
-# (GMMs) implemented in the nshmp-haz library.
-# =========================================================================
-
-from jpype import *
-import numpy as np
-
-# Specify path to nshmp-haz library:
-classpath = '/path/to/repository/nshmp-haz-master/build/libs/nshmp-haz.jar'
-
-# Start Java Virtual Machine and add nshmp-haz to classpath:
-startJVM(getDefaultJVMPath(), "-ea", 
-         "-Djava.class.path={0}".format(classpath))
-
-# Import packages:
-nshmp = JPackage("gov").usgs.earthquake.nshmp.etc
-
-# =========================================================================
-# Single ground motion calcuation:
-
-# Initialize calculator:
-hazMat = nshmp.HazMat.init(classpath)
-
-# Note that hazMat is stateless and reusable and should therefore be
-# initialized only once in a script if doing many calculations.
-
-# Set up a GMM input parameter object. These data are a source and site
-# parameterization that will satisfy all currently implemented Gmms. Note
-# that not all models will necessarily use all parameters.    
-gmmparams = nshmp.GmmParams()
-gmmparams.Mw = 6.5
-gmmparams.rJB = 5.0
-gmmparams.rRup = 5.1
-gmmparams.rX = 5.1
-gmmparams.dip = 90.0
-gmmparams.width = 10.0
-gmmparams.zTop = 1.0
-gmmparams.zHyp = 6.0
-gmmparams.rake = 0.0
-gmmparams.vs30 = 760.
-gmmparams.vsInf = True
-gmmparams.z2p5 = np.nan
-gmmparams.z1p0 = np.nan
-
-# Specify a ground motion model. GMM identifiers:
-# http://usgs.github.io/nshmp-haz/javadoc/gov/usgs/earthquake/nshmp/gmm/Gmm.html
-gmm = 'ASK_14';
-
-# Specify an intensity measure type (IMT). IMT identifiers:
-# http://usgs.github.io/nshmp-haz/javadoc/gov/usgs/earthquake/nshmp/gmm/Imt.html
-imt = 'PGA';
-
-# Do a calculation. The MatUtil.calc(gmm, imt, gmmInput) method returns an
-# array of [ln(median ground motion), sigma]
-ln_med_gm, sigma = hazMat.gmmMean(gmm, imt, gmmparams)
-
-print('ln(median ground motion), sigma:')
-print(ln_med_gm, sigma)
-
-# =========================================================================
-# Determinisitic response spectrum calculation:
-
-# The object returned by the MatUtil.spectrum(gmm, gmmInput) method may
-# be converted to NumPy arrays.
-# The returned HazMat Spectrum object is not iterable, so do this array 
-# by array.
-spectrumResult = hazMat.gmmSpectrum(gmm, gmmparams)
-pds = np.array(spectrumResult.periods)
-means = np.array(spectrumResult.means)
-sigmas = np.array(spectrumResult.sigmas)
-print('period, mean, sigma:')
-for i in range(len(pds)):
-    print(pds[i], means[i], sigmas[i])
-# =========================================================================
diff --git a/gradle.properties b/gradle.properties
index 59ab9e79e40dc7b657035a2ccb3f120e43d82450..5f64b407c17c5874ee42ac159ae4929b48bbedf8 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.3
+nshmpLibVersion = 0.9.4
 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 de59f18b22b4d55af6e5b48e9a2daea542165798..2b268e5b92ef29a307470c56d5df8b6680c8c077 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java
@@ -260,10 +260,6 @@ public class DisaggCalc {
   /*
    * Compute hazard curves using the supplied model, config, and sites. Method
    * returns the path to the directory where results were written.
-   *
-   * TODO consider refactoring to supply an Optional<Double> return period to
-   * HazardCalc.calc() that will trigger disaggregations if the value is
-   * present.
    */
   private static Path calcRp(
       HazardModel model,
@@ -284,7 +280,7 @@ public class DisaggCalc {
 
     log.info(PROGRAM + " (return period): calculating ...");
 
-    HazardExport handler = HazardExport.create(model, config, sites, log);
+    HazardExport handler = HazardExport.create(model, config, sites);
     Path disaggDir = handler.outputDir().resolve("disagg");
     Files.createDirectory(disaggDir);
 
@@ -314,17 +310,18 @@ public class DisaggCalc {
       GSON.toJson(response, writer);
       writer.close();
 
-      if (i % logInterval == 0) {
+      int count = i + 1;
+      if (count % logInterval == 0) {
         log.info(String.format(
             "     %s of %s sites completed in %s",
-            i + 1, sites.size(), stopwatch));
+            count, sites.size(), stopwatch));
       }
     }
     handler.expire();
 
     log.info(String.format(
         PROGRAM + " (return period): %s sites completed in %s",
-        handler.resultCount(), handler.elapsedTime()));
+        sites.size(), stopwatch.stop()));
 
     exec.shutdown();
     return handler.outputDir();
@@ -353,10 +350,6 @@ public class DisaggCalc {
   /*
    * Compute hazard curves using the supplied model, config, and sites. Method
    * returns the path to the directory where results were written.
-   *
-   * TODO consider refactoring to supply an Optional<Double> return period to
-   * HazardCalc.calc() that will trigger disaggregations if the value is
-   * present.
    */
   private static Path calcIml(
       HazardModel model,
@@ -404,16 +397,17 @@ public class DisaggCalc {
       GSON.toJson(response, writer);
       writer.close();
 
-      if (i % logInterval == 0) {
+      int count = i + 1;
+      if (count % logInterval == 0) {
         log.info(String.format(
             "     %s of %s sites completed in %s",
-            i + 1, sites.size(), stopwatch));
+            count, sites.size(), stopwatch));
       }
     }
 
     log.info(String.format(
         PROGRAM + " (IML): %s sites completed in %s",
-        sites.size(), stopwatch));
+        sites.size(), stopwatch.stop()));
 
     exec.shutdown();
     return outDir;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/HazardCalc.java b/src/main/java/gov/usgs/earthquake/nshmp/HazardCalc.java
index 9815cc2b2fe31faf43c60920ed99c5d603609ffd..3342bca22cd0ef921c542fb752dd5a1907e1423d 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/HazardCalc.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/HazardCalc.java
@@ -172,7 +172,7 @@ public class HazardCalc {
     log.info("Threads: " + ((ThreadPoolExecutor) exec).getCorePoolSize());
     log.info(PROGRAM + ": calculating ...");
 
-    HazardExport handler = HazardExport.create(model, config, sites, log);
+    HazardExport handler = HazardExport.create(model, config, sites);
     CalcTask.Builder calcTask = new CalcTask.Builder(model, config, exec);
     WriteTask.Builder writeTask = new WriteTask.Builder(handler);
 
@@ -184,10 +184,11 @@ public class HazardCalc {
       Site site = sites.get(i);
       Hazard hazard = calcTask.withSite(site).call();
       out = exec.submit(writeTask.withResult(hazard));
-      if (i % logInterval == 0) {
+      int count = i + 1;
+      if (count % logInterval == 0) {
         log.info(String.format(
             "     %s of %s sites completed in %s",
-            i + 1, sites.size(), stopwatch));
+            count, sites.size(), stopwatch));
       }
     }
     /* Block shutdown until last task is returned. */
@@ -197,7 +198,7 @@ public class HazardCalc {
     exec.shutdown();
     log.info(String.format(
         PROGRAM + ": %s sites completed in %s",
-        handler.resultCount(), handler.elapsedTime()));
+        handler.resultCount(), stopwatch.stop()));
 
     return outputDir;
   }
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java b/src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java
index 74cca82232305096990ce79cc9a38200e6b449ef..b4580ef94e478e0733909b9f055b73b29b8a4229 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java
@@ -53,9 +53,11 @@ public class HazardMaps {
    */
   public static void main(String[] args) {
     if (args.length < 1) {
-      System.out.println("Usage: Supply a path to a file of hazard curve results and");
-      System.out.println("       optionally a space separated list of return periods (in yr)");
-      System.out.println("       default return periods: 475 975 2475");
+      System.out.println("Usage: Supply a path to a file of or directory containing hazard");
+      System.out.println("       curve results and optionally a space separated list of return");
+      System.out.println("       periods (in yr). If a directory is specified, nested curve");
+      System.out.println("       files are expected to be named 'curves.csv'.");
+      System.out.println("       Default return periods: 475 975 2475");
       return;
     }
 
@@ -84,9 +86,9 @@ public class HazardMaps {
       Path curvesPath,
       List<Integer> returnPeriods,
       Logger log) throws IOException {
-    log.info(PROGRAM + ": Creating hazard map dataset:");
-    log.info("\tReturn periods: " + returnPeriods.toString());
-    log.info("\tPath: " + curvesPath.toAbsolutePath().toString());
+    log.info(PROGRAM + ": Creating hazard map datasets...");
+    log.info("    Return periods: " + returnPeriods.toString());
+    log.info("    Path: " + curvesPath.toAbsolutePath().toString());
 
     if (Files.isDirectory(curvesPath)) {
       CurvesVisitor curvesFinder = new CurvesVisitor(returnPeriods);
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/RateCalc.java b/src/main/java/gov/usgs/earthquake/nshmp/RateCalc.java
index 8c59131d9327b57f5e3abd2f40e2d08085f4e4e9..d2a3fd5c0a9fe29ae0098d071eb1bfa89afabdde 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/RateCalc.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/RateCalc.java
@@ -186,9 +186,6 @@ public class RateCalc {
      * there are one or more longer-running calcs in the batch, processing
      * batches of locations to a List preserves submission order; as opposed to
      * using FutureCallbacks, which will reorder sites on export.
-     *
-     * TODO this is a terrible implementation with batch size 10. resulted from
-     * refactor to exports not queueing results
      */
     for (Site site : sites) {
       Callable<EqRate> task = EqRate.callable(model, config, site);
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/site/CybershakeSite.java b/src/main/java/gov/usgs/earthquake/nshmp/site/CybershakeSite.java
index 712fb6fc69510fc100414f5069edbcce2892dfab..381332a4621cade7348db2ddd2db4142a4ac6242 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/site/CybershakeSite.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/site/CybershakeSite.java
@@ -17,9 +17,6 @@ public enum CybershakeSite implements NamedLocation {
    * that there are scattered inconsistencies between the Wills and CVM vs30
    * values (e.g. LAPD) Sites beginning with lowercase s have been capitalized.
    *
-   * CVM vs30 values for [S603, S684], [S474, S476], [S644, S646], and [S688,
-   * S689] are identical; waiting on reponse from Callahan or Milner.
-   *
    * Site S603 is repeated (and commented out) in Inland Empire group.
    */
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/site/NshmpSite.java b/src/main/java/gov/usgs/earthquake/nshmp/site/NshmpSite.java
index f8754e83931d8719cb5729a027a7899c69ca75fb..21ef1cd42b72ed2243ae3623d23b1e29c878f496 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/site/NshmpSite.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/site/NshmpSite.java
@@ -20,10 +20,6 @@ import gov.usgs.earthquake.nshmp.internal.UsRegion;
  */
 public enum NshmpSite implements NamedLocation {
 
-  // TODO move this and other nshmp specific classes to nshmp-haz
-  // TODO update output files which should also be part of nshmp-haz
-  // TODO do we need ATC sites?
-
   /* Northern CA (16) */
   BIG_SUR_CA(-121.75, 36.25),
   COALINGA_CA(-120.40, 36.15),
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/site/NshmpSiteFiles.java b/src/main/java/gov/usgs/earthquake/nshmp/site/NshmpSiteFiles.java
index 5d1022116e4f4160f5cb1f90c541cce3b5695338..07badfde449502d54134a1b13b49c34cb3bb004d 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/site/NshmpSiteFiles.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/site/NshmpSiteFiles.java
@@ -56,7 +56,7 @@ import gov.usgs.earthquake.nshmp.geo.json.Properties.Style;
  */
 final class NshmpSiteFiles {
 
-  // TODO consider removing this to nshm-model-dev
+  // Consider removing this to nshm-model-dev
   // keeping the outputs in nshmp-haz
 
   /*
@@ -82,7 +82,7 @@ final class NshmpSiteFiles {
 
   /*
    * Currently, we're exporting map regions as polygons. Although the GeoJSON
-   * spec supports polygons with holes (and hence 3-dimensional arrays, we only
+   * spec supports polygons with holes (and hence 3-dimensional arrays), we only
    * support singular polygons. Polygons render better than PointStrings in any
    * event.
    */
@@ -185,19 +185,24 @@ final class NshmpSiteFiles {
 
   static void writeNshmpSummaryPoly() throws IOException {
     Set<NshmpPolygon> polys = EnumSet.range(LA_BASIN, UCERF3_NSHM14);
+
+    List<String> nameList = polys.stream()
+        .map(Functions.toStringFunction())
+        .collect(Collectors.toList());
+
+    List<LocationList> coordList = polys.stream()
+        .map(new Function<NshmpPolygon, LocationList>() {
+          @Override
+          public LocationList apply(NshmpPolygon poly) {
+            return poly.coordinates();
+          }
+        }::apply)
+        .collect(Collectors.toList());
+
     writePolysJson(
         EXPORT_DIR.resolve("map-nshmp-all.geojson"),
-        polys.stream()
-            .map(Functions.toStringFunction())
-            .collect(Collectors.toList()),
-        polys.stream()
-            .map(new Function<NshmpPolygon, LocationList>() {
-              @Override
-              public LocationList apply(NshmpPolygon poly) {
-                return poly.coordinates();
-              }
-            }::apply)
-            .collect(Collectors.toList()));
+        nameList,
+        coordList);
   }
 
   static void writePolysJson(
@@ -210,7 +215,6 @@ final class NshmpSiteFiles {
         .put("spacing", 0.1);
 
     int i = 0;
-    // TODO this incrementer is messed up
     // can't name and coords come as a map?
     for (LocationList border : coordList) {
       props.put(Style.TITLE, nameList.get(i++));
@@ -395,7 +399,6 @@ final class NshmpSiteFiles {
         .put(Style.MARKER_SIZE, "small");
 
     for (NamedLocation loc : sites) {
-      // TODO test loc vs loc.toString()
       b.add(Feature.point(loc.location())
           .properties(props
               .put(Style.TITLE, loc.toString())
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
index 3e3b7425d8474fe6e6d111083ad8b550da182080..49392833d421739bf6c70c3e50dacb640477e869 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
@@ -64,7 +64,6 @@ public class ServletUtil {
   private static HazardModel HAZARD_MODEL;
 
   static {
-    /* TODO modified for disagg-epsilon branch; should be context var */
     THREAD_COUNT = getRuntime().availableProcessors();
     CALC_EXECUTOR = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(THREAD_COUNT));
     TASK_EXECUTOR = Executors.newSingleThreadExecutor();
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 c5c278ee2d53ed744cb999c07d06413dd0c52897..5f767a08df45b20e4ece904d9edc81ef114caddc 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
@@ -162,7 +162,7 @@ public final class HazardService {
 
     Metadata(HazardModel model) {
       this.model = new SourceModel(model);
-      // TODO need min max from model
+      // should get min max from model
       longitude = new DoubleParameter(
           "Longitude",
           "°",
@@ -252,7 +252,7 @@ public final class HazardService {
       }
 
       Builder hazard(Hazard hazard) {
-        // TODO necessary??
+        // necessary??
         checkState(totalMap == null, "Hazard has already been added to this builder");
 
         componentMaps = new EnumMap<>(Imt.class);
@@ -347,7 +347,7 @@ public final class HazardService {
      * If entire curve is <1e-4, this method will return a curve consisting of
      * just the first point in the supplied curve.
      *
-     * TODO We probably want to move the TRUNCATION_LIMIT out to a config.
+     * Consider moving to config.
      */
 
     double[] yValues = curve.yValues().toArray();
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/meta/Metadata.java b/src/main/java/gov/usgs/earthquake/nshmp/www/meta/Metadata.java
index 84227bdce0090294ed736dc7c52b3ecb55bd7e90..0f2d40b1d6eeb39cd7d7de5d222542b0ef49f266 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/meta/Metadata.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/meta/Metadata.java
@@ -35,23 +35,11 @@ public final class Metadata {
 
   public static class DefaultParameters {
 
-    // final EnumParameter<Edition> edition;
-    // final EnumParameter<Region> region;
     final DoubleParameter longitude;
     final DoubleParameter latitude;
 
     public DefaultParameters() {
 
-      // edition = new EnumParameter<>(
-      // "Model edition",
-      // ParamType.STRING,
-      // EnumSet.allOf(Edition.class));
-      //
-      // region = new EnumParameter<>(
-      // "Model region",
-      // ParamType.STRING,
-      // EnumSet.allOf(Region.class));
-
       longitude = new DoubleParameter(
           "Longitude",
           "°",
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateService.java
index d4b81df814966cef2ba072dfbd42062d40f68b5b..c0bcb47fd4159c8b8171dabbff526ef1f4c37d7b 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateService.java
@@ -139,11 +139,9 @@ public final class RateService {
      * probability service has been called.
      */
 
-    // for (var model : ServletUtil.hazardModels()) {
     var model = ServletUtil.model();
     var rate = process(service, model, site, data.distance, data.timespan);
     futureRates.add(rate);
-    // }
 
     var rates = futureRates.stream()
         .map((future) -> {
@@ -311,8 +309,8 @@ public final class RateService {
   }
 
   /*
-   * TODO would rather use this a general container for mfds and hazard curves.
-   * See HazardService.Curve
+   * Would rather use this a general container for mfds and hazard curves. See
+   * HazardService.Curve
    */
   private static class Sequence {
     final String component;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceServices.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceServices.java
index b473fd92f80d3cc808aa1419511dfa247b729d2e..03704247e5c02916c38503d6303c4516a67b2c63 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceServices.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceServices.java
@@ -70,47 +70,21 @@ public class SourceServices {
   }
 
   /*
-   * TODO service metadata should be in same package as services (why
+   * task... service metadata should be in same package as services (why
    * ResponseData is currently public); rename meta package to
    */
   public static class ResponseData {
     final String description;
     final Object server;
-    // final Parameters parameters;
 
     public ResponseData() {
       this.description = "Installed source model listing";
       this.server = ServletUtil.serverData(
           ServletUtil.THREAD_COUNT,
           Stopwatch.createStarted());
-      // this.parameters = new Parameters();
     }
   }
 
-  // static class Parameters {
-  // List<SourceModel> models;
-  // DoubleParameter returnPeriod;
-  // DoubleParameter vs30;
-  //
-  // Parameters() {
-  // models = ServletUtil.hazardModels().stream()
-  // .map(SourceModel::new)
-  // .collect(Collectors.toList());
-  //
-  // returnPeriod = new DoubleParameter(
-  // "Return period",
-  // "years",
-  // 100.0,
-  // 1e6);
-  //
-  // vs30 = new DoubleParameter(
-  // "Vs30",
-  // "m/s",
-  // 150,
-  // 1500);
-  // }
-  // }
-
   public static class SourceModel {
     String name;
     Set<Gmm> gmms;
@@ -129,12 +103,6 @@ public class SourceServices {
           .map(imt -> new Parameter(ServletUtil.imtShortLabel(imt), imt.name()))
           .collect(toList());
     }
-
-    // public static List<SourceModel> getList() {
-    // return ServletUtil.hazardModels().stream()
-    // .map(SourceModel::new)
-    // .collect(Collectors.toList());
-    // }
   }
 
   enum Attributes {
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/programs/HazardCurveTest.java b/src/test/java/gov/usgs/earthquake/nshmp/programs/HazardCurveTest.java
deleted file mode 100644
index 8ffeefca020c785ec60bcc40a02c1ff11e12e95e..0000000000000000000000000000000000000000
--- a/src/test/java/gov/usgs/earthquake/nshmp/programs/HazardCurveTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package gov.usgs.earthquake.nshmp.programs;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-public class HazardCurveTest {
-
-  @BeforeEach
-  public void setUpBeforeClass() throws Exception {}
-
-  @Test
-  public final void testRun() {
-    // String[] args = new String[] {};
-    // String status = HazardCalc.run(args);
-    // assertEquals(HazardCalc.USAGE.substring(0,18), status.substring(0,18));
-  }
-
-}