diff --git a/gitignore b/gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..7ed3340852a932b53d7e99f220ba18fec263b83a
--- /dev/null
+++ b/gitignore
@@ -0,0 +1,18 @@
+# Operating system files
+.DS_Store
+Thumbs.db
+#backend
+#src/backend/__pycache__/
+#src/backend/api/
+#src/backend/backend_utilities/
+#src/backend/cache/
+#src/backend/endpoints/
+#src/backend/middleware/
+#src/backend/core/
+
+#frontend
+# node_modules becomes very big after npm install
+#src/frontend/node_modules
+
+# after npm start
+.angular/
\ No newline at end of file
diff --git a/src/backend/.DS_Store b/src/backend/.DS_Store
index 74b6af4ecf10a5602fdf50e7768df49a5e8fcedb..b7e5e937cec369f3515e3247f37d2a726044cea2 100644
Binary files a/src/backend/.DS_Store and b/src/backend/.DS_Store differ
diff --git a/src/backend/backend_utilities/mine_log.py b/src/backend/backend_utilities/mine_log.py
new file mode 100644
index 0000000000000000000000000000000000000000..39df4a1bca1183ffcf7e8e3ff64187f1f5f1bf2d
--- /dev/null
+++ b/src/backend/backend_utilities/mine_log.py
@@ -0,0 +1,135 @@
+from fastapi import FastAPI, UploadFile, File
+from pydantic import BaseModel
+from typing import List, Dict, Any, Optional
+import uvicorn
+
+from ocpa.objects.log.importer.ocel import factory as ocel_import_factory
+from ocpa.visualization.log.variants import factory as variants_visualization_factory
+from ocpa.algo.util.filtering.log import case_filtering
+from ocpa.objects.log.exporter.ocel import factory as ocel_export_factory
+
+import ocsv.Input_Extraction_Definition as IED  # Seems like a helper class to define data structures and querying lanes
+import ocsv.Super_Variant_Definition as SVD     # Super Variant Definition, super lane definition
+import ocsv.Super_Variant_Visualization as SVV  # Visualization of super variants
+import ocsv.Intra_Variant_Summarization as IAVS # 
+import ocsv.Summarization_Selection as SS
+import ocsv.Intra_Variant_Generation as IAVG
+import ocsv.Inter_Variant_Summarization as IEVS
+import ocsv.Inter_Variant_Generation as IEVG
+import ocsv.Super_Variant_Hierarchy as SVH
+import time 
+import numpy as np
+
+#app = FastAPI()
+
+class Parameters(BaseModel):
+    execution_extraction: Optional[str] = "leading_type"
+    leading_type: Optional[str] = "application"
+    max_levels: Optional[int] = 4
+    frequency_distribution_type: Optional[str] = "NORMAL"
+
+#@app.get("/")
+#@app.post("/process_ocel/")
+#async def process_ocel(file: UploadFile = File(...), parameters: Parameters = None):
+async def process_ocel(parameters: Parameters = Parameters(), filename: str = "/Users/swolf/Desktop/mining/ocsv/ocsv/EventLogs/BPI2017-Top10.jsonocel"):
+    '''
+    # Save the uploaded file
+    file_location = f"/tmp/{file.filename}"
+    with open(file_location, "wb+") as file_object:
+        file_object.write(file.file.read())
+    '''
+    # Predefined filename
+    print("Processing OCEL file../n/n")
+    print(filename)
+    #filename = "../ocsv/ocsv/EventLogs/BPI2017-Top10.jsonocel"
+    #filename = "/Users/swolf/Desktop/mining/ocsv/ocsv/EventLogs/BPI2017-Top10.jsonocel"
+    #filename = "/Users/swolf/Desktop/mining/ocsv/ocsv/EventLogs/OCEL_example.jsonocel"
+    parameters = Parameters()
+    #{"execution_extraction": "leading_type",
+              #"leading_type": "application"}
+    # Load the OCEL file
+    ocel = ocel_import_factory.apply(file_path=filename, parameters=parameters)
+
+    # Step 1: Summarization Generation
+    all_summarizations, per_variant_dict, per_encoding_dict = IAVG.complete_intra_variant_summarization(ocel)
+
+    # Step 2: Summarization Matching
+    summarizations = SS.intra_variant_summarization_selection(all_summarizations, per_variant_dict, per_encoding_dict)
+
+    # Step 3: Inter-Variant Summarization
+    IEVG.NESTED_STRUCTURES = True
+    initial_set = [summarizations[i] for i in range(len(summarizations))]
+    hierarchies, final_super_variants = IEVG.generate_super_variant_hierarchy(
+        initial_set, parameters.max_levels, frequency_distribution_type=getattr(IEVG.Distribution, parameters.frequency_distribution_type)
+    )
+
+    # Extract super variants
+    values = []
+    for super_variant in final_super_variants[0]:
+        values.append("NEW SUPER VARIANT")
+        values.append(super_variant)
+
+    def extract_super_variants(nested_structure):
+        """Recursively extract SuperVariant objects from a nested structure."""
+        super_variants = []
+        if isinstance(nested_structure, tuple):
+            for item in nested_structure:
+                super_variants.extend(extract_super_variants(item))
+        elif isinstance(nested_structure, list):
+            for item in nested_structure:
+                super_variants.extend(extract_super_variants(item))
+        elif isinstance(nested_structure, SVD.SuperVariant):
+            super_variants.append(nested_structure)
+        return super_variants
+
+    # Create a useful data structure out of the nested list of super variants and tuples containing super variants.
+    super_variants_dict = {}
+    current_super_variant = None
+
+    for line in values:
+        if line == "NEW SUPER VARIANT":
+            current_super_variant = None
+        else:
+            if current_super_variant is None:
+                current_super_variant = []
+                super_variants_dict[len(super_variants_dict)] = current_super_variant
+            current_super_variant.extend(extract_super_variants(line))
+
+    def extract_hierarchy_info(hierarchy, level=0, info=None):
+        """Recursively extract information about the hierarchical structure."""
+        if info is None:
+            info = {"levels": {}, "super_variants": []}
+        
+        if isinstance(hierarchy, dict):
+            for key, value in hierarchy.items():
+                if key not in info["levels"]:
+                    info["levels"][key] = []
+                info["levels"][key].append(value)
+                extract_hierarchy_info(value, level + 1, info)
+        elif isinstance(hierarchy, list):
+            for item in hierarchy:
+                extract_hierarchy_info(item, level, info)
+        elif isinstance(hierarchy, tuple):
+            for item in hierarchy:
+                extract_hierarchy_info(item, level, info)
+        elif isinstance(hierarchy, SVD.SuperVariant):
+            info["super_variants"].append(hierarchy)
+        
+        return info
+
+    # Extract hierarchy information
+    hierarchy_info_list = []
+    for hierarchy in hierarchies:
+        hierarchy_info = extract_hierarchy_info(hierarchy)
+        hierarchy_info_list.append(hierarchy_info)
+
+    return {
+        "super_variants_dict": super_variants_dict,
+        "hierarchy_info_list": hierarchy_info_list
+    }
+
+'''
+if __name__ == "__main__":
+    uvicorn.run(app, host="0.0.0.0", port=8000)
+
+'''