diff --git a/tests/test_basic_onnx_exec.py b/tests/core/test_basic_onnx_exec.py
similarity index 100%
rename from tests/test_basic_onnx_exec.py
rename to tests/core/test_basic_onnx_exec.py
diff --git a/tests/test_custom_onnx_exec.py b/tests/core/test_custom_onnx_exec.py
similarity index 100%
rename from tests/test_custom_onnx_exec.py
rename to tests/core/test_custom_onnx_exec.py
diff --git a/tests/test_mixed_onnx_exec.py b/tests/core/test_mixed_onnx_exec.py
similarity index 100%
rename from tests/test_mixed_onnx_exec.py
rename to tests/core/test_mixed_onnx_exec.py
diff --git a/tests/test_multi_thresholding.py b/tests/custom_op/test_multi_thresholding.py
similarity index 100%
rename from tests/test_multi_thresholding.py
rename to tests/custom_op/test_multi_thresholding.py
diff --git a/tests/test_verify_custom_nodes.py b/tests/custom_op/test_verify_custom_nodes.py
similarity index 100%
rename from tests/test_verify_custom_nodes.py
rename to tests/custom_op/test_verify_custom_nodes.py
diff --git a/tests/test_xnorpopcountmatmul.py b/tests/custom_op/test_xnorpopcountmatmul.py
similarity index 100%
rename from tests/test_xnorpopcountmatmul.py
rename to tests/custom_op/test_xnorpopcountmatmul.py
diff --git a/tests/test_finn_hls_onnx_graph.py b/tests/test_finn_hls_onnx_graph.py
deleted file mode 100644
index 06308644473ab57b05ba0f46c3696c857b00e7a6..0000000000000000000000000000000000000000
--- a/tests/test_finn_hls_onnx_graph.py
+++ /dev/null
@@ -1,128 +0,0 @@
-import onnx
-from onnx import TensorProto, helper
-
-from finn.core.datatype import DataType
-from finn.core.modelwrapper import ModelWrapper
-
-
-def test_manually_construct_onnx_graph():
-
-    inp = helper.make_tensor_value_info("inp", TensorProto.FLOAT, [1, 13, 64])
-    outp = helper.make_tensor_value_info("outp", TensorProto.FLOAT, [1, 1, 64])
-
-    memInStrm_node = helper.make_node(
-        "FIFO", ["inp"], ["memInStrm"], "memInStrm", domain='finn', backend='fpgadataflow', depth=1024
-    )
-    FCLayer0_node = helper.make_node(
-        "StreamingFCLayer_Batch",
-        ["memInStrm", "weights0", "thresh0"],
-        ["out1"],
-        domain='finn',
-        backend='fpgadataflow',
-        resType="ap_resource_lut()",
-        MW=832,
-        MH=1024,
-        SIMD=64,
-        PE=32,
-        resDataType="Recast<XnorMul>",
-    )
-    inter0_node = helper.make_node("FIFO", ["out1"], ["inter0"], "inter0", domain='finn', backend='fpgadataflow', depth=16)
-    FCLayer1_node = helper.make_node(
-        "StreamingFCLayer_Batch",
-        ["inter0", "weights1", "thresh1"],
-        ["out2"],
-        domain='finn',
-        backend='fpgadataflow',
-        resType="ap_resource_lut()",
-        MW=1024,
-        MH=1024,
-        SIMD=32,
-        PE=64,
-        resDataType="Recast<XnorMul>",
-    )
-    inter1_node = helper.make_node("FIFO", ["out2"], ["inter1"], "inter1", domain='finn', backend='fpgadataflow', depth=16)
-    FCLayer2_node = helper.make_node(
-        "StreamingFCLayer_Batch",
-        ["inter1", "weights2", "thresh2"],
-        ["out3"],
-        domain='finn',
-        backend='fpgadataflow',
-        resType="ap_resource_lut()",
-        MW=1024,
-        MH=1024,
-        SIMD=64,
-        PE=32,
-        resDataType="Recast<XnorMul>",
-    )
-    inter2_node = helper.make_node("FIFO", ["out3"], ["inter2"], "inter2", domain='finn', backend='fpgadataflow', depth=8)
-    FCLayer3_node = helper.make_node(
-        "StreamingFCLayer_Batch",
-        ["inter2", "weights3", "thresh3"],
-        ["out4"],
-        domain='finn',
-        backend='fpgadataflow',
-        resType="ap_resource_lut()",
-        MW=1024,
-        MH=64,
-        SIMD=8,
-        PE=16,
-        resDataType="Recast<XnorMul>",
-    )
-    memOutStrm_node = helper.make_node(
-        "FIFO", ["out4"], ["outp"], "memOutStrm", domain='finn', backend='fpgadataflow', depth=1024
-    )
-
-    graph = helper.make_graph(
-        nodes=[
-            memInStrm_node,
-            FCLayer0_node,
-            inter0_node,
-            FCLayer1_node,
-            inter1_node,
-            FCLayer2_node,
-            inter2_node,
-            FCLayer3_node,
-            memOutStrm_node,
-        ],
-        name="finn_hls_onnx_graph",
-        inputs=[inp],
-        outputs=[outp],
-        value_info=[
-            helper.make_tensor_value_info("memInStrm", TensorProto.FLOAT, [1, 13, 64]),
-            helper.make_tensor_value_info("weights0", TensorProto.FLOAT, [64, 32, 416]),
-            helper.make_tensor_value_info(
-                "thresh0", TensorProto.FLOAT, [32, 32, 1, 16, 1]
-            ),
-            helper.make_tensor_value_info("out1", TensorProto.FLOAT, [1, 32, 32]),
-            helper.make_tensor_value_info("inter0", TensorProto.FLOAT, [1, 32, 32]),
-            helper.make_tensor_value_info("weights1", TensorProto.FLOAT, [32, 64, 512]),
-            helper.make_tensor_value_info(
-                "thresh1", TensorProto.FLOAT, [16, 64, 1, 16, 1]
-            ),
-            helper.make_tensor_value_info("out2", TensorProto.FLOAT, [1, 16, 64]),
-            helper.make_tensor_value_info("inter1", TensorProto.FLOAT, [1, 16, 64]),
-            helper.make_tensor_value_info("weights2", TensorProto.FLOAT, [64, 32, 512]),
-            helper.make_tensor_value_info(
-                "thresh2", TensorProto.FLOAT, [32, 32, 1, 16, 1]
-            ),
-            helper.make_tensor_value_info("out3", TensorProto.FLOAT, [1, 32, 32]),
-            helper.make_tensor_value_info("inter2", TensorProto.FLOAT, [1, 32, 32]),
-            helper.make_tensor_value_info("weights3", TensorProto.FLOAT, [8, 16, 512]),
-            helper.make_tensor_value_info(
-                "thresh3", TensorProto.FLOAT, [4, 16, 1, 16, 1]
-            ),
-            helper.make_tensor_value_info("out4", TensorProto.FLOAT, [1, 1, 64]),
-        ],
-    )
-    model = helper.make_model(graph, producer_name="finn-hls-onnx-model")
-    model = ModelWrapper(model)
-
-    # set the tensor datatypes (in this case: all to bipolar)
-    for tensor in graph.input:
-        model.set_tensor_datatype(tensor.name, DataType["BIPOLAR"])
-    for tensor in graph.output:
-        model.set_tensor_datatype(tensor.name, DataType["BIPOLAR"])
-    for tensor in graph.value_info:
-        model.set_tensor_datatype(tensor.name, DataType["BIPOLAR"])
-
-    #onnx.save(model.model, "finn-hls-onnx-model.onnx")
diff --git a/tests/fpgadataflow/test_data_packing.py b/tests/util/test_data_packing.py
similarity index 100%
rename from tests/fpgadataflow/test_data_packing.py
rename to tests/util/test_data_packing.py
diff --git a/tests/test_gen_finn_dt_tensor.py b/tests/util/test_gen_finn_dt_tensor.py
similarity index 100%
rename from tests/test_gen_finn_dt_tensor.py
rename to tests/util/test_gen_finn_dt_tensor.py
diff --git a/tests/test_padding.py b/tests/util/test_padding.py
similarity index 100%
rename from tests/test_padding.py
rename to tests/util/test_padding.py
diff --git a/tests/fpgadataflow/test_rtlsim2npy.py b/tests/util/test_rtlsim2npy.py
similarity index 86%
rename from tests/fpgadataflow/test_rtlsim2npy.py
rename to tests/util/test_rtlsim2npy.py
index b9a5b938d02239ff7748a759354004c1798a9828..c1a10fe49a7956c83a7bfcd26f15a8c4238ebdb3 100644
--- a/tests/fpgadataflow/test_rtlsim2npy.py
+++ b/tests/util/test_rtlsim2npy.py
@@ -47,7 +47,9 @@ def test_unpack_innermost_dim_from_hex_string():
     dtype = DataType.INT2
     shape = (1, 2, 2, 2)
     eC = [[[-1, -1], [-1, -1]], [[-1, 1], [1, -1]]]
-    C_unpacked = unpack_innermost_dim_from_hex_string(C, dtype, shape, reverse_inner=True)
+    C_unpacked = unpack_innermost_dim_from_hex_string(
+        C, dtype, shape, reverse_inner=True
+    )
     assert (C_unpacked == eC).all()
 
     # INT4
@@ -58,20 +60,20 @@ def test_unpack_innermost_dim_from_hex_string():
     D_unpacked = unpack_innermost_dim_from_hex_string(D, dtype, shape)
     assert (D_unpacked == eD).all()
 
-    D_unpacked = unpack_innermost_dim_from_hex_string(D, dtype, shape, reverse_inner=True)
+    D_unpacked = unpack_innermost_dim_from_hex_string(
+        D, dtype, shape, reverse_inner=True
+    )
     assert (D_unpacked == eD).all()
 
-
     # INT32
     E = np.asarray(["0xffffffff", "0xfffffffe", "0x02", "0xffffffef"])
     dtype = DataType.INT32
     shape = (1, 4, 1)
-    eE = [[[-1],[-2],[2],[-17]]]
+    eE = [[[-1], [-2], [2], [-17]]]
     E_unpacked = unpack_innermost_dim_from_hex_string(E, dtype, shape)
     assert (E_unpacked == eE).all()
 
-    E_unpacked = unpack_innermost_dim_from_hex_string(E, dtype, shape, reverse_inner=True)
+    E_unpacked = unpack_innermost_dim_from_hex_string(
+        E, dtype, shape, reverse_inner=True
+    )
     assert (E_unpacked == eE).all()
-
-
-
diff --git a/tests/test_shape_utils.py b/tests/util/test_shape_utils.py
similarity index 100%
rename from tests/test_shape_utils.py
rename to tests/util/test_shape_utils.py