diff --git a/b_asic/GUI/gui_interface.py b/b_asic/GUI/gui_interface.py
index 6c384aacd131ac7bf570aa0f75ed8d8d04730b99..a6d9a3b8f436c615201dac8ba7537272573cae00 100644
--- a/b_asic/GUI/gui_interface.py
+++ b/b_asic/GUI/gui_interface.py
@@ -59,30 +59,6 @@ class Ui_main_window(object):
         self.core_operations_list.setWordWrap(False)
         self.core_operations_list.setSelectionRectVisible(False)
         self.core_operations_list.setObjectName("core_operations_list")
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.core_operations_list.addItem(item)
         self.operation_list.addItem(self.core_operations_page, "")
         self.special_operations_page = QtWidgets.QWidget()
         self.special_operations_page.setGeometry(QtCore.QRect(0, 0, 171, 217))
@@ -90,14 +66,6 @@ class Ui_main_window(object):
         self.special_operations_list = QtWidgets.QListWidget(self.special_operations_page)
         self.special_operations_list.setGeometry(QtCore.QRect(10, 0, 141, 81))
         self.special_operations_list.setObjectName("special_operations_list")
-        item = QtWidgets.QListWidgetItem()
-        self.special_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.special_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.special_operations_list.addItem(item)
-        item = QtWidgets.QListWidgetItem()
-        self.special_operations_list.addItem(item)
         self.operation_list.addItem(self.special_operations_page, "")
         main_window.setCentralWidget(self.centralwidget)
         self.menu_bar = QtWidgets.QMenuBar(main_window)
@@ -292,42 +260,10 @@ class Ui_main_window(object):
         self.core_operations_list.setSortingEnabled(False)
         __sortingEnabled = self.core_operations_list.isSortingEnabled()
         self.core_operations_list.setSortingEnabled(False)
-        item = self.core_operations_list.item(0)
-        item.setText(_translate("main_window", "Addition"))
-        item = self.core_operations_list.item(1)
-        item.setText(_translate("main_window", "Subtraction"))
-        item = self.core_operations_list.item(2)
-        item.setText(_translate("main_window", "Multiplication"))
-        item = self.core_operations_list.item(3)
-        item.setText(_translate("main_window", "Division"))
-        item = self.core_operations_list.item(4)
-        item.setText(_translate("main_window", "Constant"))
-        item = self.core_operations_list.item(5)
-        item.setText(_translate("main_window", "Constant multiplication"))
-        item = self.core_operations_list.item(6)
-        item.setText(_translate("main_window", "Square root"))
-        item = self.core_operations_list.item(7)
-        item.setText(_translate("main_window", "Complex conjugate"))
-        item = self.core_operations_list.item(8)
-        item.setText(_translate("main_window", "Absolute"))
-        item = self.core_operations_list.item(9)
-        item.setText(_translate("main_window", "Max"))
-        item = self.core_operations_list.item(10)
-        item.setText(_translate("main_window", "Min"))
-        item = self.core_operations_list.item(11)
-        item.setText(_translate("main_window", "Butterfly"))
         self.core_operations_list.setSortingEnabled(__sortingEnabled)
         self.operation_list.setItemText(self.operation_list.indexOf(self.core_operations_page), _translate("main_window", "Core operations"))
         __sortingEnabled = self.special_operations_list.isSortingEnabled()
         self.special_operations_list.setSortingEnabled(False)
-        item = self.special_operations_list.item(0)
-        item.setText(_translate("main_window", "Input"))
-        item = self.special_operations_list.item(1)
-        item.setText(_translate("main_window", "Output"))
-        item = self.special_operations_list.item(2)
-        item.setText(_translate("main_window", "Register"))
-        item = self.special_operations_list.item(3)
-        item.setText(_translate("main_window", "Custom"))
         self.special_operations_list.setSortingEnabled(__sortingEnabled)
         self.operation_list.setItemText(self.operation_list.indexOf(self.special_operations_page), _translate("main_window", "Special operations"))
         self.file_menu.setTitle(_translate("main_window", "File"))
diff --git a/b_asic/GUI/improved_main_window.py b/b_asic/GUI/improved_main_window.py
index b2cad0f5e30f9cbd26b59fa739a6e04b0323ff10..fb580eb9a0cf67305e3b8a322538cc30b75a7569 100644
--- a/b_asic/GUI/improved_main_window.py
+++ b/b_asic/GUI/improved_main_window.py
@@ -3,6 +3,7 @@ B-ASIC GUI Module.
 This python file is the main window of the GUI for B-ASIC.
 """
 
+from os import getcwd, path
 import sys
 
 from drag_button import DragButton
@@ -10,17 +11,18 @@ from gui_interface import Ui_main_window
 from arrow import Arrow
 from port_button import PortButton
 
-from b_asic import Constant, Addition, Subtraction, Absolute,\
-Multiplication, Division, ConstantMultiplication, SquareRoot, ComplexConjugate,\
-Max, Min, Butterfly
-from b_asic import Input, Output, Register
+from b_asic import Operation
+import b_asic.core_operations as c_oper
+import b_asic.special_operations as s_oper
+
+from numpy import linspace
 
 from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QLabel, QAction,\
 QStatusBar, QMenuBar, QLineEdit, QPushButton, QSlider, QScrollArea, QVBoxLayout,\
 QHBoxLayout, QDockWidget, QToolBar, QMenu, QLayout, QSizePolicy, QListWidget,\
-QListWidgetItem, QGraphicsView, QGraphicsScene
+QListWidgetItem, QGraphicsView, QGraphicsScene, QShortcut
 from PyQt5.QtCore import Qt, QSize
-from PyQt5.QtGui import QIcon, QFont, QPainter, QPen, QBrush
+from PyQt5.QtGui import QIcon, QFont, QPainter, QPen, QBrush, QKeySequence
 
 
 class MainWindow(QMainWindow):
@@ -31,22 +33,7 @@ class MainWindow(QMainWindow):
         self.setWindowTitle(" ")
         self.setWindowIcon(QIcon('small_logo.png'))
         self.scene = None
-        self.init_ui()
-        self.add_counter = 0
-        self.sub_counter = 0
-        self.mul_counter = 0
-        self.div_counter = 0
-        self.const_counter = 0
-        self.cmul_counter = 0
-        self.sqr_counter = 0
-        self.cc_counter = 0
-        self.abs_counter = 0
-        self.max_counter = 0
-        self.min_counter = 0
-        self.butterfly_counter = 0
-        self.input_counter = 0
-        self.output_counter = 0
-        self.reg_counter = 0
+        self._operations_from_name = dict()
         self.zoom = 1
         self.operationList = []
         self.signalList = []
@@ -55,6 +42,13 @@ class MainWindow(QMainWindow):
         self.pressed_ports = []
         self.source = None
 
+        self.init_ui()
+        self.add_operations_from_namespace(c_oper, self.ui.core_operations_list)
+        self.add_operations_from_namespace(s_oper, self.ui.special_operations_list)
+
+        self.shortcut_core = QShortcut(QKeySequence("Ctrl+R"), self.ui.operation_box)
+        self.shortcut_core.activated.connect(self._refresh_operations_list_from_namespace)
+
     def init_ui(self):
         self.ui.core_operations_list.itemClicked.connect(self.on_list_widget_item_clicked)
         self.ui.special_operations_list.itemClicked.connect(self.on_list_widget_item_clicked)
@@ -77,341 +71,91 @@ class MainWindow(QMainWindow):
     def exit_app(self, checked):
         QApplication.quit()
 
+    def _determine_port_distance(self, length, ports):
+        """Determine the distance between each port on the side of an operation.
+        The method returns the distance that each port should have from 0.
+        """
+        return [length / 2] if ports == 1 else linspace(0, length, ports)
+
+    def _create_port(self, operation, output_port=True):
+        text = ">" if output_port else "<"
+        button = PortButton(text, operation, self)
+        button.setStyleSheet("background-color: white")
+        button.connectionRequested.connect(self.connectButton)
+        return button
+
     def add_ports(self, operation):
-        if operation.operation.input_count == 2:
-            self.input_port_1 = PortButton(">", operation, window)
-            self.input_port_1.setFixedSize(15, 15)
-            self.input_port_1.setStyleSheet("background-color: white")
-            self.input_port_1.show()
-            self.input_port_2 = PortButton(">", operation, window)
-            self.input_port_2.setFixedSize(15, 15)
-            self.input_port_2.setStyleSheet("background-color: white")
-            self.input_port_2.move(0, 35)
-            self.input_port_2.show()
-            self.portList.append(self.input_port_1)
-            self.portList.append(self.input_port_2)           
-            self.input_port_1.connectionRequested.connect(self.connectButton)
-            self.input_port_2.connectionRequested.connect(self.connectButton) 
-        else:
-            self.input_port_1 = PortButton(">", operation, window)
-            self.input_port_1.setFixedSize(15, 15)
-            self.input_port_1.setStyleSheet("background-color: white")
-            self.input_port_1.move(0, 16)
-            self.input_port_1.show()
-            self.portList.append(self.input_port_1)
-            self.input_port_1.connectionRequested.connect(self.connectButton)
-        if operation.operation.output_count == 2:
-            self.output_port = PortButton(">", operation, window)
-            self.output_port.setFixedSize(15, 15)
-            self.output_port.setStyleSheet("background-color: white")
-            self.output_port.move(38, 0)
-            self.output_port.show()
-            self.output_port2 = PortButton(">", operation, window)
-            self.output_port_2.setFixedSize(15, 15)
-            self.output_port2.setStyleSheet("background-color: white")
-            self.output_port2.move(38, 33)
-            self.output_port2.show()
-            self.portList.append(self.output_port)
-            self.portList.append(self.output_port_2)
-            self.output_port.connectionRequested.connect(self.connectButton)
-            self.output_port_2.connectionRequested.connect(self.connectButton)
-        else:
-            self.output_port = PortButton(">", operation, window)
-            self.output_port.setFixedSize(15, 15)
-            self.output_port.setStyleSheet("background-color: white")
-            self.output_port.move(38, 20)
-            self.output_port.show()
-            self.portList.append(self.output_port)
-            self.output_port.connectionRequested.connect(self.connectButton)
-
-    def create_addition_operation(self):
-        self.add_counter += 1
-        addition_object = Addition()
-        self.addition_operation = DragButton("Add" + str(self.add_counter),\
-            addition_object, "addition", self)
-        self.addition_operation.move(250, 100)
-        self.addition_operation.setFixedSize(50, 50)
-        self.addition_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px")
-        self.addition_operation.setIcon(QIcon(r"operation_icons\addition.png"))
-        self.addition_operation.setIconSize(QSize(50, 50))
-        self.addition_operation.setParent(None)
-        self.scene.addWidget(self.addition_operation)
-        self.operationList.append(self.addition_operation)
-    
-        self.operationList.append(self.addition_operation)
-        self.add_ports(self.addition_operation)
-
-    def create_subtraction_operation(self):
-        self.sub_counter += 1
-        subtraction_object = Subtraction()
-        self.subtraction_operation = DragButton("Subb" + str(self.sub_counter),\
-            subtraction_object, "subtraction", self)
-        self.subtraction_operation.move(250, 100)
-        self.subtraction_operation.setFixedSize(50, 50)
-        self.subtraction_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.subtraction_operation.setIcon(QIcon(r"operation_icons\subtraction.png"))
-        self.subtraction_operation.setIconSize(QSize(50, 50))
-        self.subtraction_operation.setParent(None)
-        self.scene.addWidget(self.subtraction_operation)
-        self.operationList.append(self.subtraction_operation)
-        self.add_ports(self.subtraction_operation)
-
-    def create_multiplication_operation(self):
-        self.mul_counter += 1
-        multiplication_object = Multiplication()
-        self.multiplication_operation = DragButton("Mul" + str(self.mul_counter),\
-            multiplication_object, "multiplication", self)
-        self.multiplication_operation.move(250, 100)
-        self.multiplication_operation.setFixedSize(50, 50)
-        self.multiplication_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.multiplication_operation.setIcon(QIcon\
-            (r"operation_icons\multiplication.png"))
-        self.multiplication_operation.setIconSize(QSize(50, 50))
-        self.multiplication_operation.setParent(None)
-        self.scene.addWidget(self.multiplication_operation)
-        self.operationList.append(self.multiplication_operation)
-        self.add_ports(self.multiplication_operation)
-
-    def create_division_operation(self):
-        self.div_counter += 1
-        division_object = Division()
-        self.division_operation = DragButton("Div" + str(self.div_counter),\
-            division_object, "division", self)
-        self.division_operation.move(250, 100)
-        self.division_operation.setFixedSize(50, 50)
-        self.division_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.division_operation.setIcon(QIcon(r"operation_icons\division.png"))
-        self.division_operation.setIconSize(QSize(50, 50))
-        self.division_operation.setParent(None)
-        self.scene.addWidget(self.division_operation)
-        self.operationList.append(self.division_operation)
-        self.add_ports(self.division_operation)
-
-    def create_constant_operation(self):
-        self.const_counter += 1
-        constant_object = Constant()
-        self.constant_operation = DragButton("Const" + str(self.const_counter),\
-            constant_object, "constant", self)
-        self.constant_operation.move(250, 100)
-        self.constant_operation.setFixedSize(50, 50)
-        self.constant_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.constant_operation.setIcon(QIcon(r"operation_icons\constant.png"))
-        self.constant_operation.setIconSize(QSize(50, 50))
-        self.constant_operation.setParent(None)
-        self.scene.addWidget(self.constant_operation)
-        self.operationList.append(self.constant_operation)
-        self.add_ports(self.constant_operation)
-
-    def create_constant_multiplication_operation(self):
-        self.cmul_counter += 1
-        constant_multiplication_object = ConstantMultiplication()
-        self.constant_multiplication_operation = DragButton("Cmul" + str(self.cmul_counter),\
-            constant_multiplication_object, "constant_multiplication", self)
-        self.constant_multiplication_operation.move(250, 100)
-        self.constant_multiplication_operation.setFixedSize(50, 50)
-        self.constant_multiplication_operation.setStyleSheet("background-color: white; \
-            border-style: solid; border-color: black; border-width: 2px; border-radius: 10px")
-        self.constant_multiplication_operation.setIcon(QIcon\
-            (r"operation_icons\constant_multiplication.png"))
-        self.constant_multiplication_operation.setIconSize(QSize(50, 50))
-        self.constant_multiplication_operation.setParent(None)
-        self.scene.addWidget(self.constant_multiplication_operation)
-        self.operationList.append(self.constant_multiplication_operation)
-        self.add_ports(self.constant_multiplication_operation)
-
-    def create_square_root_operation(self):
-        self.sqr_counter += 1
-        square_root_object = SquareRoot()
-        self.square_root_operation = DragButton("Sqr" + str(self.sqr_counter),\
-            square_root_object, "square_root", self)
-        self.square_root_operation.move(250, 100)
-        self.square_root_operation.setFixedSize(50, 50)
-        self.square_root_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.square_root_operation.setIcon(QIcon(r"operation_icons\square_root.png"))
-        self.square_root_operation.setIconSize(QSize(50, 50))
-        self.square_root_operation.setParent(None)
-        self.scene.addWidget(self.square_root_operation)
-        self.operationList.append(self.square_root_operation)
-        self.add_ports(self.square_root_operation)
-
-    def create_complex_conjugate_operation(self):
-        self.cc_counter += 1
-        complex_conjugate_object = ComplexConjugate()
-        self.complex_conjugate_operation = DragButton("Cc" + str(self.cc_counter),\
-            complex_conjugate_object, "complex_conjugate", self)
-        self.complex_conjugate_operation.move(250, 100)
-        self.complex_conjugate_operation.setFixedSize(50, 50)
-        self.complex_conjugate_operation.setStyleSheet("background-color: white;\
-            border-style: solid; border-color: black; border-width: 2px; border-radius: 10px")
-        self.complex_conjugate_operation.setIcon(QIcon\
-            (r"operation_icons\complex_conjugate.png"))
-        self.complex_conjugate_operation.setIconSize(QSize(50, 50))
-        self.complex_conjugate_operation.setParent(None)
-        self.scene.addWidget(self.complex_conjugate_operation)
-        self.operationList.append(self.complex_conjugate_operation)
-        self.add_ports(self.complex_conjugate_operation)
-
-    def create_absolute_operation(self):
-        self.abs_counter += 1
-        absolute_object = Absolute()
-        self.absolute_operation = DragButton("Abs" + str(self.abs_counter),\
-            absolute_object, "absolute", self)
-        self.absolute_operation.move(250, 100)
-        self.absolute_operation.setFixedSize(50, 50)
-        self.absolute_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.absolute_operation.setIcon(QIcon(r"operation_icons\absolute.png"))
-        self.absolute_operation.setIconSize(QSize(50, 50))
-        self.absolute_operation.setParent(None)
-        self.scene.addWidget(self.absolute_operation)
-        self.operationList.append(self.absolute_operation)
-        self.add_ports(self.absolute_operation)
-
-    def create_max_operation(self):
-        self.max_counter += 1
-        max_object = Max()
-        self.max_operation = DragButton("Max" + str(self.max_counter),\
-            max_object, "max", self)
-        self.max_operation.move(250, 100)
-        self.max_operation.setFixedSize(50, 50)
-        self.max_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.max_operation.setIcon(QIcon(r"operation_icons\max.png"))
-        self.max_operation.setIconSize(QSize(50, 50))
-        self.max_operation.setParent(None)
-        self.scene.addWidget(self.max_operation)
-        self.operationList.append(self.max_operation)
-        self.add_ports(self.max_operation)
-
-    def create_min_operation(self):
-        self.min_counter += 1
-        min_object = Min()
-        self.min_operation = DragButton("Min" + str(self.min_counter),\
-            min_object, "min", self)
-        self.min_operation.move(250, 100)
-        self.min_operation.setFixedSize(50, 50)
-        self.min_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.min_operation.setIcon(QIcon(r"operation_icons\min.png"))
-        self.min_operation.setIconSize(QSize(50, 50))
-        self.min_operation.setParent(None)
-        self.scene.addWidget(self.min_operation)
-        self.operationList.append(self.min_operation)
-        self.add_ports(self.min_operation)
-
-    def create_butterfly_operation(self):
-        self.butterfly_counter += 1
-        butterfly_object = Butterfly()
-        self.butterfly_operation = DragButton("Butterfly" + str(self.butterfly_counter),\
-            butterfly_object, "butterfly", self)
-        self.butterfly_operation.move(250, 100)
-        self.butterfly_operation.setFixedSize(50, 50)
-        self.butterfly_operation.setStyleSheet("background-color: white; border-style: solid;\
+        _output_ports_dist = self._determine_port_distance(50 - 15, operation.operation.output_count)
+        _input_ports_dist = self._determine_port_distance(50 - 15, operation.operation.input_count)
+
+        for dist in _input_ports_dist:
+            port = self._create_port(operation)
+            port.move(0, dist)
+            port.show()
+
+        for dist in _output_ports_dist:
+            port = self._create_port(operation)
+            port.move(50 - 15, dist)
+            port.show()
+
+    def get_operations_from_namespace(self, namespace):
+        return [comp for comp in dir(namespace) if hasattr(getattr(namespace, comp), "type_name")]
+
+    def add_operations_from_namespace(self, namespace, _list):
+        for attr_name in self.get_operations_from_namespace(namespace):
+            attr = getattr(namespace, attr_name)
+            try:
+                attr.type_name()
+                item = QListWidgetItem(attr_name)
+                _list.addItem(item)
+                self._operations_from_name[attr_name] = attr
+            except NotImplementedError:
+                pass
+
+    def _create_operation(self, item):
+        try:
+            attr_oper = self._operations_from_name[item.text()]()
+            attr_button = DragButton(attr_oper.graph_id, attr_oper, attr_oper.type_name().lower(), self)
+            attr_button.move(250, 100)
+            attr_button.setFixedSize(50, 50)
+            attr_button.setStyleSheet("background-color: white; border-style: solid;\
             border-color: black; border-width: 2px; border-radius: 10px")
-        self.butterfly_operation.setIcon(QIcon(r"operation_icons\butterfly.png"))
-        self.butterfly_operation.setIconSize(QSize(50, 50))
-        self.butterfly_operation.setParent(None)
-        self.scene.addWidget(self.butterfly_operation)
-        self.operationList.append(self.butterfly_operation)
-        self.add_ports(self.butterfly_operation)
-
-    def create_input_operation(self):
-        self.input_counter += 1
-        input_object = Input()
-        self.input_operation = DragButton("In" + str(self.input_counter),\
-            input_object, "input", self)
-        self.input_operation.move(250, 100)
-        self.input_operation.setFixedSize(50, 50)
-        self.input_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.input_operation.setIcon(QIcon(r"operation_icons\input.png"))
-        self.input_operation.setIconSize(QSize(50, 50))
-        self.input_operation.setParent(None)
-        self.scene.addWidget(self.input_operation)
-        self.operationList.append(self.input_operation)
-        self.add_ports(self.input_operation)
-
-    def create_output_operation(self):
-        self.output_counter += 1
-        output_object = Output()
-        self.output_operation = DragButton("Out" + str(self.output_counter),\
-            output_object, "output", self)
-        self.output_operation.move(250, 100)
-        self.output_operation.setFixedSize(50, 50)
-        self.output_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.output_operation.setIcon(QIcon(r"operation_icons\output.png"))
-        self.output_operation.setIconSize(QSize(50, 50))
-        self.output_operation.setParent(None)
-        self.scene.addWidget(self.output_operation)
-        self.operationList.append(self.output_operation)
-        self.add_ports(self.output_operation)
-
-    def create_register_operation(self):
-        self.reg_counter += 1
-        register_object = Register()
-        self.register_operation = DragButton("Reg" + str(self.reg_counter),\
-            register_object, "register", self)
-        self.register_operation.move(250, 100)
-        self.register_operation.setFixedSize(50, 50)
-        self.register_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.register_operation.setIcon(QIcon(r"operation_icons\register.png"))
-        self.register_operation.setIconSize(QSize(50, 50))
-        self.register_operation.setParent(None)
-        self.scene.addWidget(self.register_operation)
-        self.operationList.append(self.register_operation)
-        self.add_ports(self.register_operation)
-
-    def create_custom_operation(self):
-        self.custom_operation = DragButton(self)
-        self.custom_operation.move(250, 100)
-        self.custom_operation.setFixedSize(50, 50)
-        self.custom_operation.setStyleSheet("background-color: white; border-style: solid;\
-            border-color: black; border-width: 2px; border-radius: 10px")
-        self.custom_operation.setIcon(QIcon(r"operation_icons\custom_operation.png"))
-        self.custom_operation.setIconSize(QSize(50, 50))
-        self.custom_operation.show()
+            self.add_ports(attr_button)
+
+            icon_path = path.join("operation_icons", f"{attr_oper.type_name().lower()}.png")
+            if not path.exists(icon_path):
+                icon_path = path.join("operation_icons", f"custom_operation.png")
+            attr_button.setIcon(QIcon(icon_path))
+            attr_button.setIconSize(QSize(50, 50))
+
+            attr_button.setParent(None)
+            self.scene.addWidget(attr_button)
+            self.operationList.append(attr_button)
+        except Exception as e:
+            print("Unexpected error occured: ", e)
+
+    def _refresh_operations_list_from_namespace(self):
+        self.ui.core_operations_list.clear()
+        self.ui.special_operations_list.clear()
+
+        self.add_operations_from_namespace(c_oper, self.ui.core_operations_list)
+        self.add_operations_from_namespace(s_oper, self.ui.special_operations_list)
+
+
+    def print_input_port_1(self):
+        print("Input port 1")
+
+    def print_input_port_2(self):
+        print("Input port 2")
+
+    def print_output_port_1(self):
+        print("Output port 1")
+
+    def print_output_port_2(self):
+        print("Output port 2")
 
     def on_list_widget_item_clicked(self, item):
-        if item.text() == "Addition":
-            self.create_addition_operation()
-        elif item.text() == "Subtraction":
-            self.create_subtraction_operation()
-        elif item.text() == "Multiplication":
-            self.create_multiplication_operation()
-        elif item.text() == "Division":
-            self.create_division_operation()
-        elif item.text() == "Constant":
-            self.create_constant_operation()
-        elif item.text() == "Constant multiplication":
-            self.create_constant_multiplication_operation()
-        elif item.text() == "Square root":
-            self.create_square_root_operation()
-        elif item.text() == "Complex conjugate":
-            self.create_complex_conjugate_operation()
-        elif item.text() == "Max":
-            self.create_max_operation()
-        elif item.text() == "Min":
-            self.create_min_operation()
-        elif item.text() == "Absolute":
-            self.create_absolute_operation()
-        elif item.text() == "Butterfly":
-            self.create_butterfly_operation()
-        elif item.text() == "Input":
-            self.create_input_operation()
-        elif item.text() == "Output":
-            self.create_output_operation()
-        elif item.text() == "Register":
-            self.create_register_operation()
-        else:
-            print("Block for this operation is not implemented yet.")
+        self._create_operation(item)
 
     def keyPressEvent(self, event):
         pressed_buttons = []
@@ -433,11 +177,11 @@ class MainWindow(QMainWindow):
             self.signalList.append(line)
 
         self.update()
-    
+
     def paintEvent(self, event):
         for signal in self.signalList:
             signal.moveLine()
-    
+
 if __name__ == "__main__":
     app = QApplication(sys.argv)
     window = MainWindow()
diff --git a/b_asic/GUI/operation_icons/absolute.png b/b_asic/GUI/operation_icons/abs.png
similarity index 100%
rename from b_asic/GUI/operation_icons/absolute.png
rename to b_asic/GUI/operation_icons/abs.png
diff --git a/b_asic/GUI/operation_icons/absolute_grey.png b/b_asic/GUI/operation_icons/abs_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/absolute_grey.png
rename to b_asic/GUI/operation_icons/abs_grey.png
diff --git a/b_asic/GUI/operation_icons/addition.png b/b_asic/GUI/operation_icons/add.png
similarity index 100%
rename from b_asic/GUI/operation_icons/addition.png
rename to b_asic/GUI/operation_icons/add.png
diff --git a/b_asic/GUI/operation_icons/addition_grey.png b/b_asic/GUI/operation_icons/add_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/addition_grey.png
rename to b_asic/GUI/operation_icons/add_grey.png
diff --git a/b_asic/GUI/operation_icons/butterfly.png b/b_asic/GUI/operation_icons/bfly.png
similarity index 100%
rename from b_asic/GUI/operation_icons/butterfly.png
rename to b_asic/GUI/operation_icons/bfly.png
diff --git a/b_asic/GUI/operation_icons/butterfly_grey.png b/b_asic/GUI/operation_icons/bfly_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/butterfly_grey.png
rename to b_asic/GUI/operation_icons/bfly_grey.png
diff --git a/b_asic/GUI/operation_icons/constant.png b/b_asic/GUI/operation_icons/c.png
similarity index 100%
rename from b_asic/GUI/operation_icons/constant.png
rename to b_asic/GUI/operation_icons/c.png
diff --git a/b_asic/GUI/operation_icons/constant_grey.png b/b_asic/GUI/operation_icons/c_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/constant_grey.png
rename to b_asic/GUI/operation_icons/c_grey.png
diff --git a/b_asic/GUI/operation_icons/constant_multiplication.png b/b_asic/GUI/operation_icons/cmul.png
similarity index 100%
rename from b_asic/GUI/operation_icons/constant_multiplication.png
rename to b_asic/GUI/operation_icons/cmul.png
diff --git a/b_asic/GUI/operation_icons/constant_multiplication_grey.png b/b_asic/GUI/operation_icons/cmul_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/constant_multiplication_grey.png
rename to b_asic/GUI/operation_icons/cmul_grey.png
diff --git a/b_asic/GUI/operation_icons/complex_conjugate.png b/b_asic/GUI/operation_icons/conj.png
similarity index 100%
rename from b_asic/GUI/operation_icons/complex_conjugate.png
rename to b_asic/GUI/operation_icons/conj.png
diff --git a/b_asic/GUI/operation_icons/complex_conjugate_grey.png b/b_asic/GUI/operation_icons/conj_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/complex_conjugate_grey.png
rename to b_asic/GUI/operation_icons/conj_grey.png
diff --git a/b_asic/GUI/operation_icons/division.png b/b_asic/GUI/operation_icons/div.png
similarity index 100%
rename from b_asic/GUI/operation_icons/division.png
rename to b_asic/GUI/operation_icons/div.png
diff --git a/b_asic/GUI/operation_icons/division_grey.png b/b_asic/GUI/operation_icons/div_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/division_grey.png
rename to b_asic/GUI/operation_icons/div_grey.png
diff --git a/b_asic/GUI/operation_icons/input.png b/b_asic/GUI/operation_icons/in.png
similarity index 100%
rename from b_asic/GUI/operation_icons/input.png
rename to b_asic/GUI/operation_icons/in.png
diff --git a/b_asic/GUI/operation_icons/input_grey.png b/b_asic/GUI/operation_icons/in_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/input_grey.png
rename to b_asic/GUI/operation_icons/in_grey.png
diff --git a/b_asic/GUI/operation_icons/multiplication.png b/b_asic/GUI/operation_icons/mul.png
similarity index 100%
rename from b_asic/GUI/operation_icons/multiplication.png
rename to b_asic/GUI/operation_icons/mul.png
diff --git a/b_asic/GUI/operation_icons/multiplication_grey.png b/b_asic/GUI/operation_icons/mul_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/multiplication_grey.png
rename to b_asic/GUI/operation_icons/mul_grey.png
diff --git a/b_asic/GUI/operation_icons/output.png b/b_asic/GUI/operation_icons/out.png
similarity index 100%
rename from b_asic/GUI/operation_icons/output.png
rename to b_asic/GUI/operation_icons/out.png
diff --git a/b_asic/GUI/operation_icons/output_grey.png b/b_asic/GUI/operation_icons/out_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/output_grey.png
rename to b_asic/GUI/operation_icons/out_grey.png
diff --git a/b_asic/GUI/operation_icons/register.png b/b_asic/GUI/operation_icons/reg.png
similarity index 100%
rename from b_asic/GUI/operation_icons/register.png
rename to b_asic/GUI/operation_icons/reg.png
diff --git a/b_asic/GUI/operation_icons/register_grey.png b/b_asic/GUI/operation_icons/reg_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/register_grey.png
rename to b_asic/GUI/operation_icons/reg_grey.png
diff --git a/b_asic/GUI/operation_icons/square_root.png b/b_asic/GUI/operation_icons/sqrt.png
similarity index 100%
rename from b_asic/GUI/operation_icons/square_root.png
rename to b_asic/GUI/operation_icons/sqrt.png
diff --git a/b_asic/GUI/operation_icons/square_root_grey.png b/b_asic/GUI/operation_icons/sqrt_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/square_root_grey.png
rename to b_asic/GUI/operation_icons/sqrt_grey.png
diff --git a/b_asic/GUI/operation_icons/subtraction.png b/b_asic/GUI/operation_icons/sub.png
similarity index 100%
rename from b_asic/GUI/operation_icons/subtraction.png
rename to b_asic/GUI/operation_icons/sub.png
diff --git a/b_asic/GUI/operation_icons/subtraction_grey.png b/b_asic/GUI/operation_icons/sub_grey.png
similarity index 100%
rename from b_asic/GUI/operation_icons/subtraction_grey.png
rename to b_asic/GUI/operation_icons/sub_grey.png