diff --git a/src/aashto/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceGroundMotions.java b/src/aashto/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceGroundMotions.java
index 9792bd361dbef44b89d0a40c1544533d93b8d029..42d3e4a2e707994878ac8b2ee09780d06113c388 100644
--- a/src/aashto/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceGroundMotions.java
+++ b/src/aashto/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceGroundMotions.java
@@ -53,6 +53,11 @@ public class NetcdfServiceGroundMotions extends NetcdfService {
     return SERVICE_NAME;
   }
 
+  @Override
+  SourceModel getSourceModel() {
+    return new SourceModel();
+  }
+
   @Override
   NetcdfGroundMotions netcdf() {
     return (NetcdfGroundMotions) netcdf;
diff --git a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceHazardCurves.java b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceHazardCurves.java
index 1077ff6bd74cda602647bec0655e21de2a127317..fb78a99665f0bd5eeef9c2fdf01e44dba7dd35f0 100644
--- a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceHazardCurves.java
+++ b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceHazardCurves.java
@@ -51,6 +51,11 @@ public class NetcdfServiceHazardCurves extends NetcdfService {
     return SERVICE_NAME;
   }
 
+  @Override
+  SourceModel getSourceModel() {
+    return new HazardSourceModel();
+  }
+
   @Override
   NetcdfHazardCurves netcdf() {
     return (NetcdfHazardCurves) netcdf;
@@ -91,19 +96,38 @@ public class NetcdfServiceHazardCurves extends NetcdfService {
         .build();
   }
 
+  ResponseBody<RequestDataSiteClass, ResponseData<ResponseMetadata>> processCurvesImt(
+      RequestDataImt request,
+      String url) {
+    WsUtils.checkValue(Key.LATITUDE, request.latitude);
+    WsUtils.checkValue(Key.LONGITUDE, request.longitude);
+    WsUtils.checkValue(Key.SITE_CLASS, request.siteClass);
+    WsUtils.checkValue(Key.IMT, request.imt);
+    var curves = netcdf().staticData(request.site, request.siteClass);
+
+    return ResponseBody.<RequestDataSiteClass, ResponseData<ResponseMetadata>> usage()
+        .name(SERVICE_NAME)
+        .request(request)
+        .response(toResponseData(request, curves.get(request.imt)))
+        .url(url)
+        .build();
+  }
+
   @Override
   ResponseBody<?, ?> processRequest(HttpRequest<?> httpRequest, Query query, Service service) {
     var site = Location.create(query.longitude, query.latitude);
-    var requestData = new RequestData(site);
     var url = httpRequest.getUri().toString();
 
     switch (service) {
       case CURVES:
+        var requestData = new RequestData(site);
         return processCurves(requestData, url);
       case CURVES_BY_SITE_CLASS:
-        requestData = new RequestDataSiteClass(site, query.siteClass);
-        return processCurvesSiteClass(
-            (RequestDataSiteClass) requestData, url);
+        var requestDataSiteClass = new RequestDataSiteClass(site, query.siteClass);
+        return processCurvesSiteClass(requestDataSiteClass, url);
+      case CURVES_BY_IMT:
+        var requestDataImt = new RequestDataImt(site, query.siteClass, query.imt);
+        return processCurvesImt(requestDataImt, url);
       default:
         throw new RuntimeException("Netcdf service [" + service + "] not found");
     }
@@ -114,7 +138,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService {
       StaticDataHazardCurves curves) {
     return curves.entrySet().stream()
         .map((entry) -> {
-          return toResponseData(request, entry.getKey(), entry.getValue());
+          return toResponseData(request, entry.getValue());
         })
         .collect(Collectors.toList());
   }
@@ -132,10 +156,18 @@ public class NetcdfServiceHazardCurves extends NetcdfService {
 
   ResponseData<ResponseMetadata> toResponseData(
       RequestDataSiteClass request,
-      Imt imt,
       XySequence curves) {
     var metadata =
         new ResponseMetadata(X_LABEL, Y_LABEL);
     return new ResponseData<>(metadata, curves);
   }
+
+  class HazardSourceModel extends SourceModel {
+    public final List<Imt> imts;
+
+    HazardSourceModel() {
+      super();
+      imts = netcdf().netcdfData().imts().stream().sorted().collect(Collectors.toList());
+    }
+  }
 }