diff --git a/b_asic/GUI/gui_interface.py b/b_asic/GUI/gui_interface.py
index c087ee1ef038225cdcd8e1f5fd9487c48918a918..760e46449c8e074a1e91f4e3bf73edd5cccd4501 100644
--- a/b_asic/GUI/gui_interface.py
+++ b/b_asic/GUI/gui_interface.py
@@ -121,6 +121,8 @@ class Ui_main_window(object):
         self.keybindsBASIC.setObjectName("keybindsBASIC")
         self.aboutBASIC = QtWidgets.QAction(main_window)
         self.aboutBASIC.setObjectName("aboutBASIC")
+        self.documentationBASIC = QtWidgets.QAction(main_window)
+        self.documentationBASIC.setObjectName("documentationBASIC")
         self.file_menu.addAction(self.load_menu)
         self.file_menu.addAction(self.save_menu)
         self.file_menu.addAction(self.load_operations)
@@ -132,6 +134,7 @@ class Ui_main_window(object):
         self.edit_menu.addAction(self.unselect_all)
         self.run_menu.addAction(self.actionShowPC)
         self.run_menu.addAction(self.actionSimulateSFG)
+        self.help_menu.addAction(self.documentationBASIC)
         self.help_menu.addAction(self.faqBASIC)
         self.help_menu.addAction(self.keybindsBASIC)
         self.help_menu.addSeparator()
@@ -185,6 +188,7 @@ class Ui_main_window(object):
         self.aboutBASIC.setText(_translate("main_window", "&About B-ASIC"))
         self.faqBASIC.setText(_translate("main_window", "&FAQ"))
         self.keybindsBASIC.setText(_translate("main_window", "&Keybinds"))
+        self.documentationBASIC.setText(_translate("main_window", "&Documentation"))
         self.load_menu.setText(_translate("main_window", "&Load SFG"))
         self.save_menu.setText(_translate("main_window", "&Save SFG"))
         self.load_operations.setText(_translate("main_window", "Load &operations"))
diff --git a/b_asic/GUI/main_window.py b/b_asic/GUI/main_window.py
index 0a7c19b84817ee61f82644d977ee9c687063951f..cfc0fa7c00f664d381391cf566ea45cae1e3e816 100644
--- a/b_asic/GUI/main_window.py
+++ b/b_asic/GUI/main_window.py
@@ -9,10 +9,11 @@ import importlib.util
 import logging
 import os
 import sys
+import webbrowser
 from collections import deque
 from typing import TYPE_CHECKING, Deque, Dict, List, Optional, Sequence, Tuple, cast
 
-from qtpy.QtCore import QCoreApplication, QFileInfo, QSettings, QSize, Qt, QThread
+from qtpy.QtCore import QCoreApplication, QFileInfo, QSettings, QSize, Qt, QThread, Slot
 from qtpy.QtGui import QCursor, QIcon, QKeySequence, QPainter
 from qtpy.QtWidgets import (
     QAction,
@@ -139,10 +140,15 @@ class SFGMainWindow(QMainWindow):
 
         self._ui.actionShowPC.triggered.connect(self._show_precedence_graph)
         self._ui.actionSimulateSFG.triggered.connect(self.simulate_sfg)
+
+        # About menu
         self._ui.faqBASIC.triggered.connect(self.display_faq_page)
         self._ui.faqBASIC.setShortcut(QKeySequence("Ctrl+?"))
         self._ui.aboutBASIC.triggered.connect(self.display_about_page)
         self._ui.keybindsBASIC.triggered.connect(self.display_keybindings_page)
+        self._ui.documentationBASIC.triggered.connect(self._open_documentation)
+
+        # Operation lists
         self._ui.core_operations_list.itemClicked.connect(
             self._on_list_widget_item_clicked
         )
@@ -857,6 +863,11 @@ class SFGMainWindow(QMainWindow):
         # Kinda buggy because of the separate window in the same thread.
         self._simulation_dialog.simulate.connect(self._simulate_sfg)
 
+    @Slot()
+    def _open_documentation(self, event=None) -> None:
+        """Callback to open documentation web page."""
+        webbrowser.open_new_tab("https://da.gitlab-pages.liu.se/B-ASIC/")
+
     def display_faq_page(self, event=None) -> None:
         if self._faq_page is None:
             self._faq_page = FaqWindow(self)