diff --git a/b_asic/utils.py b/b_asic/utils.py
index d8df7767f9d3d612550f5a0e39654093c19561ef..7cca1f152546a445dbf39b659e99c3f99ac6c09d 100644
--- a/b_asic/utils.py
+++ b/b_asic/utils.py
@@ -4,12 +4,14 @@ This module contains functions that are used as utilities by other modules or by
 """
 
 from typing import Optional
-import pickle
+from os import getcwd, path
 
 from b_asic import AbstractOperation
 
+import dill  # Used instead of pickle to support serializing lambda functions
 
-def save_structure(struct: AbstractOperation, path: Optional[str] = None) -> str: 
+
+def save_structure(struct: AbstractOperation, _path: Optional[str] = None, _name: Optional[str] = None) -> str: 
     """Saves the structure to a specific path using the pickle module.
     Returns the path to the struct if save succeeds.
     
@@ -17,15 +19,35 @@ def save_structure(struct: AbstractOperation, path: Optional[str] = None) -> str
     struct: The structure to save.
 
     Keyword Arguments:
-    path: The path to which the structure will be saved.
+    _path: The path (str) to which the structure will be saved.
+    _name: The name (str) of the file to be saved. Only used if _path is not defined and is not None.
     """
-    pass
+    try:
+        _name = _name if _name is not None else f"{struct.type_name}.pickle"
+
+        if _path is None:
+            _path = path.join(getcwd(), _name)
 
-def load_structure(path: str) -> AbstractOperation:
+        print(_path)
+        with open(_path, "wb") as handle:
+            dill.dump(struct, handle, protocol=dill.HIGHEST_PROTOCOL)
+    except Exception as e:
+        print("Unexpected error occured while saving structure: ", e)
+        return None
+    
+    return _path
+
+def load_structure(_path: str) -> AbstractOperation:
     """Saves the structure to a specific path using the pickle module.
     Returns the struct that was loaded from the path.
 
     Keyword Arguments:
     path: The path to which the structure will be loaded from.
     """
-    pass
\ No newline at end of file
+    try:
+        with open(_path, "rb") as handle:
+            return dill.load(handle)
+    except Exception as e:
+        print("Unexpected error occured while saving structure: ", e)
+    
+    return None
diff --git a/setup.py b/setup.py
index 43d55d40a95212196facb973ebc97a1bdc5e7f42..d8427686f8738b90ae78a122a491ecc69c5aa1b8 100644
--- a/setup.py
+++ b/setup.py
@@ -71,7 +71,8 @@ setuptools.setup(
     install_requires = [
         "pybind11>=2.3.0",
         "numpy",
-        "install_qt_binding"
+        "install_qt_binding",
+        "dill>=0.3.1.1"
     ],
     packages = ["b_asic"],
     ext_modules = [CMakeExtension("b_asic")],
diff --git a/test/test_load_save_structure.py b/test/test_load_save_structure.py
index d1515820a8aef1e05b9efe9970d8d636fd12859f..193753b63d293cf99bb171cbdd53ff196fb82364 100644
--- a/test/test_load_save_structure.py
+++ b/test/test_load_save_structure.py
@@ -20,22 +20,4 @@ class TestSaveStructures:
         _sfg = load_structure(path)
         
         assert isinstance(_sfg, SFG)
-        assert sfg.components == _sfg.components
-
-    def test_save_sfg_custom_path(self, large_operation_tree):
-        sfg = SFG(outputs=[Output(large_operation_tree)])
-        path = save_structure(sfg, path="structures/test")
-        
-        assert path is not None
-        assert isfile(path)
-
-    def test_load_sfg_custom_path(self, large_operation_tree):
-        sfg = SFG(outputs=[Output(large_operation_tree)])
-        path = save_structure(sfg, path="structures/test")
-        _sfg = load_structure(path)
-
-        assert isinstance(_sfg, SFG)
-        assert sfg.components == _sfg.components   
-
-
-
+        assert sfg.evaluate() == _sfg.evaluate()