diff --git a/gradle.properties b/gradle.properties
index e2120f61b38b69c70328cfeb70acf8c1dc1877be..a2ff82549b5e74a535d881e4d110c7a1df52b931 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.8.2
+nshmpLibVersion = 0.8.3
 nshmpWsUtilsVersion = 0.1.7
 shadowVersion = 7.1.2
 spotbugsVersion = 4.7.0
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 fd844d51d73793c66972b6e11cc5d9e989d01b89..1120be8504341bf5e2b843fb4b3615f2f9216869 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
@@ -98,26 +98,6 @@ public final class Metadata {
     }
   }
 
-  public static String busyMessage(String url, long hits, long misses) {
-    Busy busy = new Busy(url, hits, misses);
-    return ServletUtil.GSON.toJson(busy);
-  }
-
-  static final String BUSY_MESSAGE = "Server busy. Please try again later. " +
-      "We apologize for any inconvenience while we increase capacity.";
-
-  private static class Busy {
-
-    final String status = Status.BUSY.toString();
-    final String request;
-    final String message;
-
-    private Busy(String request, long hits, long misses) {
-      this.request = request;
-      this.message = BUSY_MESSAGE + String.format(" (%s,%s)", hits, misses);
-    }
-  }
-
   public static String errorMessage(String url, Throwable e, boolean trace) {
     Error error = new Error(url, e, trace);
     return ServletUtil.GSON.toJson(error);
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/HazardService.java
index 32468d63800dcfd4989430a8b607ecfa65e62ef3..8872903e36e4df73959c6e78622eaa0ecf56b210 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/HazardService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/HazardService.java
@@ -24,16 +24,14 @@ import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.model.HazardModel;
 import gov.usgs.earthquake.nshmp.model.SourceType;
 import gov.usgs.earthquake.nshmp.www.HazardController;
-import gov.usgs.earthquake.nshmp.www.Response;
+import gov.usgs.earthquake.nshmp.www.ResponseBody;
 import gov.usgs.earthquake.nshmp.www.WsUtils;
 import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter;
 import gov.usgs.earthquake.nshmp.www.meta.Metadata;
 import gov.usgs.earthquake.nshmp.www.meta.Parameter;
-import gov.usgs.earthquake.nshmp.www.meta.Status;
 import gov.usgs.earthquake.nshmp.www.services.ServicesUtil.ServiceQueryData;
 import gov.usgs.earthquake.nshmp.www.services.ServicesUtil.ServiceRequestData;
 import gov.usgs.earthquake.nshmp.www.services.SourceServices.SourceModel;
-
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.HttpResponse;
 import jakarta.inject.Singleton;
@@ -53,8 +51,13 @@ public final class HazardService {
   public static HttpResponse<String> handleDoGetMetadata(HttpRequest<?> request) {
     var url = request.getUri().getPath();
     try {
-      var usage = new RequestMetadata(ServletUtil.model());// SourceServices.ResponseData();
-      var response = new Response<>(Status.USAGE, NAME, url, usage, url);
+      var usage = new RequestMetadata(ServletUtil.model());
+      var response = ResponseBody.usage()
+          .name(NAME)
+          .url(url)
+          .request(url)
+          .response(usage)
+          .build();
       var svcResponse = ServletUtil.GSON.toJson(response);
       return HttpResponse.ok(svcResponse);
     } catch (Exception e) {
@@ -82,7 +85,7 @@ public final class HazardService {
     }
   }
 
-  static Response<RequestData, ResponseData> process(
+  static ResponseBody<RequestData, ResponseData> process(
       HttpRequest<?> request,
       RequestData data)
       throws InterruptedException, ExecutionException {
@@ -322,7 +325,7 @@ public final class HazardService {
       return this;
     }
 
-    Response<RequestData, ResponseData> build() {
+    ResponseBody<RequestData, ResponseData> build() {
       var hazards = new ArrayList<HazardResponse>();
 
       for (Imt imt : totalMap.keySet()) {
@@ -347,7 +350,12 @@ public final class HazardService {
       Object server = Metadata.serverData(ServletUtil.THREAD_COUNT, timer);
       var response = new ResponseData(new ResponseMetadata(server), List.copyOf(hazards));
 
-      return new Response<>(Status.SUCCESS, NAME, request, response, url);
+      return ResponseBody.<RequestData, ResponseData> success()
+          .name(NAME)
+          .url(url)
+          .request(request)
+          .response(response)
+          .build();
     }
   }
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/HazardService2.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/HazardService2.java
index 3e58e39dd09e3a90e60e10be299ba559e66e3d04..9dddf3208e031fff1d0a4ad448e4a43efd99fb6c 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/HazardService2.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/HazardService2.java
@@ -24,15 +24,13 @@ import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.model.HazardModel;
 import gov.usgs.earthquake.nshmp.model.SourceType;
 import gov.usgs.earthquake.nshmp.www.HazardController;
-import gov.usgs.earthquake.nshmp.www.Response;
+import gov.usgs.earthquake.nshmp.www.ResponseBody;
 import gov.usgs.earthquake.nshmp.www.WsUtils;
 import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter;
 import gov.usgs.earthquake.nshmp.www.meta.Metadata;
 import gov.usgs.earthquake.nshmp.www.meta.Parameter;
-import gov.usgs.earthquake.nshmp.www.meta.Status;
 import gov.usgs.earthquake.nshmp.www.services.ServicesUtil.ServiceQueryData;
 import gov.usgs.earthquake.nshmp.www.services.SourceServices.SourceModel;
-
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.HttpResponse;
 import jakarta.inject.Singleton;
@@ -53,7 +51,12 @@ public final class HazardService2 {
     var url = request.getUri().getPath();
     try {
       var usage = new RequestMetadata(ServletUtil.model());// SourceServices.ResponseData();
-      var response = new Response(Status.USAGE, NAME, url, usage, url);
+      var response = ResponseBody.usage()
+          .name(NAME)
+          .url(url)
+          .request(url)
+          .response(usage)
+          .build();
       var svcResponse = ServletUtil.GSON.toJson(response);
       return HttpResponse.ok(svcResponse);
     } catch (Exception e) {
@@ -75,7 +78,7 @@ public final class HazardService2 {
 
       // var data = new RequestData(query);
 
-      Response<RequestData, ResponseData> response = process(request, args);
+      ResponseBody<RequestData, ResponseData> response = process(request, args);
       String svcResponse = ServletUtil.GSON.toJson(response);
       return HttpResponse.ok(svcResponse);
 
@@ -84,7 +87,7 @@ public final class HazardService2 {
     }
   }
 
-  static Response<RequestData, ResponseData> process(
+  static ResponseBody<RequestData, ResponseData> process(
       HttpRequest<?> request,
       RequestData data) throws InterruptedException, ExecutionException {
 
@@ -323,7 +326,7 @@ public final class HazardService2 {
       return this;
     }
 
-    Response<RequestData, ResponseData> build() {
+    ResponseBody<RequestData, ResponseData> build() {
       var hazards = new ArrayList<HazardResponse>();
 
       for (Imt imt : totalMap.keySet()) {
@@ -348,7 +351,12 @@ public final class HazardService2 {
       Object server = Metadata.serverData(ServletUtil.THREAD_COUNT, timer);
       var response = new ResponseData(new ResponseMetadata(server), List.copyOf(hazards));
 
-      return new Response<>(Status.SUCCESS, NAME, request, response, url);
+      return ResponseBody.<RequestData, ResponseData> success()
+          .name(NAME)
+          .url(url)
+          .request(request)
+          .response(response)
+          .build();
     }
   }
 
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 e0772386ad74e3ec67898e042a095f92423431d7..84024d73e523bb683776adaf9a31c9cd41ba8db3 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
@@ -16,16 +16,14 @@ import gov.usgs.earthquake.nshmp.calc.Site;
 import gov.usgs.earthquake.nshmp.geo.Location;
 import gov.usgs.earthquake.nshmp.model.HazardModel;
 import gov.usgs.earthquake.nshmp.www.RateController;
-import gov.usgs.earthquake.nshmp.www.Response;
+import gov.usgs.earthquake.nshmp.www.ResponseBody;
 import gov.usgs.earthquake.nshmp.www.WsUtils;
 import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter;
 import gov.usgs.earthquake.nshmp.www.meta.Metadata;
 import gov.usgs.earthquake.nshmp.www.meta.Metadata.DefaultParameters;
-import gov.usgs.earthquake.nshmp.www.meta.Status;
 import gov.usgs.earthquake.nshmp.www.services.ServicesUtil.Key;
 import gov.usgs.earthquake.nshmp.www.services.ServicesUtil.ServiceQueryData;
 import gov.usgs.earthquake.nshmp.www.services.ServicesUtil.ServiceRequestData;
-
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.HttpResponse;
 import jakarta.inject.Singleton;
@@ -60,8 +58,8 @@ public final class RateService {
   public static HttpResponse<String> handleDoGetUsage(HttpRequest<?> request, Service service) {
     try {
       var response = metadata(request, service);
-      var svcResponse = ServletUtil.GSON.toJson(response);
-      return HttpResponse.ok(svcResponse);
+      var json = ServletUtil.GSON.toJson(response);
+      return HttpResponse.ok(json);
     } catch (Exception e) {
       return ServicesUtil.handleError(e, service.name, request.getUri().getPath());
     }
@@ -96,22 +94,26 @@ public final class RateService {
     }
   }
 
-  static Response<String, Usage> metadata(HttpRequest<?> request, Service service) {
+  static ResponseBody<String, Usage> metadata(HttpRequest<?> request, Service service) {
     var parameters = service == Service.RATE ? new RateParameters() : new ProbabilityParameters();
     var usage = new Usage(service, parameters);
     var url = request.getUri().getPath();
-    return new Response<>(Status.USAGE, service.name, url, usage, url);
+    return ResponseBody.<String, Usage> usage()
+        .name(service.name)
+        .url(url)
+        .request(url)
+        .response(usage)
+        .build();
   }
 
-  static Response<RequestData, ResponseData> processRequest(
+  static ResponseBody<RequestData, ResponseData> processRequest(
       HttpRequest<?> request,
       Service service,
       RequestData data) throws InterruptedException, ExecutionException {
     var timer = Stopwatch.createStarted();
     var rates = calc(service, data);
     var responseData = new ResponseData(new ResponseMetadata(service, data), rates, timer);
-    return Response.<RequestData, ResponseData> builder()
-        .success()
+    return ResponseBody.<RequestData, ResponseData> success()
         .name(service.name)
         .request(data)
         .response(responseData)
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/ServicesUtil.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/ServicesUtil.java
index a3e6d6a37efc79187c2629651abfd3abc419bfcb..583b7528d1b5629b000627ea241b78689312a7c5 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/ServicesUtil.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/ServicesUtil.java
@@ -11,10 +11,8 @@ 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.model.HazardModel;
-import gov.usgs.earthquake.nshmp.www.Response;
+import gov.usgs.earthquake.nshmp.www.ResponseBody;
 import gov.usgs.earthquake.nshmp.www.WsUtils;
-import gov.usgs.earthquake.nshmp.www.meta.Status;
-
 import io.micronaut.http.HttpResponse;
 
 public class ServicesUtil {
@@ -24,7 +22,12 @@ public class ServicesUtil {
       String name,
       String url) {
     var msg = e.getMessage() + " (see logs)";
-    var svcResponse = new Response<>(Status.ERROR, name, url, msg, url);
+    var svcResponse = ResponseBody.error()
+        .name(name)
+        .url(url)
+        .request(url)
+        .response(msg)
+        .build();
     var gson = new GsonBuilder().setPrettyPrinting().create();
     var response = gson.toJson(svcResponse);
     e.printStackTrace();
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesService.java
index 823445be91ee7b52663a7445da3d05412b373a4a..638850fcfd9d9988c6e684864c8e457c403f6142 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesService.java
@@ -1,10 +1,8 @@
 package gov.usgs.earthquake.nshmp.www.services;
 
 import gov.usgs.earthquake.nshmp.model.Models;
-import gov.usgs.earthquake.nshmp.www.Response;
+import gov.usgs.earthquake.nshmp.www.ResponseBody;
 import gov.usgs.earthquake.nshmp.www.SourceLogicTreesController;
-import gov.usgs.earthquake.nshmp.www.meta.Status;
-
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.HttpResponse;
 import jakarta.inject.Singleton;
@@ -25,7 +23,12 @@ public class SourceLogicTreesService {
 
     try {
       var trees = Models.trees(ServletUtil.model());
-      var response = new Response<>(Status.SUCCESS, NAME, url, trees, url);
+      var response = ResponseBody.success()
+          .name(NAME)
+          .url(url)
+          .request(url)
+          .response(trees)
+          .build();
       return HttpResponse.ok(ServletUtil.GSON.toJson(response));
     } catch (Exception e) {
       return ServicesUtil.handleError(e, NAME, url);
@@ -39,7 +42,12 @@ public class SourceLogicTreesService {
     try {
       var tree = Models.tree(ServletUtil.model(), id);
       var requestData = new RequestData(id);
-      var response = new Response<>(Status.SUCCESS, NAME, requestData, tree, url);
+      var response = ResponseBody.success()
+          .name(NAME)
+          .url(url)
+          .request(requestData)
+          .response(tree)
+          .build();
       return HttpResponse.ok(ServletUtil.GSON.toJson(response));
     } catch (Exception e) {
       return ServicesUtil.handleError(e, NAME, url);
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 7db7d76b57225955fe04edd5288ee220b1f0d9a6..bc692eb6c7b38bd9b8818785443f77aac106029a 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
@@ -11,11 +11,9 @@ import gov.usgs.earthquake.nshmp.gmm.Gmm;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass;
 import gov.usgs.earthquake.nshmp.model.HazardModel;
-import gov.usgs.earthquake.nshmp.www.Response;
+import gov.usgs.earthquake.nshmp.www.ResponseBody;
 import gov.usgs.earthquake.nshmp.www.WsUtils;
 import gov.usgs.earthquake.nshmp.www.meta.Metadata;
-import gov.usgs.earthquake.nshmp.www.meta.Status;
-
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.HttpResponse;
 import jakarta.inject.Singleton;
@@ -48,10 +46,14 @@ public class SourceServices {
   public static HttpResponse<String> handleDoGetUsage(HttpRequest<?> request) {
     var url = request.getUri().getPath();
     try {
-      var response = new Response<>(
-          Status.USAGE, NAME, url, new ResponseData(), url);
-      var jsonString = GSON.toJson(response);
-      return HttpResponse.ok(jsonString);
+      var response = ResponseBody.usage()
+          .name(NAME)
+          .url(url)
+          .request(url)
+          .response(new ResponseData())
+          .build();
+      var json = GSON.toJson(response);
+      return HttpResponse.ok(json);
     } catch (Exception e) {
       return ServicesUtil.handleError(e, NAME, url);
     }