diff --git a/editor/css/editor.css b/editor/css/editor.css
index ea32a7da121b4c0a4c3c191a96f17a4562220278..e5b20484140b0fd6c87fa5671287146bcadb5c0d 100644
--- a/editor/css/editor.css
+++ b/editor/css/editor.css
@@ -13,3 +13,7 @@ div#ks-editor section > * {
 div#ks-editor *.selected {
     background-color: lightblue;
 }
+
+div#ks-editor *.hidden {
+    display: none;
+}
diff --git a/editor/editor.php b/editor/editor.php
index 96866b5b68ddb17b7c521ec049b969d853b2aa76..6818b7b02a282d897bc3630461d7148cf2c1b7fa 100644
--- a/editor/editor.php
+++ b/editor/editor.php
@@ -2,6 +2,7 @@
     <h1>Interface</h1>
     <div id="2d-graph"></div>
     <section id="toolbar"></section>
+    <section id="tool-menu" class="hidden"></section>
     <section>
         <h3 id="selected-item">Nothing selected</h3>
         <ul id="selected-params"></ul>
diff --git a/editor/js/state.js b/editor/js/state.js
index d779f3dd07b89a439c9c0289176fc3990b5d19e5..f160dea7f54d8663278685cdeb9e55b6fc2a55e2 100644
--- a/editor/js/state.js
+++ b/editor/js/state.js
@@ -49,7 +49,7 @@ export class State extends Tool {
         }
 
         if (this.tool !== undefined) {
-            this.tool.onToolDeactivate(tool);
+            this.tool.deactivateTool(tool);
         }
 
         this.previousTool = this.tool;
@@ -57,7 +57,7 @@ export class State extends Tool {
         this.display.setSelectedTool(tool);
 
         if (this.tool !== undefined) {
-            this.tool.onToolActivate();
+            this.tool.activateTool();
         }
     }
 
diff --git a/editor/js/tools/menus/connectmenu.js b/editor/js/tools/menus/connectmenu.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/editor/js/tools/menus/toolmenu.js b/editor/js/tools/menus/toolmenu.js
new file mode 100644
index 0000000000000000000000000000000000000000..aeba38883633fe023d7fbc31af460af872947bd2
--- /dev/null
+++ b/editor/js/tools/menus/toolmenu.js
@@ -0,0 +1,16 @@
+import jQuery from "jquery";
+
+export default class ToolMenu {
+    constructor(tool) {
+        this.tool = tool;
+        this.menuId = this.tool.getKey() + "-menu";
+    }
+
+    show() {
+        jQuery("#" + this.menuId).removeClass("hidden");
+    }
+
+    hide() {
+        jQuery("#" + this.menuId).addClass("hidden");
+    }
+}
diff --git a/editor/js/tools/tool.js b/editor/js/tools/tool.js
index e3fade0276387f02f241a2fa77797eef2f48392e..e2470d83fac6b820bf01f16b191f5f87f914e25f 100644
--- a/editor/js/tools/tool.js
+++ b/editor/js/tools/tool.js
@@ -4,6 +4,7 @@ export default class Tool {
         this.icon = icon;
         this.key = key;
         this.warnings = false;
+        this.menu = undefined;
     }
 
     getName() {
@@ -18,18 +19,28 @@ export default class Tool {
         return this.icon;
     }
 
-    onToolActivate() {
-        if (this.warnings) {
-            console.warn('Method "onToolActivate" not implemented.');
+    activateTool() {
+        if (this.menu !== undefined) {
+            this.menu.show();
         }
+
+        this.onToolActivate();
     }
 
-    onToolDeactivate(nextTool) {
-        if (this.warnings) {
-            console.warn('Method "onToolDeactivate" not implemented.');
+    deactivateTool(nextTool) {
+        this.onToolDeactivate(nextTool);
+
+        if (this.menu !== undefined) {
+            this.menu.hide();
         }
     }
 
+    onToolActivate() {
+    }
+
+    onToolDeactivate(nextTool) {
+    }
+
     onNodeClick(node) {
         if (this.warnings) {
             console.warn('Method "onNodeClick" not implemented.');