diff --git a/projects/nshmp-apps/src/app/dev/gmm/hanging-wall-effects/components/plots/plots.component.html b/projects/nshmp-apps/src/app/dev/gmm/hanging-wall-effects/components/plots/plots.component.html
index 230e07f5420450bf0ecf87f48bb70573969132ba..6beaf05147eb73f519f3380c9651fe347c3143b8 100644
--- a/projects/nshmp-apps/src/app/dev/gmm/hanging-wall-effects/components/plots/plots.component.html
+++ b/projects/nshmp-apps/src/app/dev/gmm/hanging-wall-effects/components/plots/plots.component.html
@@ -1,4 +1,4 @@
-<nshmp-lib-ng-plots-container>
+<nshmp-lib-no-ngrx-plots-container>
   <mat-accordion multi>
     <!-- GMM vs. distance plot -->
     <mat-expansion-panel expanded>
@@ -8,8 +8,8 @@
 
       <mat-divider />
 
-      @if (groundMotionPlotData$ | async; as groundMotionPlot) {
-        <nshmp-lib-ng-plot [plot]="groundMotionPlot" />
+      @if (groundMotionPlotData()) {
+        <nshmp-lib-no-ngrx-plot [plot]="groundMotionPlotData()" />
       }
 
       <mat-divider />
@@ -18,8 +18,8 @@
       <div class="fault grid-row">
         <!-- Fault plot -->
         <div class="fault-plot grid-col-12 tablet-lg:grid-col-7">
-          @if (faultPlotData$ | async; as faultPlot) {
-            <nshmp-lib-ng-plot [plot]="faultPlot" />
+          @if (faultPlotData()) {
+            <nshmp-lib-no-ngrx-plot [plot]="faultPlotData()" />
           }
         </div>
 
@@ -29,36 +29,31 @@
         <div class="fault-controls grid-col-12 tablet-lg:grid-col">
           <mat-label class="section-label">Source Geometry</mat-label>
 
-          @if (formState$ | async; as formState) {
-            <form [ngrxFormState]="formState">
-              <!-- Dip -->
-              <app-fault-control
-                [formControlState]="formState?.controls?.dip"
-                label="Dip"
-                [parameter]="dipParameter$ | async"
-                textSuffix="°"
-                (faultControlChange)="onFaultControlChange()"
-              />
+          <form [formGroup]="formState">
+            <!-- Dip -->
+            <app-fault-control
+              [control]="formState.controls.dip"
+              label="Dip"
+              [parameter]="dipParameter()"
+              textSuffix="°"
+            />
 
-              <!-- Width -->
-              <app-fault-control
-                [formControlState]="formState?.controls?.width"
-                label="Width"
-                [parameter]="widthParameter$ | async"
-                textSuffix="km"
-                (faultControlChange)="onFaultControlChange()"
-              />
+            <!-- Width -->
+            <app-fault-control
+              [control]="formState.controls.width"
+              label="Width"
+              [parameter]="widthParameter()"
+              textSuffix="km"
+            />
 
-              <!-- zTop -->
-              <app-fault-control
-                [formControlState]="formState?.controls?.zTor"
-                label="zTor"
-                [parameter]="zTorParameter$ | async"
-                textSuffix="km"
-                (faultControlChange)="onFaultControlChange()"
-              />
-            </form>
-          }
+            <!-- zTop -->
+            <app-fault-control
+              [control]="formState.controls.zTor"
+              label="zTor"
+              [parameter]="zTorParameter()"
+              textSuffix="km"
+            />
+          </form>
         </div>
       </div>
     </mat-expansion-panel>
@@ -80,7 +75,7 @@
       </mat-expansion-panel-header>
 
       <mat-divider />
-      <nshmp-lib-ng-app-metadata [repositories]="repositories$ | async" />
+      <nshmp-lib-no-ngrx-app-metadata [repositories]="repositories()" />
     </mat-expansion-panel>
   </mat-accordion>
-</nshmp-lib-ng-plots-container>
+</nshmp-lib-no-ngrx-plots-container>
diff --git a/projects/nshmp-apps/src/app/dev/gmm/hanging-wall-effects/components/plots/plots.component.ts b/projects/nshmp-apps/src/app/dev/gmm/hanging-wall-effects/components/plots/plots.component.ts
index 2ce03e07c256605c121e7df133d65e31e44802de..154d539383dc568b9685413c4bd572e7aeeaffec 100644
--- a/projects/nshmp-apps/src/app/dev/gmm/hanging-wall-effects/components/plots/plots.component.ts
+++ b/projects/nshmp-apps/src/app/dev/gmm/hanging-wall-effects/components/plots/plots.component.ts
@@ -1,5 +1,6 @@
 import {AsyncPipe} from '@angular/common';
-import {Component} from '@angular/core';
+import {Component, computed, Signal} from '@angular/core';
+import {ReactiveFormsModule} from '@angular/forms';
 import {MatDivider} from '@angular/material/divider';
 import {
   MatAccordion,
@@ -8,12 +9,12 @@ import {
   MatExpansionPanelTitle,
 } from '@angular/material/expansion';
 import {MatLabel} from '@angular/material/form-field';
-import {NshmpLibNgAppMetadataComponent} from '@ghsc/nshmp-lib-ng/nshmp';
+import {NshmpLibNgAppMetadataComponent} from '@ghsc/nshmp-lib-no-ngrx/nshmp';
 import {
   NshmpLibNgPlotComponent,
   NshmpLibNgPlotsContainerComponent,
-} from '@ghsc/nshmp-lib-ng/plot';
-import {map} from 'rxjs';
+} from '@ghsc/nshmp-lib-no-ngrx/plot';
+import {GmmUsageParameter} from '@ghsc/nshmp-utils-ts/libs/nshmp-ws/gmm-services';
 
 import {AppFacade} from '../../state/app.facade';
 import {Plots} from '../../state/app.state';
@@ -41,6 +42,7 @@ import {ParameterSummaryComponent} from '../parameter-summary/parameter-summary.
     FaultControlComponent,
     ParameterSummaryComponent,
     AsyncPipe,
+    ReactiveFormsModule,
   ],
   selector: 'app-plots',
   standalone: true,
@@ -49,45 +51,41 @@ import {ParameterSummaryComponent} from '../parameter-summary/parameter-summary.
 })
 export class PlotsComponent {
   /** Usage parameters */
-  private parameters$ = this.facade.usage$.pipe(
-    map(usage => usage?.response?.parameters)
+  private parameters = computed(
+    () => this.facade.state().usageResponse?.response?.parameters
   );
 
   /** Ground motion plot */
-  groundMotionPlotData$ = this.facade.plots$.pipe(
-    map(plots => plots?.get(Plots.GROUND_MOTION)?.plotData)
+  groundMotionPlotData = computed(
+    () => this.facade.state().plots?.get(Plots.GROUND_MOTION)?.plotData
   );
 
   /** Fault plot */
-  faultPlotData$ = this.facade.plots$.pipe(
-    map(plots => plots?.get(Plots.FAULT)?.plotData)
+  faultPlotData = computed(
+    () => this.facade.state().plots?.get(Plots.FAULT)?.plotData
   );
 
   /** Control panel form field state */
-  formState$ = this.facade.controlPanelForm$;
+  formState = this.facade.controlPanelForm;
 
   /** Dip gmm parameter */
-  dipParameter$ = this.parameters$.pipe(map(paramerters => paramerters?.dip));
+  dipParameter = computed(() => this.parameters()?.dip);
 
   /** Width gmm parameter with more restrictive max */
-  widthParameter$ = this.parameters$.pipe(
-    map(paramerters => ({
-      ...paramerters?.width,
-      max: 30,
-    }))
-  );
+  widthParameter: Signal<GmmUsageParameter> = computed(() => ({
+    ...this.parameters()?.width,
+    max: 30,
+  }));
 
   /** zTor gmm parameter with more restrictive max */
-  zTorParameter$ = this.parameters$.pipe(
-    map(paramerters => ({
-      ...paramerters?.zTor,
-      max: 10,
-    }))
-  );
+  zTorParameter: Signal<GmmUsageParameter> = computed(() => ({
+    ...this.parameters()?.zTor,
+    max: 10,
+  }));
 
   /** Repo metadata */
-  repositories$ = this.facade.usage$.pipe(
-    map(usage => usage?.metadata.repositories)
+  repositories = computed(
+    () => this.facade.state().usageResponse?.metadata.repositories
   );
 
   constructor(private facade: AppFacade) {}