diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/FaultRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/FaultRuptureSet.java
index 114ef37c2efb511be9d7be89ebaa7dc1cf536b7d..663ed4b170bb5f144600a3c96a84cc8d271ecb2b 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/FaultRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/FaultRuptureSet.java
@@ -175,7 +175,7 @@ public class FaultRuptureSet implements RuptureSet {
       System.out.println();
       System.out.println();
 
-      SourceConfig.Fault config = (SourceConfig.Fault) data.sourceConfig();
+      SourceConfig.Fault config = data.sourceConfig().asFault();
       surface = DefaultGriddedSurface.builder()
           .trace(feature.trace)
           .depth(feature.upperDepth)
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/GridRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/GridRuptureSet.java
index 9f944153b2371fe06b31d82f2124cd3aa780836a..5eb1f3656e3e3635fea6a9774cb87d8d564d8859 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/GridRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/GridRuptureSet.java
@@ -47,7 +47,7 @@ class GridRuptureSet implements RuptureSet {
   }
 
   private GridSourceSet createSourceSet(double weight) {
-    SourceConfig.Grid config = (SourceConfig.Grid) data.sourceConfig();
+    SourceConfig.Grid config = data.sourceConfig().asGrid();
     GridSourceSet grid = GridLoader.createGrid(
         config,
         feature.source,
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/HazardModel.java b/src/main/java/gov/usgs/earthquake/nshmp/model/HazardModel.java
index 5bdd233b510cea47388ec791fdbc15c33ec30ee1..32a8006885410f0034943419685f9e0922e490c2 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/HazardModel.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/HazardModel.java
@@ -295,7 +295,7 @@ public final class HazardModel implements Iterable<SourceSet<? extends Source>>
         double leafWeight) {
 
       SourceFeature.NshmFault feature = frs.feature;
-      SourceConfig.Fault config = (SourceConfig.Fault) frs.data.sourceConfig();
+      SourceConfig.Fault config = frs.data.sourceConfig().asFault();
 
       return new FaultSource.Builder()
           .name(feature.name)
@@ -338,7 +338,7 @@ public final class HazardModel implements Iterable<SourceSet<? extends Source>>
     private InterfaceSource interfaceRuptureSetToSource(InterfaceRuptureSet irs, double weight) {
       SourceFeature.Interface feature = irs.feature;
       List<LocationList> traces = feature.traces;
-      SourceConfig.Fault config = (SourceConfig.Fault) irs.data.sourceConfig();
+      SourceConfig.Fault config = irs.data.sourceConfig().asFault();
 
       InterfaceSource.Builder isb = new InterfaceSource.Builder()
           .lowerTrace(traces.get(traces.size() - 1));
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/InterfaceRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/InterfaceRuptureSet.java
index 29ea7bb809728940a5752c5db9a991514ff56f3b..ec318cae4f924ff0c23ee4238cc1590a0236f062 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/InterfaceRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/InterfaceRuptureSet.java
@@ -169,7 +169,7 @@ public class InterfaceRuptureSet implements RuptureSet {
       feature = createFeature();
       System.out.println(feature);
 
-      SourceConfig.Fault config = (SourceConfig.Fault) data.sourceConfig();
+      SourceConfig.Fault config = data.sourceConfig().asFault();
       surface = new ApproxGriddedSurface(
           feature.traces.get(0),
           feature.traces.get(1),
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/ModelLoader.java b/src/main/java/gov/usgs/earthquake/nshmp/model/ModelLoader.java
index 176de270dbb03dcd7009a80a32738bda8049c963..e36f78d3fd4a998d6a0719c1fa91f8c317b68906 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/ModelLoader.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/ModelLoader.java
@@ -294,7 +294,7 @@ abstract class ModelLoader {
       SourceFeature.NshmFault feature = SourceFeature.newNshmFault(geojson);
 
       /* Possibly split on normal fault dip variants. */
-      SourceConfig.Fault config = (SourceConfig.Fault) data.sourceConfig();
+      SourceConfig.Fault config = data.sourceConfig().asFault();
       boolean isNormal = FocalMech.fromRake(feature.rake) == FocalMech.NORMAL;
       if (config.normalDipTree.isPresent() && isNormal) {
         System.out.println("dip tree: " + root.relativize(geojson));
@@ -303,17 +303,6 @@ abstract class ModelLoader {
 
       System.out.println("  source: " + root.relativize(geojson));
 
-      // SourceFeature.NshmFault feature = SourceFeature.newNshmFault(geojson);
-      data.faultFeatureMap(Map.of(feature.id, feature));
-
-      // FaultRuptureSet ruptureSet = FaultRuptureSet.builder()
-      // .modelData(data)
-      // .name(feature.name)
-      // .id(feature.id)
-      // .sections(List.of(feature.id))
-      // .mfdTree(mfdTree)
-      // .build();
-
       LogicTree<Path> root = LogicTree.singleton(geojson);
       SourceTree.Builder treeBuilder = SourceTree.builder()
           .name(feature.name)
@@ -321,17 +310,16 @@ abstract class ModelLoader {
           .gmms(data.gmms())
           .root(root);
 
-      // .addLeaf(root.branches().get(0), ruptureSet)
-      // .build();
-
-      return loadSingleRuptureSet(
+      loadSingleRuptureSet(
           root.branches().get(0),
           treeBuilder,
           data,
           feature);
+
+      return treeBuilder.build();
     }
 
-    private SourceTree loadSingleRuptureSet(
+    private void loadSingleRuptureSet(
         Branch<Path> branch,
         SourceTree.Builder treeBuilder,
         ModelData data,
@@ -351,50 +339,40 @@ abstract class ModelLoader {
           .mfdTree(mfdTree)
           .build();
 
-      return treeBuilder.addLeaf(branch, ruptureSet).build();
+      treeBuilder.addLeaf(branch, ruptureSet);
     }
 
-    SourceTree loadNormalDipTree(
+    private SourceTree loadNormalDipTree(
         SourceFeature.NshmFault feature,
         ModelData data) {
 
-      SourceConfig.Fault config = (SourceConfig.Fault) data.sourceConfig();
-
-      // Feature source = GeoJson.from(geojson).toFeature();
-      // Properties props = source.properties();
-      double dip = feature.dip;// props.getDouble(Key.DIP).orElseThrow();
-      String name = feature.name;// props.getString(Key.NAME).orElseThrow();
-
+      SourceConfig.Fault config = data.sourceConfig().asFault();
       LogicTree<Double> dipTree = config.normalDipTree.orElseThrow();
-      LogicTree<Path> dipPathTree = ModelUtil.toPathTree(dipTree);
+      LogicTree<Path> dipSourceTree = ModelUtil.toPathTree(dipTree);
 
       SourceTree.Builder treeBuilder = SourceTree.builder()
-          .name(name)
+          .name(feature.name)
           .type(FAULT)
           .gmms(data.gmms())
-          .root(dipPathTree);
-
-      // SourceFeature.NshmFault feature = SourceFeature.newNshmFault(geojson);
-
-      // Properties.Builder props = Properties.fromFeature(source);
+          .root(dipSourceTree);
 
       for (int i = 0; i < dipTree.size(); i++) {
-        // for (Branch<Double> dipBranch : dipTree) {
         Branch<Double> dipBranch = dipTree.branches().get(i);
-        int branchDip = (int) (dip + dipBranch.value());
-        String branchName = String.format("%s [%s°]", name, dip);
+        int branchDip = (int) (feature.dip + dipBranch.value());
+        String branchName = String.format("%s [%s°]", feature.name, branchDip);
         Feature dipFeature = Feature.copyOf(feature.source)
             .properties(Properties.fromFeature(feature.source)
-                .put(Key.NAME, name)
-                .put(Key.DIP, dip + dipBranch.value())
+                .put(Key.NAME, branchName)
+                .put(Key.DIP, branchDip)
                 .build())
             .build();
 
-        // createSingleRuptureSet
-
-        processBranch(dipPathTree.branches().get(i), treeBuilder, data);
+        loadSingleRuptureSet(
+            dipSourceTree.branches().get(i),
+            treeBuilder,
+            data,
+            new SourceFeature.NshmFault(dipFeature));
       }
-
       return treeBuilder.build();
     }
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/SlabRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/SlabRuptureSet.java
index 7e973f7921a0b8f49f5b221102fbfd4aef4a3ba5..598ff931e1353b4a01f501f687a82877b0650546 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/SlabRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/SlabRuptureSet.java
@@ -45,7 +45,7 @@ class SlabRuptureSet implements RuptureSet {
   }
 
   private GridSourceSet createSourceSet(double weight) {
-    SourceConfig.Grid config = (SourceConfig.Grid) data.sourceConfig();
+    SourceConfig.Grid config = data.sourceConfig().asGrid();
     GridSourceSet grid = GridLoader.createGrid(
         config,
         feature.source,
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/SourceConfig.java b/src/main/java/gov/usgs/earthquake/nshmp/model/SourceConfig.java
index 8692293c994fcb735c2a5b8bcfe88e1269cb6123..7ef8670ca67515caf4a695a73c7b4978a1825833 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/SourceConfig.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/SourceConfig.java
@@ -31,11 +31,11 @@ abstract class SourceConfig {
     this.resource = resource;
   }
 
-  Fault getAsFault() {
+  Fault asFault() {
     return (Fault) this;
   }
 
-  Grid getAsGrid() {
+  Grid asGrid() {
     return (Grid) this;
   }
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/ZoneRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/ZoneRuptureSet.java
index 9c5540e3ff5761430f939418516d379be6c1b64b..74e83c2ca172531daba42264b5eb7785a3d3c6b7 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/ZoneRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/ZoneRuptureSet.java
@@ -71,7 +71,7 @@ class ZoneRuptureSet implements RuptureSet {
   }
 
   private GridSourceSet createSourceSet(double weight) {
-    SourceConfig.Grid config = (SourceConfig.Grid) data.sourceConfig();
+    SourceConfig.Grid config = data.sourceConfig().asGrid();
 
     GridSourceSet grid = GridLoader.createGrid(
         config,