diff --git a/src/simudator/gui/cpu_graphics_scene.py b/src/simudator/gui/cpu_graphics_scene.py
index 25a8c40796aeb670a71b27aedfefba3f0c2dd6e9..748870b4b8a9b060bdb02d9046f53d68b9147759 100644
--- a/src/simudator/gui/cpu_graphics_scene.py
+++ b/src/simudator/gui/cpu_graphics_scene.py
@@ -166,6 +166,7 @@ class CpuGraphicsScene(QGraphicsScene):
 
         for item in self.module_graphics_items.values():
             item.setFlag(QGraphicsItem.ItemIsMovable, not is_layout_locked)
+            item.setLocked(is_layout_locked)
 
         for item in self.signal_graphics_items:
             item.setFlag(QGraphicsItem.ItemIsMovable, not is_layout_locked)
diff --git a/src/simudator/gui/module_graphics_item/module_graphics_item.py b/src/simudator/gui/module_graphics_item/module_graphics_item.py
index 2041f152eadf62e8228ec2cb87e85ef48e9f85c4..eed66c67338029ff4e8a88b5f36bd2987a16d062 100644
--- a/src/simudator/gui/module_graphics_item/module_graphics_item.py
+++ b/src/simudator/gui/module_graphics_item/module_graphics_item.py
@@ -59,6 +59,8 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem):
 
         self.actions = []
 
+        self.isLocked = False
+
         # Do general draw
         self.draw_graphics_item()
 
@@ -197,6 +199,10 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem):
         for action in self.actions:
             menu.addAction(action)
             action.setData(self.name)
+        show_ports_action = QAction("Show all ports", menu)
+        show_ports_action.triggered.connect(self.showPorts)
+        show_ports_action.setEnabled(not self.isLocked)
+        menu.addAction(show_ports_action)
         return menu
 
     def getPortNames(self) -> list[str]:
@@ -235,6 +241,11 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem):
         """
         return action.data()
 
+    def setLocked(self, locked: bool) -> None:
+        self.isLocked = locked
+        for port in self.ports:
+            port.setLocked(locked)
+
     def load_state_from_str(self, state_str) -> None:
         state = state_str.split()
 
diff --git a/src/simudator/gui/port_graphics_item.py b/src/simudator/gui/port_graphics_item.py
index 8f8fe57325059dd031ef127c4e0391964fff7379..095d24f15f114d8563efb2b8d01087da76a883fd 100644
--- a/src/simudator/gui/port_graphics_item.py
+++ b/src/simudator/gui/port_graphics_item.py
@@ -3,10 +3,12 @@ from typing import Optional
 
 from PyQt5.QtCore import QObject, QPointF, Qt, pyqtSignal
 from PyQt5.QtWidgets import (
+    QAction,
     QGraphicsItemGroup,
     QGraphicsLineItem,
     QGraphicsSceneMouseEvent,
     QGraphicsSimpleTextItem,
+    QMenu,
 )
 
 from simudator.core.signal import Signal
@@ -51,6 +53,7 @@ class PortGraphicsItem(QGraphicsItemGroup):
         self.parent = parent
         self.signal = signal
         self.orientation = orientation
+        self.isLocked = False
 
         # Set up pyqt signals using a QObject instance since inheriting from
         # QObject or QGraphicsObject directly does not work with subclasses
@@ -58,6 +61,7 @@ class PortGraphicsItem(QGraphicsItemGroup):
         self.pyqtSignalHolder = PyQtSignalHolder()
         self.moved = self.pyqtSignalHolder.moved
         self.toggled = self.pyqtSignalHolder.toggled
+
         self.drawPort()
         self.setOrientation(orientation)
         self.left_click = False
@@ -165,13 +169,13 @@ class PortGraphicsItem(QGraphicsItemGroup):
         if event.button() == Qt.MouseButton.LeftButton:
             self.left_click = True
 
-        elif event.button() == Qt.MouseButton.RightButton:
-            self.toggled.emit()
         event.accept()
 
     def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None:
         if not self.left_click and self.parent is not None:
             return
+        if self.isLocked:
+            return
 
         # Get mouses relative position to parent
         current_mouse_point = event.scenePos()
@@ -217,9 +221,24 @@ class PortGraphicsItem(QGraphicsItemGroup):
             self.left_click = False
 
     def contextMenuEvent(self, event: QGraphicsSceneMouseEvent) -> None:
-        # We do this so no menu is showen when right clicking a port
+        menu = QMenu()
+        hide_signal_action = QAction("Toggle signal visibility", menu)
+        hide_signal_action.triggered.connect(self.toggled)
+        hide_signal_action.setEnabled(not self.isLocked)
+
+        hide_port_action = QAction("Toggle port visibility", menu)
+        hide_port_action.triggered.connect(self.toggleVisibility)
+        hide_port_action.setEnabled(not self.isLocked)
+
+        menu.addAction(hide_signal_action)
+        menu.addAction(hide_port_action)
+        menu.exec_(event.screenPos())
         event.accept()
 
+    def toggleVisibility(self) -> None:
+        self.setVisible(not self.isVisible())
+        self.toggled.emit()
+
     def getDisplayName(self) -> str:
         return self.name
 
@@ -232,5 +251,8 @@ class PortGraphicsItem(QGraphicsItemGroup):
     def setNameVisibility(self, is_visible):
         self.name_label.setVisible(is_visible)
 
+    def setLocked(self, locked: bool) -> None:
+        self.isLocked = locked
+
     def getOrientation(self) -> Orientation:
         return self.orientation