diff --git a/package-lock.json b/package-lock.json
index dc72624ba1f9b5786382c12356add218736ccc4b..fd03b78e351745759edce1f4fbeb016a832b3d8b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,7 +5,6 @@
   "requires": true,
   "packages": {
     "": {
-      "name": "nshmp-haz",
       "version": "2.0.0",
       "devDependencies": {
         "markdownlint-cli": "^0.31.1",
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/FeaturesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/FeaturesController.java
index 9c854547bc87a29b1bdbf37b61224db198708ce3..3ff3662e707c693096e788e8cc15fc4ac3b6ef53 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/FeaturesController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/FeaturesController.java
@@ -19,8 +19,8 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.inject.Inject;
 
 /**
- * Micronaut web service controller for the GeoJSON features in the current
- * installed model.
+ * Micronaut web service controller for the GeoJSON features in the installed
+ * model.
  *
  * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed
  * model.
@@ -39,6 +39,13 @@ public class FeaturesController {
   @Inject
   private NshmpMicronautServlet servlet;
 
+  /*
+   * Not sure we need metadata for this. Issue #542 describes the various groups
+   * that could be supported. However instead of 'all' one could consider just
+   * having no argument such that the root endpoint path would just return all
+   * features.
+   */
+
   @Operation(
       summary = "Source model logic tree listing",
       description = "Returns the ID's of logic trees in the model",
@@ -50,6 +57,7 @@ public class FeaturesController {
           schema = @Schema(
               implementation = MetadataResponse.class)))
   @Get
+  @Deprecated
   public HttpResponse<String> doGetMetadata(HttpRequest<?> http) {
     try {
       return FeaturesService.getMetadata(http);
@@ -74,6 +82,7 @@ public class FeaturesController {
       content = @Content(
           schema = @Schema(implementation = TreeResponse.class)))
   @Get(uri = "/{id}")
+  @Deprecated
   public HttpResponse<String> doGetTree(HttpRequest<?> http, @PathVariable int id) {
     try {
       return FeaturesService.getTree(http, id);
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/FeaturesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/FeaturesService.java
index 786bafca4b3d0f955e91accaf7b6de3baa88d8ad..f21bf57dea1a34c4f0b406868b12005cdfb6004c 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/FeaturesService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/FeaturesService.java
@@ -26,6 +26,7 @@ public class FeaturesService {
   static final String NAME = "Model Features";
   static final Logger LOG = LoggerFactory.getLogger(FeaturesService.class);
 
+  @Deprecated
   public static HttpResponse<String> getMetadata(HttpRequest<?> request) {
     var url = request.getUri().toString();
     var metadata = new Metadata(ServletUtil.model());
@@ -39,6 +40,7 @@ public class FeaturesService {
     return HttpResponse.ok(ServletUtil.GSON2.toJson(response));
   }
 
+  @Deprecated
   public static HttpResponse<String> getTree(HttpRequest<?> request, Integer id) {
     var url = request.getUri().toString();
     var features = Models.features(ServletUtil.model(), id);
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/LogicTreesController.java
similarity index 52%
rename from src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java
rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/LogicTreesController.java
index 971c66e80bbc529918c3c7b3427bbf83235870ce..6fd72aafedb76bcb97304a5e5f319144cdd9d1f6 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/LogicTreesController.java
@@ -3,8 +3,8 @@ package gov.usgs.earthquake.nshmp.www.source;
 import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
 import gov.usgs.earthquake.nshmp.www.ResponseBody;
 import gov.usgs.earthquake.nshmp.www.ServletUtil;
-import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.Metadata;
-import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.RequestData;
+import gov.usgs.earthquake.nshmp.www.source.LogicTreesService.Metadata;
+import gov.usgs.earthquake.nshmp.www.source.LogicTreesService.RequestData;
 
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.HttpResponse;
@@ -19,8 +19,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.inject.Inject;
 
 /**
- * Micronaut web service controller for the source logic trees in the current
- * installed model.
+ * Micronaut web service controller for the source logic trees in the installed
+ * model. These endpoints return the GeoJSON features and Magnitude frequency
+ * distributions associated with the branches in a source logic tree.
  *
  * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed
  * model.
@@ -31,17 +32,17 @@ import jakarta.inject.Inject;
  * @author U.S. Geological Survey
  */
 @Tag(
-    name = SourceLogicTreesService.NAME,
+    name = LogicTreesService.NAME,
     description = "USGS NSHM source model logic tree service")
 @Controller("/trees")
-public class SourceLogicTreesController {
+public class LogicTreesController {
 
   @Inject
   private NshmpMicronautServlet servlet;
 
   @Operation(
       summary = "Source model logic tree listing",
-      description = "Returns the ID's of logic trees in the model",
+      description = "Returns the IDs of logic trees in the model",
       operationId = "source-tree-metadata")
   @ApiResponse(
       description = "Source logic tree metadata",
@@ -52,11 +53,11 @@ public class SourceLogicTreesController {
   @Get
   public HttpResponse<String> doGetMetadata(HttpRequest<?> http) {
     try {
-      return SourceLogicTreesService.getMetadata(http);
+      return LogicTreesService.getMetadata(http);
     } catch (Exception e) {
       return ServletUtil.error(
-          SourceLogicTreesService.LOG, e,
-          SourceLogicTreesService.NAME,
+          LogicTreesService.LOG, e,
+          LogicTreesService.NAME,
           http.getUri().toString());
     }
   }
@@ -67,20 +68,69 @@ public class SourceLogicTreesController {
   @Operation(
       summary = "Get a source model MFD logic tree",
       description = "Returns the logic tree of MFDs for the supplied ID",
-      operationId = "source-tree-mfds")
+      operationId = "source-tree-mfds-old")
   @ApiResponse(
       description = "NSHM source logic tree",
       responseCode = "200",
       content = @Content(
           schema = @Schema(implementation = TreeResponse.class)))
   @Get(uri = "/{id}")
+  @Deprecated
   public HttpResponse<String> doGetTree(HttpRequest<?> http, @PathVariable int id) {
     try {
-      return SourceLogicTreesService.getTree(http, id);
+      return LogicTreesService.getMfdTree(http, id);
+    } catch (Exception e) {
+      return ServletUtil.error(
+          LogicTreesService.LOG, e,
+          LogicTreesService.NAME,
+          http.getUri().toString());
+    }
+  }
+
+  /**
+   * @param id Source logic tree id
+   */
+  @Operation(
+      summary = "Get a source model feature logic tree",
+      description = "Returns the logic tree of features for the supplied ID",
+      operationId = "source-tree-features")
+  @ApiResponse(
+      description = "NSHM source logic tree",
+      responseCode = "200",
+      content = @Content(
+          schema = @Schema(implementation = TreeResponse.class)))
+  @Get(uri = "/features/{id}")
+  public HttpResponse<String> doGetFeatureTree(HttpRequest<?> http, @PathVariable int id) {
+    try {
+      return LogicTreesService.getFeatureTree(http, id);
+    } catch (Exception e) {
+      return ServletUtil.error(
+          LogicTreesService.LOG, e,
+          LogicTreesService.NAME,
+          http.getUri().toString());
+    }
+  }
+
+  /**
+   * @param id Source logic tree id
+   */
+  @Operation(
+      summary = "Get a source model MFD logic tree",
+      description = "Returns the logic tree of MFDs for the supplied ID",
+      operationId = "source-tree-mfds")
+  @ApiResponse(
+      description = "NSHM source logic tree",
+      responseCode = "200",
+      content = @Content(
+          schema = @Schema(implementation = TreeResponse.class)))
+  @Get(uri = "/mfds/{id}")
+  public HttpResponse<String> doGetMfdTree(HttpRequest<?> http, @PathVariable int id) {
+    try {
+      return LogicTreesService.getMfdTree(http, id);
     } catch (Exception e) {
       return ServletUtil.error(
-          SourceLogicTreesService.LOG, e,
-          SourceLogicTreesService.NAME,
+          LogicTreesService.LOG, e,
+          LogicTreesService.NAME,
           http.getUri().toString());
     }
   }
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/LogicTreesService.java
similarity index 69%
rename from src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java
rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/LogicTreesService.java
index 3f0fe6541bf47166bda144fe12484924935ffe6c..1a679b0d96e9c296492537a2bd64baf5a2283fe3 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/LogicTreesService.java
@@ -16,15 +16,15 @@ import io.micronaut.http.HttpResponse;
 import jakarta.inject.Singleton;
 
 /**
- * Source model tree handler for {@link SourceLogicTreesController}
+ * Source model tree handler for {@link LogicTreesController}
  *
  * @author U.S. Geological Survey
  */
 @Singleton
-public class SourceLogicTreesService {
+public class LogicTreesService {
 
   static final String NAME = "Model Logic Trees";
-  static final Logger LOG = LoggerFactory.getLogger(SourceLogicTreesService.class);
+  static final Logger LOG = LoggerFactory.getLogger(LogicTreesService.class);
 
   public static HttpResponse<String> getMetadata(HttpRequest<?> request) {
     var url = request.getUri().toString();
@@ -39,16 +39,30 @@ public class SourceLogicTreesService {
     return HttpResponse.ok(ServletUtil.GSON2.toJson(response));
   }
 
-  public static HttpResponse<String> getTree(HttpRequest<?> request, Integer id) {
+  public static HttpResponse<String> getFeatureTree(HttpRequest<?> request, Integer id) {
     var url = request.getUri().toString();
-    var tree = Models.tree(ServletUtil.model(), id);
+    var featureTree = Models.features(ServletUtil.model(), id);
     var requestData = new RequestData(id);
     var response = ResponseBody.success()
         .name(NAME)
         .url(url)
         .metadata(new ResponseMetadata(HazVersion.appVersions()))
         .request(requestData)
-        .response(tree)
+        .response(featureTree)
+        .build();
+    return HttpResponse.ok(ServletUtil.GSON2.toJson(response));
+  }
+
+  public static HttpResponse<String> getMfdTree(HttpRequest<?> request, Integer id) {
+    var url = request.getUri().toString();
+    var mfdTree = Models.tree(ServletUtil.model(), id);
+    var requestData = new RequestData(id);
+    var response = ResponseBody.success()
+        .name(NAME)
+        .url(url)
+        .metadata(new ResponseMetadata(HazVersion.appVersions()))
+        .request(requestData)
+        .response(mfdTree)
         .build();
     return HttpResponse.ok(ServletUtil.GSON2.toJson(response));
   }