diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a1d6f179bf3f50fcd12c407d65b040d41bb7b0bf..0decc26863e234161203286245e88cfe4cc7422a 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -13,3 +13,8 @@ repos:
     rev: 22.10.0
     hooks:
     - id: black
+-   repo: https://github.com/pycqa/isort
+    rev: 5.12.0
+    hooks:
+      - id: isort
+        name: isort (python)
diff --git a/b_asic/GUI/arrow.py b/b_asic/GUI/arrow.py
index dfc4cd59ba3a5d8902cdcd601260df1b8319a81c..d2bdfe0af04a3e5f0d7ab63ec21528687ca26c4e 100644
--- a/b_asic/GUI/arrow.py
+++ b/b_asic/GUI/arrow.py
@@ -1,5 +1,5 @@
 from qtpy.QtCore import QPointF
-from qtpy.QtGui import QPen, QPainterPath
+from qtpy.QtGui import QPainterPath, QPen
 from qtpy.QtWidgets import QGraphicsPathItem, QMenu
 
 from b_asic.GUI._preferences import GRID, LINECOLOR, PORTHEIGHT, PORTWIDTH
diff --git a/b_asic/GUI/drag_button.py b/b_asic/GUI/drag_button.py
index 495291a3a859b6dfc71a9a3b24edd4e25cc0c39d..09184d177b0e7bd7afc3e47bc02434918a27e9d7 100644
--- a/b_asic/GUI/drag_button.py
+++ b/b_asic/GUI/drag_button.py
@@ -10,9 +10,6 @@ from qtpy.QtCore import QSize, Qt, Signal
 from qtpy.QtGui import QIcon
 from qtpy.QtWidgets import QAction, QMenu, QPushButton
 
-from b_asic.GUI.port_button import PortButton
-from b_asic.GUI.properties_window import PropertiesWindow
-from b_asic.GUI.utils import decorate_class, handle_error
 from b_asic.GUI._preferences import (
     GAP,
     GRID,
@@ -20,6 +17,9 @@ from b_asic.GUI._preferences import (
     PORTHEIGHT,
     PORTWIDTH,
 )
+from b_asic.GUI.port_button import PortButton
+from b_asic.GUI.properties_window import PropertiesWindow
+from b_asic.GUI.utils import decorate_class, handle_error
 from b_asic.port import InputPort
 
 
@@ -153,9 +153,7 @@ class DragButton(QPushButton):
         path_to_image = os.path.join(
             os.path.dirname(__file__),
             "operation_icons",
-            (
-                f"{self.operation.type_name().lower()}{'_grey.png' if self.pressed else '.png'}"
-            ),
+            f"{self.operation.type_name().lower()}{'_grey.png' if self.pressed else '.png'}",
         )
         self.setIcon(QIcon(path_to_image))
         self.setIconSize(QSize(MINBUTTONSIZE, MINBUTTONSIZE))
diff --git a/b_asic/GUI/main_window.py b/b_asic/GUI/main_window.py
index f231a4d73b154765034556c57cba3fdbd07f5b0e..0a9cc98258b9d6304ea0a4e3d5837921c32782d5 100644
--- a/b_asic/GUI/main_window.py
+++ b/b_asic/GUI/main_window.py
@@ -28,17 +28,12 @@ from qtpy.QtWidgets import (
 
 import b_asic.core_operations
 import b_asic.special_operations
+from b_asic.GUI._preferences import GAP, GRID, MINBUTTONSIZE, PORTHEIGHT
 from b_asic.GUI.about_window import AboutWindow, FaqWindow, KeybindsWindow
 from b_asic.GUI.arrow import Arrow
 from b_asic.GUI.drag_button import DragButton
 from b_asic.GUI.gui_interface import Ui_main_window
 from b_asic.GUI.select_sfg_window import SelectSFGWindow
-from b_asic.GUI._preferences import (
-    GAP,
-    GRID,
-    MINBUTTONSIZE,
-    PORTHEIGHT,
-)
 from b_asic.GUI.show_pc_window import ShowPCWindow
 from b_asic.GUI.simulate_sfg_window import Plot, SimulateSFGWindow
 from b_asic.GUI.utils import decorate_class, handle_error
diff --git a/b_asic/operation.py b/b_asic/operation.py
index ecedacef101c6ebcbe170d48609e15fb7cc56aee..3da6e4ab53792605658c28b39b77e6c9cfa02423 100644
--- a/b_asic/operation.py
+++ b/b_asic/operation.py
@@ -9,6 +9,7 @@ import itertools as it
 from abc import abstractmethod
 from numbers import Number
 from typing import (
+    TYPE_CHECKING,
     Any,
     Dict,
     Iterable,
@@ -20,7 +21,6 @@ from typing import (
     Sequence,
     Tuple,
     Union,
-    TYPE_CHECKING,
 )
 
 from b_asic.graph_component import (
@@ -32,15 +32,14 @@ from b_asic.graph_component import (
 from b_asic.port import InputPort, OutputPort, SignalSourceProvider
 from b_asic.signal import Signal
 
-
 if TYPE_CHECKING:
     # Conditionally imported to avoid circular imports
     from b_asic.core_operations import (
         Addition,
-        Subtraction,
-        Multiplication,
         ConstantMultiplication,
         Division,
+        Multiplication,
+        Subtraction,
     )
     from b_asic.signal_flow_graph import SFG
 
diff --git a/b_asic/schedule.py b/b_asic/schedule.py
index 3a4f0f7bbb5bcb8e1a3aaedaa8b7416adfee0448..e76fcccdc35f157fc75d48d3952d1c53391b37e1 100644
--- a/b_asic/schedule.py
+++ b/b_asic/schedule.py
@@ -7,14 +7,14 @@ Contains the schedule class for scheduling operations in an SFG.
 import io
 import sys
 from collections import defaultdict
-from typing import cast, Dict, List, Optional, Tuple
+from typing import Dict, List, Optional, Tuple, cast
 
 import matplotlib.pyplot as plt
+import numpy as np
 from matplotlib.lines import Line2D
 from matplotlib.patches import PathPatch, Polygon
 from matplotlib.path import Path
 from matplotlib.ticker import MaxNLocator
-import numpy as np
 
 from b_asic import Signal
 from b_asic._preferences import (
@@ -30,7 +30,6 @@ from b_asic.process import MemoryVariable, Process
 from b_asic.signal_flow_graph import SFG
 from b_asic.special_operations import Delay, Output
 
-
 _EXECUTION_TIME_COLOR = tuple(c / 255 for c in EXECUTION_TIME_COLOR)
 _LATENCY_COLOR = tuple(c / 255 for c in LATENCY_COLOR)
 _SIGNAL_COLOR = tuple(c / 255 for c in SIGNAL_COLOR)
diff --git a/b_asic/scheduler_gui/__init__.py b/b_asic/scheduler_gui/__init__.py
index b0b416cacb5fa920c16ed06af6b0c3689e83d3af..ada1c2c7cc2ed9a9fe7f5b9b42c7b6d2bb899632 100644
--- a/b_asic/scheduler_gui/__init__.py
+++ b/b_asic/scheduler_gui/__init__.py
@@ -6,12 +6,11 @@ Graphical user interface for B-ASIC scheduler.
 __author__ = "Andreas Bolin"
 # __all__ = ['main_window', 'graphics_graph', 'component_item', 'graphics_axes', 'graphics_timeline_item']
 from b_asic.scheduler_gui._version import *
-
 from b_asic.scheduler_gui.axes_item import *
+from b_asic.scheduler_gui.logger import *
+from b_asic.scheduler_gui.main_window import *
 from b_asic.scheduler_gui.operation_item import *
 from b_asic.scheduler_gui.scheduler_event import *
 from b_asic.scheduler_gui.scheduler_item import *
 from b_asic.scheduler_gui.signal_item import *
 from b_asic.scheduler_gui.timeline_item import *
-from b_asic.scheduler_gui.logger import *
-from b_asic.scheduler_gui.main_window import *
diff --git a/b_asic/scheduler_gui/compile.py b/b_asic/scheduler_gui/compile.py
index 4c24f939e287062d2f3b5499afb4061202abba98..473526f01243ba30403d7719f3f0b1f0cd74077b 100644
--- a/b_asic/scheduler_gui/compile.py
+++ b/b_asic/scheduler_gui/compile.py
@@ -7,12 +7,13 @@ If no arguments is given, the compiler search for and compiles all form (.ui)
 files.
 """
 
-from qtpy import uic
-import sys
+import argparse
 import os
 import shutil
 import subprocess
-import argparse
+import sys
+
+from qtpy import uic
 from setuptools_scm import get_version
 
 try:
diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py
index c52d7dba8fe794436327538e84e0e92f5850599d..af4ae35333c00aacff67829e8b2259736d0a0d5d 100644
--- a/b_asic/signal_flow_graph.py
+++ b/b_asic/signal_flow_graph.py
@@ -11,7 +11,6 @@ from io import StringIO
 from numbers import Number
 from queue import PriorityQueue
 from typing import (
-    cast,
     DefaultDict,
     Deque,
     Dict,
@@ -23,6 +22,7 @@ from typing import (
     Set,
     Tuple,
     Union,
+    cast,
 )
 
 from graphviz import Digraph
diff --git a/examples/secondorderdirectformiir.py b/examples/secondorderdirectformiir.py
index 49cb20d3bee656e51e5de001873a5e32439d6e13..b30f8bf7c15ef0e4639875e005798ce9ca511f25 100644
--- a/examples/secondorderdirectformiir.py
+++ b/examples/secondorderdirectformiir.py
@@ -12,10 +12,9 @@ IN1>--->C0>--->ADD1>----------+--->A0>--->ADD4>--->OUT1
 """
 
 from b_asic.core_operations import Addition, ConstantMultiplication
-from b_asic.special_operations import Delay, Input, Output
-from b_asic.signal_flow_graph import SFG
 from b_asic.schedule import Schedule
-
+from b_asic.signal_flow_graph import SFG
+from b_asic.special_operations import Delay, Input, Output
 
 in1 = Input("IN1")
 c0 = ConstantMultiplication(5, in1, "C0")
diff --git a/examples/thirdorderblwdf.py b/examples/thirdorderblwdf.py
index bc2676d4476081c128c198421c35fc1e0feb9ce3..af59aff9c5e683fec076461a067adc94cd7f5f2e 100644
--- a/examples/thirdorderblwdf.py
+++ b/examples/thirdorderblwdf.py
@@ -2,10 +2,10 @@
 Small bireciprocal lattice wave digital filter.
 """
 from b_asic.core_operations import Addition, SymmetricTwoportAdaptor
-from b_asic.special_operations import Delay, Input, Output
+from b_asic.schedule import Schedule
 from b_asic.signal_flow_graph import SFG
 from b_asic.simulation import Simulation
-from b_asic.schedule import Schedule
+from b_asic.special_operations import Delay, Input, Output
 
 in0 = Input("x")
 D0 = Delay(in0)
@@ -31,8 +31,8 @@ import scipy.signal
 
 w, h = scipy.signal.freqz(sim.results['0'])
 
-import numpy as np
 import matplotlib.pyplot as plt
+import numpy as np
 
 plt.plot(w, 20 * np.log10(np.abs(h) / 2))
 
diff --git a/examples/threepointwinograddft.py b/examples/threepointwinograddft.py
index 6d81fea8eaa64d1d66949413427bc16481a4ada7..927cc5552a4f9038e977a4ec0a857f99bb644ec9 100644
--- a/examples/threepointwinograddft.py
+++ b/examples/threepointwinograddft.py
@@ -1,15 +1,16 @@
 """Three-point Winograd DFT.
 """
 
+from math import cos, pi, sin
+
 from b_asic.core_operations import (
     Addition,
     ConstantMultiplication,
     Subtraction,
 )
-from b_asic.special_operations import Input, Output
-from b_asic.signal_flow_graph import SFG
 from b_asic.schedule import Schedule
-from math import cos, pi, sin
+from b_asic.signal_flow_graph import SFG
+from b_asic.special_operations import Input, Output
 
 u = -2 * pi / 3
 c30 = cos(u) - 1
diff --git a/examples/twotapfirsfg.py b/examples/twotapfirsfg.py
index 97d76c3298ebbfba998dca6da9b21de73678cbe1..b172e4fa7bd57f6dc8401d1ec38671bbbf0c685c 100644
--- a/examples/twotapfirsfg.py
+++ b/examples/twotapfirsfg.py
@@ -1,10 +1,18 @@
-
 """
 B-ASIC automatically generated SFG file.
 Name: twotapfir
 Last saved: 2023-01-24 14:38:17.654639.
 """
-from b_asic import SFG, Signal, Input, Output, ConstantMultiplication, Delay, Input, Output, Addition
+from b_asic import (
+    SFG,
+    Addition,
+    ConstantMultiplication,
+    Delay,
+    Input,
+    Output,
+    Signal,
+)
+
 # Inputs:
 in1 = Input(name="in1")
 
@@ -13,9 +21,15 @@ out1 = Output(name="")
 
 # Operations:
 t1 = Delay(initial_value=0, name="")
-cmul1 = ConstantMultiplication(value=0.5, name="cmul2", latency_offsets={'in0': None, 'out0': None})
-add1 = Addition(name="", latency_offsets={'in0': None, 'in1': None, 'out0': None})
-cmul2 = ConstantMultiplication(value=0.5, name="cmul", latency_offsets={'in0': None, 'out0': None})
+cmul1 = ConstantMultiplication(
+    value=0.5, name="cmul2", latency_offsets={'in0': None, 'out0': None}
+)
+add1 = Addition(
+    name="", latency_offsets={'in0': None, 'in1': None, 'out0': None}
+)
+cmul2 = ConstantMultiplication(
+    value=0.5, name="cmul", latency_offsets={'in0': None, 'out0': None}
+)
 
 # Signals:
 
@@ -28,5 +42,12 @@ Signal(source=cmul2.output(0), destination=add1.input(1))
 twotapfir = SFG(inputs=[in1], outputs=[out1], name='twotapfir')
 
 # SFG Properties:
-prop = {'name':twotapfir}
-positions = {'t1': (-209, 19), 'cmul1': (-95, 76), 'add1': (0, 95), 'cmul2': (-209, 114), 'out1': (76, 95), 'in1': (-323, 19)}
+prop = {'name': twotapfir}
+positions = {
+    't1': (-209, 19),
+    'cmul1': (-95, 76),
+    'add1': (0, 95),
+    'cmul2': (-209, 114),
+    'out1': (76, 95),
+    'in1': (-323, 19),
+}
diff --git a/pyproject.toml b/pyproject.toml
index 07f862a255cd894a0bfdfc0372b705edbb37798d..4f5b7930898b7293f314b7cf2ff3c486d625a61a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -56,6 +56,13 @@ skip-string-normalization = true
 preview = true
 line-length = 79
 exclude = [
-    "examples",
+    "test/test_gui"
+]
+
+[tool.isort]
+profile = "black"
+line_length = 79
+src_paths = ["b_asic", "test"]
+skip = [
     "test/test_gui"
 ]
diff --git a/setup.py b/setup.py
index 0c8ec302250cb891772351d37a005026fb3ebbc8..478976620117a547047ebc80e28b153c51d8d110 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,8 @@
 import os
-import sys
 import shutil
 import subprocess
+import sys
+
 import setuptools
 from setuptools import Extension
 from setuptools.command.build_ext import build_ext
diff --git a/test/conftest.py b/test/conftest.py
index baf848e2bcbef8ea877ac8af75ab69cd3204e3b5..179a82c24e7ed3f3fb375fdfa3088a33eac1ef31 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -1,12 +1,11 @@
+import os
+from distutils import dir_util
 from test.fixtures.operation_tree import *
 from test.fixtures.port import *
 from test.fixtures.schedule import *
 from test.fixtures.signal import signal, signals
 from test.fixtures.signal_flow_graph import *
 
-from distutils import dir_util
-import os
-
 import pytest
 
 
diff --git a/test/fixtures/schedule.py b/test/fixtures/schedule.py
index eb94c96dc5847a2e89e79bac806322a495c02f7e..40b953179eb962a0661efc90ad0befba4cf4bc7c 100644
--- a/test/fixtures/schedule.py
+++ b/test/fixtures/schedule.py
@@ -1,7 +1,7 @@
-import pytest
-
 from test.fixtures.signal_flow_graph import precedence_sfg_delays
 
+import pytest
+
 from b_asic.core_operations import Addition, ConstantMultiplication
 from b_asic.schedule import Schedule
 
diff --git a/test/test_gui.py b/test/test_gui.py
index 7bf9a424560f1fa40b571f22feb6cfee83ec8837..9f182021b195ec3e2872ea4bf008e0ec8fe0e074 100644
--- a/test/test_gui.py
+++ b/test/test_gui.py
@@ -1,7 +1,5 @@
-from qtpy import QtCore
-
-
 import pytest
+from qtpy import QtCore
 
 try:
     import b_asic.GUI as GUI
@@ -157,7 +155,9 @@ def test_properties_window_smoke_test(qtbot, datadir):
     dragbutton = widget.operationDragDict[op]
     dragbutton.show_properties_window()
     assert dragbutton._properties_window.operation == dragbutton
-    qtbot.mouseClick(dragbutton._properties_window.ok, QtCore.Qt.MouseButton.LeftButton)
+    qtbot.mouseClick(
+        dragbutton._properties_window.ok, QtCore.Qt.MouseButton.LeftButton
+    )
     widget.exit_app()
 
 
@@ -175,7 +175,9 @@ def test_properties_window_change_name(qtbot, datadir):
     dragbutton.show_properties_window()
     assert dragbutton._properties_window.edit_name.text() == "cmul2"
     dragbutton._properties_window.edit_name.setText("cmul73")
-    qtbot.mouseClick(dragbutton._properties_window.ok, QtCore.Qt.MouseButton.LeftButton)
+    qtbot.mouseClick(
+        dragbutton._properties_window.ok, QtCore.Qt.MouseButton.LeftButton
+    )
     dragbutton._properties_window.save_properties()
     assert dragbutton.name == "cmul73"
     assert dragbutton.operation.name == "cmul73"
diff --git a/test/test_gui/twotapfir.py b/test/test_gui/twotapfir.py
index c0ab4c540113986e896ebc70196b21496f9290be..e0d7ca6fd9fc3685a961816d84c98744617a9219 100644
--- a/test/test_gui/twotapfir.py
+++ b/test/test_gui/twotapfir.py
@@ -1,10 +1,18 @@
-
 """
 B-ASIC automatically generated SFG file.
 Name: twotapfir
 Last saved: 2023-01-24 14:38:17.654639.
 """
-from b_asic import SFG, Signal, Input, Output, ConstantMultiplication, Delay, Input, Output, Addition
+from b_asic import (
+    SFG,
+    Addition,
+    ConstantMultiplication,
+    Delay,
+    Input,
+    Output,
+    Signal,
+)
+
 # Inputs:
 in1 = Input(name="in1")
 
@@ -13,9 +21,15 @@ out1 = Output(name="")
 
 # Operations:
 t1 = Delay(initial_value=0, name="")
-cmul1 = ConstantMultiplication(value=-0.5, name="cmul1", latency_offsets={'in0': None, 'out0': None})
-add1 = Addition(name="add1", latency_offsets={'in0': None, 'in1': None, 'out0': None})
-cmul2 = ConstantMultiplication(value=0.5, name="cmul2", latency_offsets={'in0': None, 'out0': None})
+cmul1 = ConstantMultiplication(
+    value=-0.5, name="cmul1", latency_offsets={'in0': None, 'out0': None}
+)
+add1 = Addition(
+    name="add1", latency_offsets={'in0': None, 'in1': None, 'out0': None}
+)
+cmul2 = ConstantMultiplication(
+    value=0.5, name="cmul2", latency_offsets={'in0': None, 'out0': None}
+)
 
 # Signals:
 
@@ -28,5 +42,12 @@ Signal(source=cmul2.output(0), destination=add1.input(1))
 twotapfir = SFG(inputs=[in1], outputs=[out1], name='twotapfir')
 
 # SFG Properties:
-prop = {'name':twotapfir}
-positions = {'t1': (-209, 19), 'cmul1': (-95, 76), 'add1': (0, 95), 'cmul2': (-209, 114), 'out1': (76, 95), 'in1': (-323, 19)}
+prop = {'name': twotapfir}
+positions = {
+    't1': (-209, 19),
+    'cmul1': (-95, 76),
+    'add1': (0, 95),
+    'cmul2': (-209, 114),
+    'out1': (76, 95),
+    'in1': (-323, 19),
+}