diff --git a/static/components.interfaces.ts b/static/components.interfaces.ts
index a69dfed1a768a258343195df27a5a03c5dbbfe9d..65ed06c11bf797e6607abb96fae4967ea2a41ce9 100644
--- a/static/components.interfaces.ts
+++ b/static/components.interfaces.ts
@@ -25,6 +25,7 @@
 import {CompilerOutputOptions} from '../types/features/filters.interfaces';
 import {CfgState} from './panes/cfg-view.interfaces';
 import {LLVMOptPipelineViewState} from './panes/llvm-opt-pipeline.interfaces';
+import {GccDumpViewState} from './panes/gccdump-view.interfaces';
 export const COMPILER_COMPONENT_NAME = 'compiler';
 export const EXECUTOR_COMPONENT_NAME = 'executor';
 export const EDITOR_COMPONENT_NAME = 'codeEditor';
@@ -153,27 +154,12 @@ export type PopulatedAstViewState = StateWithId &
     };
 
 export type EmptyGccDumpViewState = EmptyState;
-export type GccDumpOptions =
-    | 'treeDump'
-    | 'rtlDump'
-    | 'ipaDump'
-    | 'addressOption'
-    | 'slimOption'
-    | 'rawOption'
-    | 'detailsOption'
-    | 'statsOption'
-    | 'blocksOption'
-    | 'vopsOption'
-    | 'linenoOption'
-    | 'uidOption'
-    | 'allOption'
-    | 'selectedPass';
-export type PopulatedGccDumpViewState = {
-    _compilerid: string;
-    _compilerName: string;
-    _editorid: number;
-    _treeid: number;
-} & (Record<GccDumpOptions, unknown> | EmptyState);
+export type PopulatedGccDumpViewState = StateWithId &
+    GccDumpViewState & {
+        compilerName: string;
+        editorid: number;
+        treeid: number;
+    };
 
 export type EmptyCfgViewState = EmptyState;
 export type PopulatedCfgViewState = StateWithId &
diff --git a/static/components.ts b/static/components.ts
index 85cabb9da4d99f131e3edc1fce643ff2d78b1eeb..88015096c959f798a67c154b11f07fcc7405360f 100644
--- a/static/components.ts
+++ b/static/components.ts
@@ -23,6 +23,8 @@
 // POSSIBILITY OF SUCH DAMAGE.
 
 import {ParseFiltersAndOutputOptions} from '../types/features/filters.interfaces';
+import {GccDumpViewState} from './panes/gccdump-view.interfaces';
+
 import {
     EmptyCompilerState,
     ComponentConfig,
@@ -50,7 +52,6 @@ import {
     PopulatedAstViewState,
     EmptyGccDumpViewState,
     PopulatedGccDumpViewState,
-    GccDumpOptions,
     EmptyCfgViewState,
     PopulatedCfgViewState,
     PopulatedConformanceViewState,
@@ -473,41 +474,25 @@ export function getGccDumpView(): ComponentConfig<EmptyGccDumpViewState> {
 
 /** Get a gcc dump view with the given configuration. */
 export function getGccDumpViewWith(
-    id: string,
+    id: number,
     compilerName: string,
     editorid: number,
     treeid: number,
-    gccDumpOutput?: Record<GccDumpOptions, unknown>
+    gccDumpOutput: GccDumpViewState
 ): ComponentConfig<PopulatedGccDumpViewState> {
-    // TODO: remove any
-    const ret: any = {
-        _compilerid: id,
-        _compilerName: compilerName,
-        _editorid: editorid,
-        _treeid: treeid,
-    };
-
-    if (gccDumpOutput) {
-        ret.treeDump = gccDumpOutput.treeDump;
-        ret.rtlDump = gccDumpOutput.rtlDump;
-        ret.ipaDump = gccDumpOutput.ipaDump;
-        ret.addressOption = gccDumpOutput.addressOption;
-        ret.slimOption = gccDumpOutput.slimOption;
-        ret.rawOption = gccDumpOutput.rawOption;
-        ret.detailsOption = gccDumpOutput.detailsOption;
-        ret.statsOption = gccDumpOutput.statsOption;
-        ret.blocksOption = gccDumpOutput.blocksOption;
-        ret.vopsOption = gccDumpOutput.vopsOption;
-        ret.linenoOption = gccDumpOutput.linenoOption;
-        ret.uidOption = gccDumpOutput.uidOption;
-        ret.allOption = gccDumpOutput.allOption;
-        ret.selectedPass = gccDumpOutput.selectedPass;
-    }
-
     return {
         type: 'component',
         componentName: GCC_DUMP_VIEW_COMPONENT_NAME,
-        componentState: ret,
+        componentState: {
+            // PopulatedGccDumpViewState
+            id,
+            compilerName,
+            editorid,
+            treeid,
+
+            // & GccDumpFiltersState
+            ...gccDumpOutput,
+        },
     };
 }
 
diff --git a/static/event-map.ts b/static/event-map.ts
index 5fb63421ea05555cc280251240d3101fdada3dca..57bc5d58ff56e19b6951500ab1bcd69512cf7935 100644
--- a/static/event-map.ts
+++ b/static/event-map.ts
@@ -28,7 +28,7 @@ import {MessageWithLocation} from '../types/resultline/resultline.interfaces';
 import {SiteSettings} from './settings';
 import {Theme} from './themes';
 import {PPOptions} from './panes/pp-view.interfaces';
-import {GccSelectedPass} from './panes/gccdump-view.interfaces';
+import {GccDumpFiltersState, GccDumpViewSelectedPass} from './panes/gccdump-view.interfaces';
 import {Motd} from './motd.interfaces';
 import {CompilerInfo} from '../types/compiler.interfaces';
 import {CompilationResult} from '../types/compilation/compilation.interfaces';
@@ -92,8 +92,8 @@ export type EventMap = {
     findExecutors: () => void;
     flagsViewClosed: (compilerId: number, options: string) => void;
     flagsViewOpened: (compilerId: number) => void;
-    gccDumpFiltersChanged: (compilerId: number, filters: CompilerOutputOptions, recompile: boolean) => void;
-    gccDumpPassSelected: (compilerId: number, pass: GccSelectedPass, recompile: boolean) => void;
+    gccDumpFiltersChanged: (compilerId: number, state: GccDumpFiltersState, recompile: boolean) => void;
+    gccDumpPassSelected: (compilerId: number, pass: GccDumpViewSelectedPass, recompile: boolean) => void;
     gccDumpUIInit: (compilerId: number) => void;
     gccDumpViewClosed: (compilerId: number) => void;
     gccDumpViewOpened: (compilerId: number) => void;
diff --git a/static/panes/compiler.ts b/static/panes/compiler.ts
index 0ef070db99da8a8804f340592b5110861ff4bcaa..28aaa1c68a136470c3e8bc85ce0ca8a8427a3c5c 100644
--- a/static/panes/compiler.ts
+++ b/static/panes/compiler.ts
@@ -51,8 +51,7 @@ import {CompilerState} from './compiler.interfaces';
 import {ComponentConfig, ToolViewState} from '../components.interfaces';
 import {FiledataPair} from '../multifile-service';
 import {LanguageLibs} from '../options.interfaces';
-import {GccSelectedPass} from './gccdump-view.interfaces';
-import {CompilerOutputOptions} from '../../types/features/filters.interfaces';
+import {GccDumpFiltersState, GccDumpViewSelectedPass} from './gccdump-view.interfaces';
 import {Tool} from '../../lib/tooling/base-tool.interface';
 import {AssemblyInstructionInfo} from '../../lib/asm-docs/base';
 import {PPOptions} from './pp-view.interfaces';
@@ -128,7 +127,7 @@ type CompileRequestOptions = {
         produceAst: boolean;
         produceGccDump: {
             opened: boolean;
-            pass?: GccSelectedPass;
+            pass?: GccDumpViewSelectedPass;
             treeDump?: boolean;
             rtlDump?: boolean;
             ipaDump?: boolean;
@@ -295,7 +294,7 @@ export class Compiler extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Co
     private irViewOpen: boolean;
     private llvmOptPipelineViewOpen: boolean;
     private gccDumpViewOpen: boolean;
-    private gccDumpPassSelected?: GccSelectedPass;
+    private gccDumpPassSelected?: GccDumpViewSelectedPass;
     private treeDumpEnabled?: boolean;
     private rtlDumpEnabled?: boolean;
     private ipaDumpEnabled?: boolean;
@@ -627,7 +626,7 @@ export class Compiler extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Co
 
         const createGccDumpView = () => {
             return Components.getGccDumpViewWith(
-                this.id as unknown as string,
+                this.id,
                 this.getCompilerName(),
                 this.sourceEditorId ?? 0,
                 this.sourceTreeId ?? 0,
@@ -2155,24 +2154,24 @@ export class Compiler extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Co
 
     onGccDumpFiltersChanged(
         id: number,
-        filters: CompilerOutputOptions & Record<string, boolean | undefined>,
+        dumpOpts: GccDumpFiltersState,
         reqCompile: boolean
     ): void {
         if (this.id === id) {
-            this.treeDumpEnabled = filters.treeDump !== false;
-            this.rtlDumpEnabled = filters.rtlDump !== false;
-            this.ipaDumpEnabled = filters.ipaDump !== false;
+            this.treeDumpEnabled = dumpOpts.treeDump;
+            this.rtlDumpEnabled = dumpOpts.rtlDump;
+            this.ipaDumpEnabled = dumpOpts.ipaDump;
             this.dumpFlags = {
-                address: filters.addressOption !== false,
-                slim: filters.slimOption !== false,
-                raw: filters.rawOption !== false,
-                details: filters.detailsOption !== false,
-                stats: filters.statsOption !== false,
-                blocks: filters.blocksOption !== false,
-                vops: filters.vopsOption !== false,
-                lineno: filters.linenoOption !== false,
-                uid: filters.uidOption !== false,
-                all: filters.allOption !== false,
+                address: dumpOpts.addressOption,
+                slim: dumpOpts.slimOption,
+                raw: dumpOpts.rawOption,
+                details: dumpOpts.detailsOption,
+                stats: dumpOpts.statsOption,
+                blocks: dumpOpts.blocksOption,
+                vops: dumpOpts.vopsOption,
+                lineno: dumpOpts.linenoOption,
+                uid: dumpOpts.uidOption,
+                all: dumpOpts.allOption,
             };
 
             if (reqCompile) {
@@ -2181,7 +2180,7 @@ export class Compiler extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Co
         }
     }
 
-    onGccDumpPassSelected(id: number, passObject?: GccSelectedPass, reqCompile?: boolean) {
+    onGccDumpPassSelected(id: number, passObject?: GccDumpViewSelectedPass, reqCompile?: boolean) {
         if (this.id === id) {
             this.gccDumpPassSelected = passObject;
 
diff --git a/static/panes/gccdump-view.interfaces.ts b/static/panes/gccdump-view.interfaces.ts
index 9afcb7b396f7f8e51844a2c1b828e3066d5b8c26..5fa43ad7cdbbb2ad4c8afd787062c5685c053b76 100644
--- a/static/panes/gccdump-view.interfaces.ts
+++ b/static/panes/gccdump-view.interfaces.ts
@@ -22,33 +22,37 @@
 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 // POSSIBILITY OF SUCH DAMAGE.
 
-export interface GccDumpFilters {
-    treeDump: any;
-    rtlDump: any;
-    ipaDump: any;
-    addressOption: any;
-    slimOption: any;
-    rawOption: any;
-    detailsOption: any;
-    statsOption: any;
-    blocksOption: any;
-    vopsOption: any;
-    linenoOption: any;
-    uidOption: any;
-    allOption: any;
-}
-
-export interface GccDumpState extends GccDumpFilters {
+// Extra information used to serialize the state
+export interface GccDumpViewSelectedPass {
+    // FIXME(dkm): this type needs to be refactored.
+    // In particular, see in gccdump-view.ts:{constructor, getCurrentState}
+    // There is a mix of 'selectedPass' being a filename_prefix and a
+    // GccDumpViewSelectedPass object.
+    filename_suffix: string | null;
+    name: string | null;
+    command_prefix: string | null;
     selectedPass: string | null;
-    // legacy
-    _compilerid?: number;
-    _compilerName?: string;
-    _editorid?: number;
-    _treeid?: number;
 }
 
-export type GccSelectedPass = {
-    filename_suffix: string;
-    name: string;
-    command_prefix: string;
+// This should reflect the corresponding UI widget in gccdump.pug
+// Each optionButton should have a matching boolean here.
+export type GccDumpFiltersState = {
+    treeDump: boolean;
+    rtlDump: boolean;
+    ipaDump: boolean;
+
+    rawOption: boolean;
+    slimOption: boolean;
+    allOption: boolean;
+
+    addressOption: boolean;
+    blocksOption: boolean;
+    linenoOption: boolean;
+    detailsOption: boolean;
+    statsOption: boolean;
+    uidOption: boolean;
+    vopsOption: boolean;
 };
+
+// state = selected pass + all option flags
+export type GccDumpViewState = GccDumpFiltersState & GccDumpViewSelectedPass;
diff --git a/static/panes/gccdump-view.ts b/static/panes/gccdump-view.ts
index eb12b470f5cd267e7250e313ad66ac2fec797838..ce25514e5310d232456821da553c0b30c865da9a 100644
--- a/static/panes/gccdump-view.ts
+++ b/static/panes/gccdump-view.ts
@@ -37,12 +37,11 @@ import {MonacoPane} from './pane';
 import {MonacoPaneState} from './pane.interfaces';
 import * as monacoConfig from '../monaco-config';
 
-import {GccDumpFilters, GccDumpState} from './gccdump-view.interfaces';
+import {GccDumpFiltersState, GccDumpViewState, GccDumpViewSelectedPass} from './gccdump-view.interfaces';
 
 import {ga} from '../analytics';
-import {CompilerOutputOptions} from '../../types/features/filters.interfaces';
 
-export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, GccDumpState> {
+export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, GccDumpViewState> {
     selectize: TomSelect;
     uiIsReady: boolean;
     filters: Toggles;
@@ -77,11 +76,7 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
     cursorSelectionThrottledFunction: ((e: any) => void) & _.Cancelable;
     selectedPass: string | null = null;
 
-    constructor(hub: Hub, container: Container, state: GccDumpState & MonacoPaneState) {
-        if (state._compilerid) state.id = state._compilerid;
-        if (state._compilerName) state.compilerName = state._compilerName;
-        if (state._editorid) state.editorid = state._editorid;
-        if (state._treeid) state.treeid = state._treeid;
+    constructor(hub: Hub, container: Container, state: GccDumpViewState & MonacoPaneState) {
         super(hub, container, state);
 
         if (state.selectedPass && typeof state.selectedPass === 'string') {
@@ -96,10 +91,13 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
             };
             const match = state.selectedPass.match(selectedPassRe);
             if (match) {
-                const selectedPassO = {
+                const selectedPassO : GccDumpViewSelectedPass = {
                     filename_suffix: match[1] + '.' + match[2],
                     name: match[2] + ' (' + passType[match[1]] + ')',
                     command_prefix: '-fdump-' + passType[match[1]] + '-' + match[2],
+
+                    // FIXME(dkm): maybe this could be avoided by better typing.
+                    selectedPass : null,
                 };
 
                 this.eventHub.emit('gccDumpPassSelected', this.compilerInfo.compilerId, selectedPassO, false);
@@ -114,7 +112,7 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
         this.eventHub.emit(
             'gccDumpFiltersChanged',
             this.compilerInfo.compilerId,
-            this.getEffectiveFilters() as CompilerOutputOptions,
+            this.getEffectiveFilters(),
             false
         );
 
@@ -126,11 +124,11 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
         this.eventHub.emit('gccDumpUIInit', this.compilerInfo.compilerId);
     }
 
-    override getInitialHTML() {
+    override getInitialHTML(): string {
         return $('#gccdump').html();
     }
 
-    override createEditor(editorRoot: HTMLElement) {
+    override createEditor(editorRoot: HTMLElement): monaco.editor.IStandaloneCodeEditor {
         return monaco.editor.create(
             editorRoot,
             monacoConfig.extendConfig({
@@ -150,7 +148,7 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
         });
     }
 
-    override registerButtons(state: GccDumpState & MonacoPaneState) {
+    override registerButtons(state: GccDumpViewState & MonacoPaneState) {
         super.registerButtons(state);
 
         const gccdump_picker = this.domRoot.find('.gccdump-pass-picker').get(0);
@@ -385,8 +383,11 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
         }
     }
 
-    getEffectiveFilters() {
-        return this.filters.get();
+    getEffectiveFilters() : GccDumpFiltersState {
+        // This cast only works if gccdump.pug and gccdump-view.interfaces are
+        // kept synchronized. See comment in gccdump-view.interfaces.ts.
+
+        return this.filters.get() as unknown as GccDumpFiltersState;
     }
 
     onFilterChange() {
@@ -397,7 +398,7 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
             this.eventHub.emit(
                 'gccDumpFiltersChanged',
                 this.compilerInfo.compilerId,
-                this.getEffectiveFilters() as unknown as CompilerOutputOptions,
+                this.getEffectiveFilters(),
                 true
             );
         }
@@ -405,12 +406,19 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
 
     override getCurrentState() {
         const parent = super.getCurrentState();
-        const filters = this.getEffectiveFilters() as unknown as GccDumpFilters; // TODO: Validate somehow?
-        const state: MonacoPaneState & GccDumpState = {
+        const filters = this.getEffectiveFilters(); // TODO: Validate somehow?
+        const state: MonacoPaneState & GccDumpViewState = {
             // filters needs to come first, the entire state is given to the toggles and we don't want to override
             // properties such as selectedPass with obsolete values
             ...filters,
+
             selectedPass: this.selectedPass,
+
+            // See FIXME(dkm) comment in gccdump-view.interfaces.ts.
+            filename_suffix: this.selectedPass,
+            name: null,
+            command_prefix: null,
+
             ...parent,
         };
         // TODO(jeremy-rifkin)