diff --git a/common/helpOnePager.md b/common/helpOnePager.md
index 35b4ff7191af002402aa57c576dae3e2f2c14cb6..f23b9a498e529d2cfc65b5856c0b313142f29448 100644
--- a/common/helpOnePager.md
+++ b/common/helpOnePager.md
@@ -10,7 +10,7 @@
 | Zoom | `[hover]` on any slice views, `[click]` magnifier |
 | Next slice | `<ctrl>` + `[mousewheel]` |
 | Next 10 slice | `<ctrl>` + `<shift>` + `[mousewheel]` |
-| Toggle delineation | |
+| Toggle delineation | `[q]` |
 
 ---
 
diff --git a/docs/releases/v2.3.8.md b/docs/releases/v2.3.8.md
new file mode 100644
index 0000000000000000000000000000000000000000..9a10601b60180d727fc0e1b0fa9e91314df882c4
--- /dev/null
+++ b/docs/releases/v2.3.8.md
@@ -0,0 +1,5 @@
+# v2.3.8
+
+## New Features
+
+- Adding control allowing delineation control
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index da2897aeac570dd355375736e1e8cf9e7e54ebe6..089276c5fcdbc8e0f4974dcc15cf73715e568fb5 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -40,6 +40,7 @@ pages:
     - Fetching datasets: 'advanced/datasets.md'
     - Display non-atlas volumes: 'advanced/otherVolumes.md'
   - Release notes:
+    - v2.3.8: 'releases/v2.3.8.md'
     - v2.3.7: 'releases/v2.3.7.md'
     - v2.3.6: 'releases/v2.3.6.md'
     - v2.3.5: 'releases/v2.3.5.md'
diff --git a/src/ui/nehubaContainer/nehubaContainer.template.html b/src/ui/nehubaContainer/nehubaContainer.template.html
index b08904a09ce57f37dfaed22204fba0da53d86d38..1ce4f539812f6d98d113b561380f8fd5a34cccc6 100644
--- a/src/ui/nehubaContainer/nehubaContainer.template.html
+++ b/src/ui/nehubaContainer/nehubaContainer.template.html
@@ -700,6 +700,20 @@
 
     <!-- perspective specific control -->
     <ng-container *ngIf="panelIndex === 3">
+      <!-- viewer ctrl -->
+      <mat-menu #viewerCtrlMenu>
+        <!-- NB must not lazy load. key listener needs to work even when component is not yet rendered -->
+        <viewer-ctrl-component class="d-block m-2"
+          [iav-key-listener]="[{ type: 'keydown', key: 'q', target: 'document', capture: true }]"
+          (iav-key-event)="viewerCtrlCmp.toggleParcVsbl()"
+          #viewerCtrlCmp="viewerCtrlCmp">
+        </viewer-ctrl-component>
+      </mat-menu>
+      <button mat-icon-button color="primary"
+        [matMenuTriggerFor]="viewerCtrlMenu">
+        <i class="fas fa-cog"></i>
+      </button>
+
       <ng-container *ngTemplateOutlet="perspectiveOctantRemovalTmpl; context: {
         state: (nehubaViewerPerspectiveOctantRemoval$ | async),
         disableOctantRemoval: disableOctantRemoval$ | async
diff --git a/src/ui/ui.module.ts b/src/ui/ui.module.ts
index 0c116696a290cd9e622c8f18d6ec4ce740ce429c..5697352780b207f09e5d157a482735daae5b1ed6 100644
--- a/src/ui/ui.module.ts
+++ b/src/ui/ui.module.ts
@@ -85,6 +85,7 @@ import { RegionAccordionTooltipTextPipe } from './util'
 import { HelpOnePager } from "./helpOnePager/helpOnePager.component";
 import { RegionalFeaturesModule } from "./regionalFeatures";
 import { Landmark2DModule } from "./nehubaContainer/2dLandmarks/module";
+import { ViewerCtrlModule } from "src/viewerCtrl";
 
 @NgModule({
   imports : [
@@ -105,6 +106,7 @@ import { Landmark2DModule } from "./nehubaContainer/2dLandmarks/module";
     FabSpeedDialModule,
     RegionalFeaturesModule,
     Landmark2DModule,
+    ViewerCtrlModule,
   ],
   declarations : [
     NehubaContainer,
diff --git a/src/viewerCtrl/index.ts b/src/viewerCtrl/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..32598a8ce9159499453bb4e35ae719bb7448e983
--- /dev/null
+++ b/src/viewerCtrl/index.ts
@@ -0,0 +1 @@
+export { ViewerCtrlModule } from './module'
\ No newline at end of file
diff --git a/src/viewerCtrl/module.ts b/src/viewerCtrl/module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dd1a100beeba314400417dc5ac19670bf090bde4
--- /dev/null
+++ b/src/viewerCtrl/module.ts
@@ -0,0 +1,21 @@
+import { CommonModule } from "@angular/common";
+import { NgModule } from "@angular/core";
+import { AngularMaterialModule } from "src/ui/sharedModules/angularMaterial.module";
+import { ViewerCtrlCmp } from "./viewerCtrlCmp/viewerCtrlCmp.component";
+
+// Migrate to viewer specific submodule when merged to dev
+
+@NgModule({
+  imports: [
+    CommonModule,
+    AngularMaterialModule,
+  ],
+  declarations: [
+    ViewerCtrlCmp,
+  ],
+  exports: [
+    ViewerCtrlCmp
+  ]
+})
+
+export class ViewerCtrlModule{}
\ No newline at end of file
diff --git a/src/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.ts b/src/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..93e6f3def9078f23195e9bea73dac0165214c17f
--- /dev/null
+++ b/src/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.ts
@@ -0,0 +1,65 @@
+import { Component, HostBinding } from "@angular/core";
+import { select, Store } from "@ngrx/store";
+import { Subscription } from "rxjs";
+import { viewerStateSelectedTemplatePureSelector } from "src/services/state/viewerState/selectors";
+
+
+@Component({
+  selector: 'viewer-ctrl-component',
+  templateUrl: './viewerCtrlCmp.template.html',
+  styleUrls: [
+    './viewerCtrlCmp.style.css'
+  ],
+  exportAs: 'viewerCtrlCmp'
+})
+
+export class ViewerCtrlCmp{
+
+  @HostBinding('attr.darktheme')
+  darktheme = false
+
+  private sub: Subscription[] = []
+  private hiddenLayerNames: string[] = []
+
+  constructor(
+    private store$: Store<any>
+  ){
+
+    this.sub.push(
+      this.store$.pipe(
+        select(viewerStateSelectedTemplatePureSelector)
+      ).subscribe(tmpl => {
+        const { useTheme } = tmpl || {}
+        this.darktheme = useTheme === 'dark'
+      })
+    )
+
+  }
+
+  public toggleParcVsbl(){
+    const visibleParcLayers = ((window as any).viewer.layerManager.managedLayers)
+      .slice(1)
+      .filter(({ visible }) => visible)
+
+    const allParcHidden = visibleParcLayers.length === 0
+    
+    if (allParcHidden) {
+      for (const name of this.hiddenLayerNames) {
+        const l = (window as any).viewer.layerManager.getLayerByName(name)
+        l && l.setVisible(true)
+      }
+      this.hiddenLayerNames = []
+    } else {
+      this.hiddenLayerNames = []
+      for (const { name } of visibleParcLayers) {
+        const l = (window as any).viewer.layerManager.getLayerByName(name)
+        l && l.setVisible(false)
+        this.hiddenLayerNames.push( name )
+      }
+    }
+    
+    setTimeout(() => {
+      (window as any).viewer.display.scheduleRedraw()
+    })
+  }
+}
\ No newline at end of file
diff --git a/src/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.style.css b/src/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.style.css
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.template.html b/src/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.template.html
new file mode 100644
index 0000000000000000000000000000000000000000..2ba8e30622edf364319af102febfd0fe26d6d30c
--- /dev/null
+++ b/src/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.template.html
@@ -0,0 +1,14 @@
+<h3 class="iv-custom-comp text mat-title">
+  Parcellations
+</h3>
+
+<mat-divider></mat-divider>
+
+<button mat-flat-button color="warn"
+  class="mt-2"
+  (click)="toggleParcVsbl()">
+  <i class="fas fa-eye-slash"></i>
+  <span>
+    Clear All
+  </span>
+</button>
\ No newline at end of file