diff --git a/package-lock.json b/package-lock.json
index 4e5c8dfaebb0900cb43d156cdc2238b0c0673bdd..f019440ccd1f2b27175177d153ff839612d1e9df 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,7 +21,7 @@
         "@asymmetrik/ngx-leaflet": "^13.0.2",
         "@ghsc/disagg-d3": "^0.8.0",
         "@ghsc/nshmp-template": "^13.3.1",
-        "@ghsc/nshmp-web-utils": "^2.2.0",
+        "@ghsc/nshmp-web-utils": "^2.3.0",
         "@ngrx/effects": "^13.0.2",
         "@ngrx/router-store": "^13.0.2",
         "@ngrx/schematics": "^13.0.2",
@@ -3233,9 +3233,9 @@
       }
     },
     "node_modules/@ghsc/nshmp-web-utils": {
-      "version": "2.2.0",
-      "resolved": "https://code.usgs.gov/api/v4/projects/1414/packages/npm/@ghsc/nshmp-web-utils/-/@ghsc/nshmp-web-utils-2.2.0.tgz",
-      "integrity": "sha1-FhMRiT5cXs+NIBl4y2t/F/ZPE+E=",
+      "version": "2.3.0",
+      "resolved": "https://code.usgs.gov/api/v4/projects/1414/packages/npm/@ghsc/nshmp-web-utils/-/@ghsc/nshmp-web-utils-2.3.0.tgz",
+      "integrity": "sha1-Y9fDyU+cFzKRytl6XEGtw+HDG3c=",
       "dependencies": {
         "@types/d3-format": "^3.0.1",
         "@types/leaflet": "^1.9.0",
@@ -34045,9 +34045,9 @@
       }
     },
     "@ghsc/nshmp-web-utils": {
-      "version": "2.2.0",
-      "resolved": "https://code.usgs.gov/api/v4/projects/1414/packages/npm/@ghsc/nshmp-web-utils/-/@ghsc/nshmp-web-utils-2.2.0.tgz",
-      "integrity": "sha1-FhMRiT5cXs+NIBl4y2t/F/ZPE+E=",
+      "version": "2.3.0",
+      "resolved": "https://code.usgs.gov/api/v4/projects/1414/packages/npm/@ghsc/nshmp-web-utils/-/@ghsc/nshmp-web-utils-2.3.0.tgz",
+      "integrity": "sha1-Y9fDyU+cFzKRytl6XEGtw+HDG3c=",
       "requires": {
         "@types/d3-format": "^3.0.1",
         "@types/leaflet": "^1.9.0",
diff --git a/package.json b/package.json
index 722f33f8a2e853b278c3a3c0e3dc171538a22bc6..b0e1a459bd646229688dd449335ce0d1f1d14d07 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
     "@asymmetrik/ngx-leaflet": "^13.0.2",
     "@ghsc/disagg-d3": "^0.8.0",
     "@ghsc/nshmp-template": "^13.3.1",
-    "@ghsc/nshmp-web-utils": "^2.2.0",
+    "@ghsc/nshmp-web-utils": "^2.3.0",
     "@ngrx/effects": "^13.0.2",
     "@ngrx/router-store": "^13.0.2",
     "@ngrx/schematics": "^13.0.2",
diff --git a/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.html b/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.html
index db346977aece10d43e6e4ddf0a87fded272b5c80..2926ee8f8d009a70f8fc31ce65bc8f0b9a7a8dd7 100644
--- a/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.html
+++ b/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.html
@@ -63,12 +63,15 @@
         <div [leafletLayer]="layers.baseLayer"></div>
 
         <!-- Map bounds layers -->
-        <div *ngIf="layers.mapBounds" [leafletLayer]="layers.mapBounds"></div>
+        <div
+          *ngIf="layers.mapBounds$ | async as mapBounds"
+          [leafletLayer]="mapBounds"
+        ></div>
 
         <!-- Outside NSHM bounds layers -->
         <div
-          *ngIf="layers.outsideBounds"
-          [leafletLayer]="layers.outsideBounds"
+          *ngIf="layers.outsideBounds$ | async as outsideBounds"
+          [leafletLayer]="outsideBounds"
         ></div>
 
         <!-- Site marker -->
@@ -112,12 +115,12 @@
       </mat-form-field>
     </div>
 
-    <div class="field">
+    <div class="field" *ngIf="layers.mapBounds$ | async as mapBounds">
       <button
         mat-raised-button
         color="accent"
         class="field"
-        (click)="onFitBounds()"
+        (click)="onFitBounds(mapBounds)"
       >
         Reset Zoom
       </button>
diff --git a/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.ts b/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.ts
index d04cc131129905464d8e8e11c0def8ad33c616cc..b178efe62834ade48021d2cfb21c05e1f319c5ee 100644
--- a/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.ts
+++ b/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.ts
@@ -39,8 +39,8 @@ interface Layers {
   baseLayer: L.TileLayer;
   baseLayers: LeafletControlLayersConfig;
   faultSections$: Observable<L.GeoJSON>;
-  mapBounds: L.GeoJSON;
-  outsideBounds: L.GeoJSON;
+  mapBounds$: Observable<L.GeoJSON>;
+  outsideBounds$: Observable<L.GeoJSON>;
   outsideBoundsPopup: L.Tooltip;
   siteMarker: L.Marker;
   testSites: L.GeoJSON;
@@ -63,8 +63,8 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy {
       overlays: {},
     },
     faultSections$: undefined,
-    mapBounds: undefined,
-    outsideBounds: undefined,
+    mapBounds$: undefined,
+    outsideBounds$: undefined,
     outsideBoundsPopup: undefined,
     siteMarker: undefined,
     testSites: undefined,
@@ -132,19 +132,8 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy {
     }
   }
 
-  onTestSitesToggle(event: MatSlideToggleChange): void {
-    this.testSiteSelect.value = '';
-
-    if (event.checked) {
-      this.getTestSites();
-    } else {
-      this.testSites = undefined;
-      this.locationInputValue = locationInputPlaceholder;
-    }
-  }
-
-  onFitBounds(): void {
-    this.map.fitBounds(this.layers.mapBounds.getBounds());
+  onFitBounds(mapBounds: L.GeoJSON): void {
+    this.map.fitBounds(mapBounds.getBounds());
   }
 
   onMapReady(map: L.Map): void {
@@ -162,8 +151,6 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy {
     }
 
     L.control.scale({position: 'bottomleft'}).addTo(map);
-
-    this.setLayerEvents(this.layers);
   }
 
   onTestSitesSelectionChange(event: MatSelectChange) {
@@ -177,53 +164,89 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy {
     this.onTestSiteClick(site);
   }
 
-  private createMapBoundsLayer(): L.GeoJSON {
-    const mapPolygon = this.data.map.features.find(
-      feature => feature.id !== 'Extents'
-    );
-    return L.geoJSON(mapPolygon, {
-      style: {
-        color: 'grey',
-        fillColor: 'grey',
-        fillOpacity: 0,
-      },
-    });
+  onTestSitesToggle(event: MatSlideToggleChange): void {
+    this.testSiteSelect.value = '';
+
+    if (event.checked) {
+      this.getTestSites();
+    } else {
+      this.testSites = undefined;
+      this.locationInputValue = locationInputPlaceholder;
+    }
   }
 
-  private createOutsideBoundsLayer(): L.GeoJSON {
-    const mapPolygon = this.data.map.features.find(
-      feature => feature.id !== 'Extents'
+  private createMapBoundsLayer$(): Observable<L.GeoJSON> {
+    const layer$ = this.getMap$().pipe(
+      map(map => {
+        const mapPolygon = map.features.find(
+          feature => feature.id !== 'Extents'
+        );
+
+        const layer = L.geoJSON(mapPolygon, {
+          style: {
+            color: 'grey',
+            fillColor: 'grey',
+            fillOpacity: 0,
+          },
+        });
+
+        layer.on('click', event => this.zone.run(() => this.onMapClick(event)));
+
+        this.onFitBounds(layer);
+
+        return layer;
+      })
     );
 
-    const featureCollection: GeoJSON.FeatureCollection<GeoJSON.Polygon> = {
-      features: [
-        {
-          geometry: {
-            coordinates: [
-              [
-                [-360, 90],
-                [180, 90],
-                [180, -90],
-                [-360, -90],
-              ],
-              ...mapPolygon.geometry.coordinates,
-            ],
-            type: 'Polygon',
+    return layer$;
+  }
+
+  private createOutsideBoundsLayer$(): Observable<L.GeoJSON> {
+    const layer$ = this.getMap$().pipe(
+      map(map => {
+        const mapPolygon = map.features.find(
+          feature => feature.id !== 'Extents'
+        );
+
+        const featureCollection: GeoJSON.FeatureCollection<GeoJSON.Polygon> = {
+          features: [
+            {
+              geometry: {
+                coordinates: [
+                  [
+                    [-360, 90],
+                    [180, 90],
+                    [180, -90],
+                    [-360, -90],
+                  ],
+                  ...mapPolygon.geometry.coordinates,
+                ],
+                type: 'Polygon',
+              },
+              properties: {},
+              type: 'Feature',
+            },
+          ],
+          type: 'FeatureCollection',
+        };
+
+        const layer = L.geoJSON(featureCollection, {
+          style: {
+            color: 'grey',
+            fillColor: 'grey',
+            fillOpacity: 0.5,
           },
-          properties: {},
-          type: 'Feature',
-        },
-      ],
-      type: 'FeatureCollection',
-    };
+        });
 
-    return L.geoJSON(featureCollection, {
-      style: {
-        color: 'grey',
-        fillColor: 'grey',
-        fillOpacity: 0.5,
-      },
-    });
+        layer.on('click', event =>
+          this.zone.run(() => this.onOutsideMapClick(event))
+        );
+
+        return layer;
+      })
+    );
+
+    return layer$;
   }
 
   private createSelectedSiteMarker(site: L.LatLng): void {
@@ -255,6 +278,12 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy {
     );
   }
 
+  private getMap$(): Observable<GeoJSON.FeatureCollection<GeoJSON.Polygon>> {
+    return this.http.get<GeoJSON.FeatureCollection<GeoJSON.Polygon>>(
+      this.data.mapUrl
+    );
+  }
+
   private getTestSites(): void {
     this.spinner.show('Getting test sites ...');
 
@@ -350,21 +379,9 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy {
     );
   }
 
-  private setLayerEvents(layers: Layers): void {
-    layers.outsideBounds.on('click', event =>
-      this.zone.run(() => this.onOutsideMapClick(event))
-    );
-
-    layers.mapBounds.on('click', event =>
-      this.zone.run(() => this.onMapClick(event))
-    );
-  }
-
   private setLayers(): void {
-    this.layers.outsideBounds = this.createOutsideBoundsLayer();
-
-    this.layers.mapBounds = this.createMapBoundsLayer();
-    this.map.fitBounds(this.layers.mapBounds.getBounds());
+    this.layers.mapBounds$ = this.createMapBoundsLayer$();
+    this.layers.outsideBounds$ = this.createOutsideBoundsLayer$();
   }
 
   private setSelectedSite(site: L.LatLng): void {
diff --git a/projects/map-lib/src/lib/models/select-site.model.ts b/projects/map-lib/src/lib/models/select-site.model.ts
index 4481ffefc648c2d3405d9e2420b6f52c5b6c1f09..e8852493c4c2e59c614ebdf59bfd78cefc0fd0cb 100644
--- a/projects/map-lib/src/lib/models/select-site.model.ts
+++ b/projects/map-lib/src/lib/models/select-site.model.ts
@@ -1,7 +1,7 @@
 import {NshmId} from '@ghsc/nshmp-web-utils/libs/nshmp-lib/nshm';
 
 export interface SelectSiteDialogData {
-  map: GeoJSON.FeatureCollection<GeoJSON.Polygon>;
+  mapUrl: string;
   nshm: NshmId;
   sitesUrl: string;
 }
diff --git a/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts
index 281e02c5f25ff7ee0ab2815881aefb0cef130a93..85c121281de42436fb3a29848dff96505914f528 100644
--- a/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts
+++ b/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts
@@ -35,7 +35,7 @@ export class ControlPanelComponent {
         environment.webServices.nshmpHazWs.services.curveServices;
 
       return {
-        map: usage.response.model.map,
+        mapUrl: `${nshmService.url}${services.map}?raw=true`,
         nshm: form.value.model,
         sitesUrl: `${nshmService.url}${services.sites}?raw=true`,
       };
diff --git a/projects/nshmp-apps/src/app/hazard/dynamic/components/control/control.component.ts b/projects/nshmp-apps/src/app/hazard/dynamic/components/control/control.component.ts
index 81dc4c8c2750858c5c1e16712e23078f6104f262..bc43ad0459877587279c4802aa9ba97ff8db293e 100644
--- a/projects/nshmp-apps/src/app/hazard/dynamic/components/control/control.component.ts
+++ b/projects/nshmp-apps/src/app/hazard/dynamic/components/control/control.component.ts
@@ -41,7 +41,7 @@ export class ControlComponent {
         environment.webServices.nshmpHazWs.services.curveServices;
 
       return {
-        map: usage.response.model.map,
+        mapUrl: `${nshmService.url}${services.map}?raw=true`,
         nshm: form.value.model,
         sitesUrl: `${nshmService.url}${services.sites}?raw=true`,
       };
diff --git a/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts
index acfc0390e9a364fa2f8653fa5108ed77c43f22ee..92a0cd82b4f575f737e63a850d90834c329f931e 100644
--- a/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts
+++ b/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts
@@ -38,7 +38,7 @@ export class ControlPanelComponent {
         environment.webServices.nshmpWsStatic.services.curveServices;
 
       return {
-        map: usage.response.models.map,
+        mapUrl: `${nshmService.url}${services.map}?raw=true`,
         nshm: form.value.model,
         sitesUrl: `${nshmService.url}${services.sites}?raw=true`,
       };
diff --git a/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.html b/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.html
index ba198fe2b177bcbc4fc5e96ba9c2fb8de58d2209..e27a7ca4a12814171150a3ebe55d07b797920be0 100644
--- a/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.html
+++ b/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.html
@@ -20,6 +20,7 @@
           <mat-slide-toggle
             color="primary"
             [ngrxFormControlState]="form?.controls?.hasNshmBoundaryLayer"
+            (change)="onMapToggle($event.checked)"
           >
             NSHM Border Layer
           </mat-slide-toggle>
diff --git a/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.ts
index d3f7474c619c072e067ea5b4e80c618e5c33cce3..e639f507fec142d59066769b37fc5bc81f6a8d1f 100644
--- a/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.ts
+++ b/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.ts
@@ -18,6 +18,12 @@ export class ControlPanelComponent {
     }
   }
 
+  onMapToggle(checked: boolean): void {
+    if (checked) {
+      this.facade.callMapService();
+    }
+  }
+
   onTestSitesToggle(checked: boolean): void {
     if (checked) {
       this.facade.callTestSitesService();
diff --git a/projects/nshmp-apps/src/app/source/data/state/app.actions.ts b/projects/nshmp-apps/src/app/source/data/state/app.actions.ts
index 8044b192a334bbb168ad5ae222917fadc46d2460..5bae364182c5f848bda4347a24f7dfa536226347 100644
--- a/projects/nshmp-apps/src/app/source/data/state/app.actions.ts
+++ b/projects/nshmp-apps/src/app/source/data/state/app.actions.ts
@@ -12,6 +12,7 @@ import * as sharedActions from 'projects/nshmp-lib/src/lib/state/shared/shared.a
 export enum ActionTypes {
   BASE_LAYER = '[Data Mapping App] Set Base Layer',
   CALL_FAULT_SECTION_SERVICE = '[Data Mapping App] Call Fault Section Service',
+  CALL_MAP_SERVICE = '[Data Mapping App] Call Map Service',
   CALL_TEST_SITES_SERVICE = '[Data Mapping App] Call Test Sites Service',
   CHECK_FAULT_SECTIONS = '[Data Mapping App] Check for Fault Sections',
   CHECK_TEST_SITES = '[Data Mapping App] Check for Test Sites',
@@ -40,6 +41,8 @@ export const callTestSitesService = createAction(
   ActionTypes.CALL_TEST_SITES_SERVICE
 );
 
+export const callMapService = createAction(ActionTypes.CALL_MAP_SERVICE);
+
 export const checkFaultSections = createAction(
   ActionTypes.CHECK_FAULT_SECTIONS
 );
diff --git a/projects/nshmp-apps/src/app/source/data/state/app.effects.ts b/projects/nshmp-apps/src/app/source/data/state/app.effects.ts
index 2289b08ef46cdd39e941c65899f089c6d9bac683..e1d3995b7ea27fbc86333afb7de3f6d570470bb2 100644
--- a/projects/nshmp-apps/src/app/source/data/state/app.effects.ts
+++ b/projects/nshmp-apps/src/app/source/data/state/app.effects.ts
@@ -1,9 +1,6 @@
 import {HttpClient} from '@angular/common/http';
 import {Injectable} from '@angular/core';
-import {
-  HazardRequestMetadata,
-  HazardUsageResponse,
-} from '@ghsc/nshmp-web-utils/libs/nshmp-haz/www/hazard-service';
+import {HazardRequestMetadata} from '@ghsc/nshmp-web-utils/libs/nshmp-haz/www/hazard-service';
 import {
   FaultSectionsResponse,
   FaultSectionUsage,
@@ -60,6 +57,35 @@ export class AppEffects {
     )
   );
 
+  callMapService$ = createEffect(() =>
+    this.actions$.pipe(
+      ofType(actions.callMapService),
+      concatLatestFrom(() => this.store.select(selectors.selectNshmService)),
+      exhaustMap(([, nshm]) => {
+        this.spinnerService.show('Getting Border ...');
+        const url = `${nshm.url}${this.services.map}?raw=true`;
+
+        return this.http.get<GeoJSON.FeatureCollection>(url).pipe(
+          map(response => {
+            this.spinnerService.remove();
+
+            const nshmBorder = response.features.find(
+              feature => feature.id !== 'Extents'
+            );
+
+            return actions.nshmBoundaryLayer({
+              nshmBoundaryLayer: L.geoJSON(nshmBorder, {
+                style: {
+                  fill: false,
+                },
+              }),
+            });
+          })
+        );
+      })
+    )
+  );
+
   callTestSitesService$ = createEffect(() =>
     this.actions$.pipe(
       ofType(actions.callTestSitesService),
@@ -98,8 +124,7 @@ export class AppEffects {
   init$ = createEffect(() =>
     this.actions$.pipe(
       ofType(actions.init),
-      concatLatestFrom(() => this.store.select(selectors.selectControlForm)),
-      exhaustMap(([, form]) => {
+      exhaustMap(() => {
         this.spinnerService.show('Getting Metadata ...');
 
         const faultSectionsUrl = `${this.baseUrl}${environment.webServices.nonNSHM.services.faultSections}`;
@@ -114,25 +139,12 @@ export class AppEffects {
         return forkJoin([faultSectionCall, modelCall]).pipe(
           mergeMap(([faultSectionUsage, nshms]) => {
             this.spinnerService.remove();
-            const nshm: HazardUsageResponse = nshms.usageResponses.get(
-              form.value.model
-            );
-            const nshmBorder = nshm.response.model.map.features.find(
-              feature => feature.id !== 'Extents'
-            );
 
             return [
               actions.nshms({nshms}),
               actions.faultSectionsUsageResponse({
                 usageResponse: faultSectionUsage,
               }),
-              actions.nshmBoundaryLayer({
-                nshmBoundaryLayer: L.geoJSON(nshmBorder, {
-                  style: {
-                    fill: false,
-                  },
-                }),
-              }),
             ];
           })
         );
diff --git a/projects/nshmp-apps/src/app/source/data/state/app.facade.ts b/projects/nshmp-apps/src/app/source/data/state/app.facade.ts
index 5e1ec92f370238b79fb2da5c791fd9e17a1b9bd4..6de19d3589483983ce1a7d838366876b827d4ba6 100644
--- a/projects/nshmp-apps/src/app/source/data/state/app.facade.ts
+++ b/projects/nshmp-apps/src/app/source/data/state/app.facade.ts
@@ -55,6 +55,10 @@ export class AppFacade {
     this.store.dispatch(actions.callFaultSectionService());
   }
 
+  callMapService(): void {
+    this.store.dispatch(actions.callMapService());
+  }
+
   callTestSitesService(): void {
     this.store.dispatch(actions.callTestSitesService());
   }
diff --git a/projects/nshmp-apps/src/app/source/data/state/app.reducer.ts b/projects/nshmp-apps/src/app/source/data/state/app.reducer.ts
index e450448dfaaeec7eb45c23720f2d9d17fec03f05..50502154e44f574e8dc5180cf5d824a46e660f69 100644
--- a/projects/nshmp-apps/src/app/source/data/state/app.reducer.ts
+++ b/projects/nshmp-apps/src/app/source/data/state/app.reducer.ts
@@ -1,7 +1,5 @@
 import * as nshmpLeaflet from '@ghsc/nshmp-web-utils/libs/leaflet';
-import {HazardUsageResponse} from '@ghsc/nshmp-web-utils/libs/nshmp-haz/www/hazard-service';
 import {Action, createReducer, on} from '@ngrx/store';
-import * as L from 'leaflet';
 import {
   disable,
   enable,
@@ -23,14 +21,6 @@ const rawReducer = createReducer(
   onNgrxFormsAction(SetValueAction, (state, action) => {
     switch (action.controlId) {
       case `${CONTROL_FORM_ID}.${ControlFormIds.model}`: {
-        const nshm: HazardUsageResponse = state.nshms.usageResponses.get(
-          state.controlForm.value.model
-        );
-
-        const nshmBorder = nshm.response.model.map.features.find(
-          feature => feature.id !== 'Extents'
-        );
-
         const faultSectionNshms =
           state.faultSections.usageResponse.response.parameters.nshm.values;
 
@@ -42,15 +32,14 @@ const rawReducer = createReducer(
               faultSectionNshms.includes(state.controlForm.value.model)
                 ? enable(setValue(control, false))
                 : disable(setValue(control, false)),
+            hasNshmBoundaryLayer: control => setValue(control, false),
+            hasTestSitesLayer: control => setValue(control, false),
           })(state.controlForm),
           layers: {
             ...state.layers,
             faultSectionLayer: null,
-            nshmBoundaryLayer: L.geoJSON(nshmBorder, {
-              style: {
-                fill: false,
-              },
-            }),
+            nshmBoundaryLayer: null,
+            testSitesLayer: null,
           },
         };
       }
@@ -140,8 +129,22 @@ const rawReducer = createReducer(
     };
   }),
   on(actions.nshmBoundaryLayer, (state, {nshmBoundaryLayer}) => {
+    let bounds = nshmBoundaryLayer.getBounds();
+    const hasFaultSectionLayer = state.controlForm.value.hasFaultSectionLayer;
+    const faultSectionLayer = state.layers.faultSectionLayer;
+    const hasTestSitesLayer = state.controlForm.value.hasTestSitesLayer;
+    const testSitesLayer = state.layers.testSitesLayer;
+
+    if (hasFaultSectionLayer && faultSectionLayer) {
+      bounds = bounds.extend(faultSectionLayer.getBounds());
+    }
+    if (hasTestSitesLayer && testSitesLayer) {
+      bounds = bounds.extend(testSitesLayer.getBounds());
+    }
+
     return {
       ...state,
+      bounds,
       layers: {
         ...state.layers,
         nshmBoundaryLayer,
diff --git a/projects/nshmp-apps/src/environments/web-services.ts b/projects/nshmp-apps/src/environments/web-services.ts
index e45bf554e29ca9252c84fd5cdb1013ed833c8875..7c3df98201e0dfba24dd9cf50d07a43c8e7aef9b 100644
--- a/projects/nshmp-apps/src/environments/web-services.ts
+++ b/projects/nshmp-apps/src/environments/web-services.ts
@@ -62,6 +62,7 @@ export function webServices(baseUrl: string): WebServices {
         curveServices: {
           disagg: '/disagg',
           hazard: '/hazard',
+          map: '/map',
           probability: '/probability',
           rate: '/rate',
           sites: '/sites',
@@ -79,6 +80,7 @@ export function webServices(baseUrl: string): WebServices {
       services: {
         curveServices: {
           hazard: '/hazard',
+          map: '/map',
           sites: '/sites',
           swagger: '/swagger',
         },
diff --git a/projects/nshmp-lib/src/lib/models/web-services.model.ts b/projects/nshmp-lib/src/lib/models/web-services.model.ts
index daff8f5fe39d9113d1435ced6d4e693249969692..47bb581f2f3d421df6eb2011b0cb46ad8f020831 100644
--- a/projects/nshmp-lib/src/lib/models/web-services.model.ts
+++ b/projects/nshmp-lib/src/lib/models/web-services.model.ts
@@ -29,6 +29,7 @@ export interface AwsServices {
 export interface DynamicCurvesServices {
   disagg: string;
   hazard: string;
+  map: string;
   probability: string;
   rate: string;
   sites: string;
@@ -86,6 +87,7 @@ export interface RtgmServices {
 
 export interface StaticCurvesServices {
   hazard: string;
+  map: string;
   sites: string;
   swagger: string;
 }