diff --git a/build.gradle b/build.gradle
index e009577ecc9d9e47cd761b22633b60c7958af60a..2fe8d6996ec15dc0e53f8623cdb8564904a97110 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ plugins {
   id "com.github.spotbugs" version "${spotbugsVersion}"
   id "com.star-zero.gradle.githook" version "${githooksVersion}"
   id "eclipse-wtp"
-  id "io.micronaut.application" version "${mnPluginVersion}"
+  id "io.micronaut.application" version "${micronautPluginVersion}"
   id "jacoco"
   id "java-library"
   id "maven-publish"
diff --git a/gradle.properties b/gradle.properties
index c5446ed9948bb34cf4815c454c555963bdd6cb25..3c69fd6929fbc7f8269aa9a5991a95dcd861cfdc 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -2,14 +2,15 @@ githooksVersion = 1.2.0
 jacksonVersion = 2.9.0
 junitVersion = 5.8.2
 logbackVersion = 1.2.3
-micronautVersion = 2.4.1
-mnPluginVersion = 1.4.2
+micronautVersion = 3.2.3
+micronautRxVersion = 2.1.1
+micronautPluginVersion = 3.1.1
 nodePluginVersion = 3.0.1
 nodeVersion = 16.3.0
 nshmFaultSectionsTag = v0.1
 nshmpLibVersion = 0.8.2
 nshmpWsUtilsVersion = 0.1.3
-shadowVersion = 7.1.1
+shadowVersion = 7.1.2
 spotbugsVersion = 4.7.0
 spotlessVersion = 6.0.4
 swaggerVersion = 2.1.7
diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle
index 229e84aeb545bed6a0fac78e31eb9e5bc5bc3568..9a0dcbeee1aced74f7411e6d7d33bbc22023bfe1 100644
--- a/gradle/dependencies.gradle
+++ b/gradle/dependencies.gradle
@@ -15,11 +15,13 @@ dependencies {
   implementation "io.micronaut:micronaut-runtime"
   implementation "io.micronaut:micronaut-http-server-netty"
   implementation "io.micronaut:micronaut-runtime-osx"
+  implementation "io.projectreactor:reactor-core"
+  implementation "io.micronaut.rxjava3:micronaut-rxjava3:${micronautRxVersion}"
   implementation "com.fasterxml.jackson.module:jackson-module-parameter-names:${jacksonVersion}"
   runtimeOnly "ch.qos.logback:logback-classic"
 
   // Swagger
-  annotationProcessor("io.micronaut.configuration:micronaut-openapi")
+  annotationProcessor("io.micronaut.openapi:micronaut-openapi")
   implementation("io.swagger.core.v3:swagger-annotations")
 
   // junit
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/BasinController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/BasinController.java
index 9ad2e480e07d318b95ea0270cd6f9d90f6e56646..a49e08b9865455e29340d6c36710be4894826cc6 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/BasinController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/BasinController.java
@@ -1,6 +1,6 @@
 package gov.usgs.earthquake.nshmp.www;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import gov.usgs.earthquake.nshmp.www.basin.Basin;
 import gov.usgs.earthquake.nshmp.www.basin.Basins;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/FaultSectionsController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/FaultSectionsController.java
index aaf7c5015e83a0025cd9598766039c265cb71402..fe78389bc35a1dd12bafaf6defa88320131e6b8a 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/FaultSectionsController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/FaultSectionsController.java
@@ -3,7 +3,7 @@ package gov.usgs.earthquake.nshmp.www;
 import java.nio.file.Path;
 import java.util.List;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import gov.usgs.earthquake.nshmp.www.fault.NshmFaultSection;
 import gov.usgs.earthquake.nshmp.www.services.FaultSectionsService;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/GmmController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/GmmController.java
index 68dcda72cb648fbc69c21f28abfb4cb071047e92..b662f6ffd57919f6ca460a9f9494bffb03484dbd 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/GmmController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/GmmController.java
@@ -2,7 +2,7 @@ package gov.usgs.earthquake.nshmp.www;
 
 import java.util.Set;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import gov.usgs.earthquake.nshmp.gmm.Gmm;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/GpsController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/GpsController.java
index d2141e82cd4ee9225f18cfab468017e3513e2c13..2aa5b042f1439c51fbe21aba9ed6058668a539ae 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/GpsController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/GpsController.java
@@ -1,6 +1,6 @@
 package gov.usgs.earthquake.nshmp.www;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import gov.usgs.earthquake.nshmp.www.gps.GpsDataSet;
 import gov.usgs.earthquake.nshmp.www.services.GpsService;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/GulfController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/GulfController.java
index a3211792e302aa608eaf5f2486bb00adaab92acd..8d1bd93a9f6d4611952f85185d38ab119cd1b3f6 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/GulfController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/GulfController.java
@@ -1,6 +1,6 @@
 package gov.usgs.earthquake.nshmp.www;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import gov.usgs.earthquake.nshmp.www.services.GulfService;
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java
index 894e2f048e05968dfd79d5584c959c02e6daad42..5df610d684ed91e9296ac0c363356f920aaafb59 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java
@@ -3,7 +3,7 @@ package gov.usgs.earthquake.nshmp.www;
 import java.nio.charset.StandardCharsets;
 import java.util.stream.Collectors;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import com.google.common.io.Resources;
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/UtilitiesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/UtilitiesController.java
index 5347de4b1e9b49d86409fdd0718a82aabd386bbe..f37202346fc69381d98a72f041056a8e249b675e 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/UtilitiesController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/UtilitiesController.java
@@ -1,6 +1,6 @@
 package gov.usgs.earthquake.nshmp.www;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import gov.usgs.earthquake.nshmp.www.services.UtilitiesService;
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/basin/Basin.java b/src/main/java/gov/usgs/earthquake/nshmp/www/basin/Basin.java
index 422e3a9513ae029eb1281fa14d1b39d59ca3b1b1..7147e5763f718a9cd975cfa593535cbf1db1a7b1 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/basin/Basin.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/basin/Basin.java
@@ -5,11 +5,14 @@ import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE;
 
 import java.util.Arrays;
 
+import io.micronaut.core.annotation.Introspected;
+
 /**
  * Basin ids corresponding to file name in data directory.
  *
  * @author U.S. Geological Survey
  */
+@Introspected
 public enum Basin {
 
   BAY_AREA("Bay Area"),
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/fault/NshmFaultSection.java b/src/main/java/gov/usgs/earthquake/nshmp/www/fault/NshmFaultSection.java
index 90cf2f11daa328e349daf546f8465189da3e0723..8c09da87b49788d21981c88bded80db5dbaf128c 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/fault/NshmFaultSection.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/fault/NshmFaultSection.java
@@ -1,5 +1,8 @@
 package gov.usgs.earthquake.nshmp.www.fault;
 
+import io.micronaut.core.annotation.Introspected;
+
+@Introspected
 public enum NshmFaultSection {
 
   // CONUS_2008(
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/gps/GpsDataSet.java b/src/main/java/gov/usgs/earthquake/nshmp/www/gps/GpsDataSet.java
index 45d583e0ae83c72cf4e6f63a8080dcbc6ec49c3f..43971a3831a6930b1d9390e5d3f94b3695e293e1 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/gps/GpsDataSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/gps/GpsDataSet.java
@@ -5,10 +5,13 @@ import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE;
 
 import java.util.Arrays;
 
+import io.micronaut.core.annotation.Introspected;
+
 /**
  *
  * @author U.S. Geological Survey
  */
+@Introspected
 public enum GpsDataSet {
 
   AK_2020(
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/BasinService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/BasinService.java
index 84ed203475b88fb907f9e2967843ddc5d498af5c..8e122141da5218c443c772f66306ea5b9e923384 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/BasinService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/BasinService.java
@@ -5,7 +5,7 @@ import static gov.usgs.earthquake.nshmp.www.WsUtils.checkValue;
 
 import java.util.EnumSet;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import com.google.gson.JsonElement;
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/FaultSectionsService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/FaultSectionsService.java
index 28ef77c059236349c7de7705a6d76270650a1486..6deec7d3c3c039e0391d503ce42122f193fae807 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/FaultSectionsService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/FaultSectionsService.java
@@ -12,7 +12,7 @@ import java.util.TreeSet;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import com.google.common.base.Enums;
 import com.google.common.collect.Lists;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmDistanceService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmDistanceService.java
index 1dafae0118477ec941de06cb6755e0c7345b26fb..eeceb9198c58ffcdce89ea00795b141d3b5dacbd 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmDistanceService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmDistanceService.java
@@ -2,7 +2,7 @@ package gov.usgs.earthquake.nshmp.www.services;
 
 import java.util.Set;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import com.google.common.collect.Range;
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmMagnitudeService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmMagnitudeService.java
index 5aff3974fcb3aaeae8691c053763f450f6d7e465..783ba4679db133286be69e206e0272e5cb75cc14 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmMagnitudeService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmMagnitudeService.java
@@ -2,7 +2,7 @@ package gov.usgs.earthquake.nshmp.www.services;
 
 import java.util.Set;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import com.google.common.collect.Range;
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmService.java
index 072cdf681085e7811fd8b209adf45f0abd58c24e..a8818d4127fc5859fe0842a699d52b3ccc6b1f2a 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmService.java
@@ -8,7 +8,7 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.stream.Collectors;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmSpectraService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmSpectraService.java
index d2eab7db56a56a105344ee0230ab3a2955b9e4c6..0d024d2c89bea4c6492ad1e93f8e0540d650567e 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmSpectraService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GmmSpectraService.java
@@ -6,7 +6,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import gov.usgs.earthquake.nshmp.data.DelimitedData;
 import gov.usgs.earthquake.nshmp.gmm.Gmm;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GpsService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GpsService.java
index 7378576536bc602722fca992632ae57747807239..59378d74894deedc4c6c8df945b26e831fc15d18 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GpsService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GpsService.java
@@ -5,7 +5,7 @@ import static gov.usgs.earthquake.nshmp.www.WsUtils.checkValue;
 
 import java.util.EnumSet;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import gov.usgs.earthquake.nshmp.www.Response;
 import gov.usgs.earthquake.nshmp.www.Utils;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GulfService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GulfService.java
index bf4044f42db27fb50aa09fab6ffbb71abf78d790..8d3482adaae71d1a01f708eb4c319fcdf4ca64ad 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/GulfService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/GulfService.java
@@ -3,7 +3,7 @@ package gov.usgs.earthquake.nshmp.www.services;
 import static gov.usgs.earthquake.nshmp.www.Utils.GSON;
 import static gov.usgs.earthquake.nshmp.www.WsUtils.checkValue;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import com.google.gson.JsonElement;
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/UtilitiesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/UtilitiesService.java
index 5dba3148fcf88bef987a86d7e2bf3ed884dcb1d0..7384c97a420cfa9b7887b843be465b8807d03910 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/UtilitiesService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/UtilitiesService.java
@@ -13,7 +13,7 @@ import java.util.EnumSet;
 import java.util.Map;
 import java.util.TreeMap;
 
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
 
 import gov.usgs.earthquake.nshmp.geo.json.Feature;
 import gov.usgs.earthquake.nshmp.geo.json.GeoJson;
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/BasinTermControllerTests.java b/src/test/java/gov/usgs/earthquake/nshmp/www/BasinTermControllerTests.java
index 87f64e93eb7671b3f0dd7ee7a248ec21fd028964..f28b5831ef39a37b42169562f0ea7f3e73eee436 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/BasinTermControllerTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/BasinTermControllerTests.java
@@ -10,7 +10,7 @@ import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.OptionalDouble;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -39,7 +39,7 @@ import gov.usgs.earthquake.nshmp.www.services.BasinService.RequestData;
 import gov.usgs.earthquake.nshmp.www.services.BasinService.RequestDataBasin;
 
 import io.micronaut.http.HttpRequest;
-import io.micronaut.test.annotation.MicronautTest;
+import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
 
 @MicronautTest
 @SuppressWarnings("serial")
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/FaultSectionsControllerTests.java b/src/test/java/gov/usgs/earthquake/nshmp/www/FaultSectionsControllerTests.java
index 9ab65af52e052e0caa04715a56e6825ff924487b..f9ef32e343db08007840f05696ea3b3b7ba11057 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/FaultSectionsControllerTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/FaultSectionsControllerTests.java
@@ -12,7 +12,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -37,7 +37,7 @@ import gov.usgs.earthquake.nshmp.www.services.FaultSectionsService.GroupData;
 import gov.usgs.earthquake.nshmp.www.services.FaultSectionsService.RequestData;
 
 import io.micronaut.http.HttpRequest;
-import io.micronaut.test.annotation.MicronautTest;
+import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
 
 @MicronautTest
 @SuppressWarnings("serial")
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/GpsControllerTests.java b/src/test/java/gov/usgs/earthquake/nshmp/www/GpsControllerTests.java
index 81d3ccf41709729fb0446dd956db191a4ef527db..f7797b900a72c48597dc1014423a8e6e494fe2c5 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/GpsControllerTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/GpsControllerTests.java
@@ -8,7 +8,7 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.lang.reflect.Type;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
@@ -28,7 +28,7 @@ import gov.usgs.earthquake.nshmp.www.services.GpsService;
 import gov.usgs.earthquake.nshmp.www.services.GpsService.GpsFormat;
 
 import io.micronaut.http.HttpRequest;
-import io.micronaut.test.annotation.MicronautTest;
+import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
 
 @MicronautTest
 class GpsControllerTests {
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/GulfControllerTests.java b/src/test/java/gov/usgs/earthquake/nshmp/www/GulfControllerTests.java
index 5eff45dedfc1d3373f22c3f626750746a6a1c010..d4ede947d217c28e5a29db2e70124828c35e6f6b 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/GulfControllerTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/GulfControllerTests.java
@@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.lang.reflect.Type;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -24,7 +24,7 @@ import gov.usgs.earthquake.nshmp.www.meta.Status;
 import gov.usgs.earthquake.nshmp.www.services.BasinService.RequestData;
 
 import io.micronaut.http.HttpRequest;
-import io.micronaut.test.annotation.MicronautTest;
+import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
 
 @MicronautTest
 class GulfControllerTests {