diff --git a/ivette/src/dome/main/dome.ts b/ivette/src/dome/main/dome.ts
index fb3f50674bf0a988db0808c1ac279ca9d0d2e4fc..9ab3ca18f76f7f9c695166ab8ea33a3fe241f931 100644
--- a/ivette/src/dome/main/dome.ts
+++ b/ivette/src/dome/main/dome.ts
@@ -167,6 +167,7 @@ function obtainGlobalSettings() {
 type Store = { [key: string]: unknown };
 
 interface Handle {
+  primary: boolean; // Primary window
   window: BrowserWindow; // Also prevents Gc
   frame: Electron.Rectangle; // Window frame
   devtools: boolean; // Developper tools visible
@@ -348,6 +349,7 @@ function lookupConfig(pwd = '.') {
 // --------------------------------------------------------------------------
 
 function createBrowserWindow(
+  primary: boolean,
   config: BrowserWindowConstructorOptions,
   argv?: string[],
   wdir?: string,
@@ -387,6 +389,7 @@ function createBrowserWindow(
   const wid = webContents.id;
 
   const handle: Handle = {
+    primary,
     window: theWindow,
     config: configFile,
     reloaded: false,
@@ -487,7 +490,7 @@ function createPrimaryWindow() {
   applyThemeSettings(globals);
 
   // Create Window
-  createBrowserWindow({ title: appName }, argv, wdir);
+  createBrowserWindow(true, { title: appName }, argv, wdir);
 }
 
 let appCount = 1;
@@ -503,13 +506,15 @@ function createSecondaryWindow(
     argString = argString.substring(argStart.length);
     const electronArgv = JSON.parse(argString);
     const argv = stripElectronArgv(electronArgv);
-    createBrowserWindow({ title: `${appName} #${++appCount}` }, argv, wdir);
+    const title = `${appName} #${++appCount}`;
+    createBrowserWindow(false, { title }, argv, wdir);
   }
 }
 
 function createDesktopWindow() {
   const wdir = app.getPath('home');
-  createBrowserWindow({ title: `${appName} #${++appCount}` }, [], wdir);
+  const title = `${appName} #${++appCount}`;
+  createBrowserWindow(false, { title }, [], wdir);
 }
 
 // --------------------------------------------------------------------------
@@ -541,7 +546,8 @@ let PreferenceWindow: BrowserWindow | undefined;
 
 function showSettingsWindow() {
   if (!PreferenceWindow)
-    PreferenceWindow = createBrowserWindow({
+    PreferenceWindow = createBrowserWindow(
+      false, {
       title: `${appName} Settings`,
       width: 256,
       height: 248,
@@ -625,7 +631,7 @@ export function start() {
 // --------------------------------------------------------------------------
 
 /**
-    Define a custom main window menu.
+   Define a custom main window menu.
 */
 export function addMenu(label: string) {
   Menubar.addMenu(label);
@@ -645,9 +651,21 @@ export function setMenuItem(spec: Menubar.CustomMenuItem) {
   Menubar.setMenuItem(spec);
 }
 
-ipcMain.on('dome.ipc.menu.addmenu', (_evt, label) => addMenu(label));
-ipcMain.on('dome.ipc.menu.addmenuitem', (_evt, spec) => addMenuItem(spec));
-ipcMain.on('dome.ipc.menu.setmenuitem', (_evt, spec) => setMenuItem(spec));
+function isPrimary(evt: IpcMainEvent): boolean {
+  const h = WindowHandles.get(evt.sender.id);
+  return h ? h.primary : false;
+}
+
+ipcMain.on('dome.ipc.menu.addmenu', (evt, label) =>
+  isPrimary(evt) && Menubar.addMenu(label)
+);
+ipcMain.on('dome.ipc.menu.addmenuitem', (evt, spec) =>
+  isPrimary(evt) && Menubar.addMenuItem(spec)
+);
+ipcMain.on('dome.ipc.menu.setmenuitem', (_evt, spec) =>
+  // Always update menu items
+  Menubar.setMenuItem(spec)
+);
 
 // --------------------------------------------------------------------------
 // --- Dialogs Management
diff --git a/ivette/src/dome/renderer/dome.tsx b/ivette/src/dome/renderer/dome.tsx
index 51eb64b19f4f5f77a58e6cb45c3ecacd0fcfc471..7fb76ae8e9dd3ad5d000e8eb6012a90cf78c1737 100644
--- a/ivette/src/dome/renderer/dome.tsx
+++ b/ivette/src/dome/renderer/dome.tsx
@@ -364,13 +364,15 @@ const customItemCallbacks = new Map<string, callback>();
 /**
    Create a new custom menu in the menu bar.
 
-   This function can be triggered at any time, and will eventually trigger
-   an update of the whole application menubar.
+
+   This function shall be called statically, although calls from _secondary_
+   windows would be ignored. It is also possible to call this function from the
+   main process.
 
    It is also possible to call this function from the main process.
 
    @param label - the menu title (shall be unique)
-*/
+ */
 export function addMenu(label: string) {
   ipcRenderer.send('dome.ipc.menu.addmenu', label);
 }
@@ -399,8 +401,7 @@ export interface MenuItemProps {
   onClick?: () => void;
 }
 
-/**
-   Inserts a new custom item in a menu.
+/** Inserts a new custom item in a menu.
 
    The menu can be modified later with [[setMenuItem]].
 
@@ -408,15 +409,15 @@ export interface MenuItemProps {
    event on all application windows.  The item callback, if any, is invoked only
    in the process that specify it.
 
-   Key short cuts shall be specified with the following codes:
-   - `"Cmd+<Key>"` for command (MacOS) or control (Linux) key
-   - `"Alt+<Key>"` for command+option (MacOS) or alt (Linux) key
-   - `"Meta+<Key>"` for command+shift (MacOS) or control+alt (Linux) key
+   Key short cuts shall be specified with the following codes: - `"Cmd+<Key>"`
+   for command (MacOS) or control (Linux) key - `"Alt+<Key>"` for command+option
+   (MacOS) or alt (Linux) key - `"Meta+<Key>"` for command+shift (MacOS) or
+   control+alt (Linux) key
 
-   This function can be triggered at any time, and will eventually trigger
-   an update of the complete application menubar.
-   It is also possible to call this function from the main process.
-*/
+   This function shall be called statically, although calls from _secondary_
+   windows would be ignored. It is also possible to call this function from the
+   main process.
+ */
 export function addMenuItem(props: MenuItemProps) {
   if (!props.id && props.type !== 'separator') {
     // eslint-disable-next-line no-console
@@ -444,10 +445,6 @@ export interface MenuItemOptions {
    You shall specify `null` to remove the previously registered callback
    (`undefined` callback is ignored).
 
-   This function can be triggered at any time, and will possibly trigger
-   an update of the application menubar if the properties
-   can not be changed dynamically in Electron.
-
    It is also possible to call this function from the main process.
  */
 export function setMenuItem(options: MenuItemOptions) {
@@ -601,7 +598,7 @@ export function useCache<K, V>(r: (k: K) => V, s?: Serialize<K>): (k: K) => V {
     const v = r(k);
     cache.set(id, v);
     return v;
-  }, [ cache, r,  serialize ]);
+  }, [cache, r, serialize]);
   return get;
 }
 
diff --git a/ivette/src/frama-c/plugins/eva/valuetable.tsx b/ivette/src/frama-c/plugins/eva/valuetable.tsx
index 00c3b7738bac9049344c90b3addc42ce9b28d34f..5f0aef4d0a9f6fd0e24d1e82978ccbda8e8b9ef6 100644
--- a/ivette/src/frama-c/plugins/eva/valuetable.tsx
+++ b/ivette/src/frama-c/plugins/eva/valuetable.tsx
@@ -914,6 +914,15 @@ interface EvaluationModeProps {
   setLocPin: (loc: Location, pin: boolean) => void;
 }
 
+Dome.addMenuItem({
+  menu: 'Edit',
+  id: 'EvaluateMenu',
+  type: 'normal',
+  label: 'Evaluate',
+  key: 'Cmd+E',
+  onClick: () => evaluateEvent.emit(),
+});
+
 function useEvaluationMode(props: EvaluationModeProps): void {
   const { computationState, selection, setLocPin } = props;
   const handleError = (): void => { return; };
@@ -941,14 +950,6 @@ function useEvaluationMode(props: EvaluationModeProps): void {
     Toolbars.RegisterMode.emit(evalMode);
     return () => Toolbars.UnregisterMode.emit(evalMode);
   });
-  Dome.addMenuItem({
-    menu: 'Edit',
-    id: 'EvaluateMenu',
-    type: 'normal',
-    label: 'Evaluate',
-    key: 'Cmd+E',
-    onClick: () => evaluateEvent.emit(),
-  });
   React.useEffect(() => {
     Dome.setMenuItem({ id: 'EvaluateMenu', enabled: true });
     return () => Dome.setMenuItem({ id: 'EvaluateMenu', enabled: false });