diff --git a/.github/workflows/BuildDocker.yml b/.github/workflows/BuildDocker.yml
deleted file mode 100644
index db5e1dc7ee..0000000000
--- a/.github/workflows/BuildDocker.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: BuildDocker
-
-on: 
-  # push:
-  # pull_request:
-  workflow_dispatch:
-
-jobs:
-  build-docker:
-    permissions: write-all
-    name: Deploy Docker image
-    runs-on: ubuntu-latest
-    steps:
-      # Free up disk space on Github-hosted runner
-      - name: Disk usage
-        run: df -h
-      - uses: jlumbroso/free-disk-space@v1.3.1
-        with:
-          android: true
-          dotnet: true
-          haskell: true
-          large-packages: true
-      - name: Disk usage after freeing up space
-        run: df -h
-      # Actually build the Docker container
-      - uses: actions/checkout@v2
-      - uses: docker/setup-buildx-action@v1
-      - name: GHCR Log-in
-        uses: docker/login-action@v1
-        with:
-          registry: ghcr.io
-          username: ${{ github.actor }}
-          password: ${{ secrets.GITHUB_TOKEN }}
-      - name: Build and push
-        uses: docker/build-push-action@v2
-        with:
-          context: .
-          file: Container/Dockerfile
-          push: true
-          # JUNGVI: If you operate from a fork and want to build a new docker make sure to replace 'pulp-platform' by your uname. 
-          tags: ghcr.io/pulp-platform/deeploy:main
diff --git a/.github/workflows/BuildDockerDeeploy.yml b/.github/workflows/BuildDockerDeeploy.yml
new file mode 100644
index 0000000000..fe29fb1ddf
--- /dev/null
+++ b/.github/workflows/BuildDockerDeeploy.yml
@@ -0,0 +1,126 @@
+name: BuildDockerDeeploy
+
+on:
+  workflow_dispatch:
+    inputs:
+      docker_image_toolchain:
+        description: 'Deeploy Toolchain Image to use'
+        required: false
+        default: 'ghcr.io/pulp-platform/deeploy-toolchain:latest'
+
+jobs:
+  prepare:
+    name: Fetch branch name or tag
+    runs-on: ubuntu-latest
+    outputs:
+      docker_tag: ${{ steps.generate_tag.outputs.docker_tag }}
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Set up environment variables
+        run: |
+          echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
+          echo "TAG_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
+          echo "IS_TAG=${GITHUB_REF_TYPE}" >> $GITHUB_ENV
+
+      - name: Set Docker tag
+        id: generate_tag
+        run: |
+          if [[ "${{ env.IS_TAG }}" == "tag" ]]; then
+            echo "docker_tag=${{ env.TAG_NAME }}" >> $GITHUB_OUTPUT
+          else
+            echo "docker_tag=${{ env.BRANCH_NAME }}" >> $GITHUB_OUTPUT
+          fi
+
+  build-deeploy:
+    name: Build Deploy Image
+    needs: [ prepare ]
+    runs-on: ${{ matrix.runner }}
+    strategy:
+      fail-fast: false
+      matrix:
+        platform: [amd64, arm64]
+        include:
+          - platform: amd64
+            runner: ubuntu-latest
+          - platform: arm64
+            runner: ubuntu-22.04-arm
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Free up disk space
+        uses: jlumbroso/free-disk-space@v1.3.1
+        with:
+          android: true
+          dotnet: true
+          haskell: true
+          large-packages: true
+
+      - uses: docker/setup-buildx-action@v1
+
+      - name: GHCR Log-in
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Build Cache for Docker
+        uses: actions/cache@v3
+        with:
+          path: var-ccache
+          key: ${{ runner.os }}-${{ matrix.platform }}-build-cache-deeploy
+
+      - name: Inject build-cache
+        uses: reproducible-containers/buildkit-cache-dance@v3.1.0
+        with:
+          cache-map: |
+            {
+              "var-ccache": "/ccache"
+            }
+          skip-extraction: ${{ steps.cache.outputs.cache-hit }}
+
+      - name: Lower Case Repository Name
+        run: |
+          echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV}
+        env:
+          OWNER: '${{ github.repository_owner }}'
+
+      - name: Build and push final deploy image
+        uses: docker/build-push-action@v6
+        with:
+          platforms: linux/${{ matrix.platform }}
+          context: .
+          cache-from: type=gha
+          cache-to: type=gha,mode=min
+          file: Container/Dockerfile.deeploy
+          push: true
+          build-args: |
+            BASE_IMAGE=${{ github.event.inputs.docker_image_toolchain }}
+          tags: |
+            ghcr.io/${{ env.OWNER_LC }}/deeploy:latest-${{ matrix.platform }}
+            ghcr.io/${{ env.OWNER_LC }}/deeploy:${{ needs.prepare.outputs.docker_tag }}-${{ matrix.platform }}
+
+  merge-deeploy-images:
+    name: Merge Deeploy Images
+    runs-on: ubuntu-latest
+    needs: [ prepare, build-deeploy ]
+    steps:
+      - name: GHCR Log-in
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Lower Case Repository Name
+        run: |
+          echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV}
+        env:
+          OWNER: '${{ github.repository_owner }}'
+
+      - uses: Noelware/docker-manifest-action@v1
+        with:
+          inputs: ghcr.io/${{ env.OWNER_LC }}/deeploy:latest-amd64,ghcr.io/${{ env.OWNER_LC }}/deeploy:latest-arm64
+          tags: ghcr.io/${{ env.OWNER_LC }}/deeploy:latest,ghcr.io/${{ env.OWNER_LC }}/deeploy:${{ needs.prepare.outputs.docker_tag }}
+          push: true
\ No newline at end of file
diff --git a/.github/workflows/BuildDockerToolchain.yml b/.github/workflows/BuildDockerToolchain.yml
new file mode 100644
index 0000000000..7b128948d1
--- /dev/null
+++ b/.github/workflows/BuildDockerToolchain.yml
@@ -0,0 +1,117 @@
+name: BuildDockerToolchain
+
+on:
+  workflow_dispatch:
+
+jobs:
+  prepare:
+    name: Fetch branch name or tag
+    runs-on: ubuntu-latest
+    outputs:
+      docker_tag: ${{ steps.generate_tag.outputs.docker_tag }}
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Set up environment variables
+        run: |
+          echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
+          echo "TAG_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
+          echo "IS_TAG=${GITHUB_REF_TYPE}" >> $GITHUB_ENV
+
+      - name: Set Docker tag
+        id: generate_tag
+        run: |
+          if [[ "${{ env.IS_TAG }}" == "tag" ]]; then
+            echo "docker_tag=${{ env.TAG_NAME }}" >> $GITHUB_OUTPUT
+          else
+            echo "docker_tag=${{ env.BRANCH_NAME }}" >> $GITHUB_OUTPUT
+          fi
+
+  build-toolchain:
+    name: Build Deeploy Toolchain Image
+    needs: [ prepare ]
+    runs-on: ${{ matrix.runner }}
+    strategy:
+      fail-fast: false
+      matrix:
+        platform: [amd64, arm64]
+        include:
+          - platform: amd64
+            runner: ubuntu-latest
+          - platform: arm64
+            runner: ubuntu-22.04-arm
+    steps:
+      - uses: actions/checkout@v2
+
+      - name: Free up disk space
+        uses: jlumbroso/free-disk-space@v1.3.1
+        with:
+          android: true
+          dotnet: true
+          haskell: true
+          large-packages: true
+
+      - uses: docker/setup-buildx-action@v1
+
+      - name: GHCR Log-in
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Build Cache for Docker
+        uses: actions/cache@v3
+        with:
+          path: var-ccache
+          key: ${{ runner.os }}-${{ matrix.platform }}-build-cache-toolchain
+
+      - name: Inject build-cache
+        uses: reproducible-containers/buildkit-cache-dance@v3.1.0
+        with:
+          cache-map: |
+            {
+              "var-ccache": "/ccache"
+            }
+          skip-extraction: ${{ steps.cache.outputs.cache-hit }}
+
+      - name: Lower Case Repository Name
+        run: |
+          echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV}
+        env:
+          OWNER: '${{ github.repository_owner }}'
+
+      - name: Build and push toolchain image
+        uses: docker/build-push-action@v6
+        with:
+          platforms: linux/${{ matrix.platform }}
+          context: .
+          file: Container/Dockerfile.toolchain
+          push: true
+          tags: |
+            ghcr.io/${{ env.OWNER_LC }}/deeploy-toolchain:latest-${{ matrix.platform }}
+            ghcr.io/${{ env.OWNER_LC }}/deeploy-toolchain:${{ needs.prepare.outputs.docker_tag }}-${{ matrix.platform }}
+
+  merge-toolchain-images:
+    name: Merge Deeploy Toolchain Images
+    runs-on: ubuntu-latest
+    needs: [ prepare, build-toolchain ]
+    steps:
+      - name: GHCR Log-in
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Lower Case Repository Name
+        run: |
+          echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV}
+        env:
+          OWNER: '${{ github.repository_owner }}'
+
+      - uses: Noelware/docker-manifest-action@v1
+        with:
+          inputs: ghcr.io/${{ env.OWNER_LC }}/deeploy-toolchain:latest-amd64,ghcr.io/${{ env.OWNER_LC }}/deeploy-toolchain:latest-arm64
+          tags: ghcr.io/${{ env.OWNER_LC }}/deeploy-toolchain:latest,ghcr.io/${{ env.OWNER_LC }}/deeploy-toolchain:${{ needs.prepare.outputs.docker_tag }}
+          push: true
\ No newline at end of file
diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index 911dc8cd93..af6a5066eb 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -4,12 +4,17 @@ on:
   push:
   pull_request:
   workflow_dispatch:
+    inputs:
+      docker_image_deeploy:
+        description: 'Deeploy Image to use'
+        required: false
+        default: 'ghcr.io/pulp-platform/deeploy:main'
   schedule:
     # Runs the CI on the default branch every 6 days at 2AM CET to keep the cache fresh
     - cron: "0 1 */6 * *"
 
 env:
-  DOCKER_IMAGE: ghcr.io/pulp-platform/deeploy:main
+  DOCKER_IMAGE: ${{ github.event.inputs.docker_image_deeploy || 'ghcr.io/pulp-platform/deeploy:main' }}
 
 jobs:
 
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 5df2208957..6703ff81b6 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -4,20 +4,6 @@
     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
     "version": "0.2.0",
     "configurations": [
-        {
-            "name": "Python: Generic Platform Adder",
-            "type": "debugpy",
-            "request": "launch",
-            "justMyCode": false,
-            "program": "generateNetwork.py",
-            "cwd": "${workspaceFolder}/DeeployTest",
-            "args": [
-                "-t",
-                "Tests/Adder",
-                "-p",
-                "Generic"
-            ]
-        },
         {
             "name": "Deeploy Generate Untiled",
             "type": "debugpy",
@@ -26,12 +12,7 @@
             "console": "integratedTerminal",
             "cwd": "${workspaceFolder}/DeeployTest",
             "justMyCode": false,
-            "args": [
-                "-v",
-                "-p${input:platformUntiled}",
-                "-t${input:model}",
-                "${input:additionalArgsUntiled}"
-            ]
+            "args": "-p${input:platformUntiled} -t${input:model} ${input:additionalArgsUntiled}"
         },
         {
             "name": "Deeploy Generate Tiled",
@@ -41,11 +22,7 @@
             "console": "integratedTerminal",
             "cwd": "${workspaceFolder}/DeeployTest",
             "justMyCode": false,
-            "args": [
-                "-p${input:platformTiled}",
-                "-t${input:model}",
-                "${input:additionalArgsTiled}"
-            ]
+            "args": "-p${input:platformTiled} -t${input:model} ${input:additionalArgsTiled}"
         }
     ],
     "inputs": [
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fbdb70a0be..d36a1f2a1a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,22 @@
 
 ## Unreleased
 
+## ARM Docker Container and Minor Bug Fix
+### Added
+- `BuildDockerToolchain.yml` to build Toolchain Docker container
+- `BuildDockerDeeploy.yml` to build Deeploy Docker container
+- Add support for `linux/arm64` containers
+- Added caching to speed up container builds
+- Makefile to simplify local container build
+
+### Changed
+- Split the original build flow into two container
+
+### Fixed
+- Fixed broken VSCode launch configuration
+- Fixed broken `pulp-sdk` hash
+- Fix issue with building `banshee` on `linux/arm
+
 ## Autoselect Self-Hosted Runners if the Action runs on Upstream
 
 ### Changed
@@ -238,14 +254,14 @@ Change main.c to use OUTPUTTYPE instead of float
 
 ## Add MiniMalloc and Decouple Memory Allocation and Tiling
 
-## Added
+### Added
 -  Installation and compilation flow for MiniMalloc through Makefile.
 - Adapt the docker to install MiniMalloc and declare necessary symbols.
 - Add the `constraintTileBuffersWithOverlappingLifetime` method to the memory scheduler to add the necessary memory constraint when we decouple memory allocation and tiling.
 - Add the `minimalloc` method to the `Tiler` class. MiniMalloc comes as a precompiled cpp library using CSV for I/O. Hence, this method converts Deeploy's memory map to MiniMalloc's CSV representation, calls a subprocess to run MiniMalloc, reads the output CSV, and translates it back to Deeploy's memory map.
 - Add MiniMalloc to the memory allocation strategies and add a new argument to the test runner to control the L2 size.
 
-## Fixed
+### Fixed
 - Fix `testMVP.py` to get a proper should fail test.
 
 ## Implemented Quant Layer for Generic and Siracusa
diff --git a/Container/Dockerfile b/Container/Dockerfile
deleted file mode 100644
index ce77db92ad..0000000000
--- a/Container/Dockerfile
+++ /dev/null
@@ -1,152 +0,0 @@
-########## Stage 1: Large image to build toolchains and emulator ##########
-FROM ubuntu:22.04 AS builder
-
-ARG PYTHON_VERSION=3.8.0
-ARG DEBIAN_FRONTEND=noninteractive
-
-ARG UBUNTU_VERSION=22.04
-ARG BENDER_VERSION=0.28.1
-ARG SNITCH_LLVM_VERSION=15.0.0-snitch-0.1.0
-
-ENV TZ=Etc/UTC
-
-WORKDIR /app
-COPY toolchain/ toolchain/
-COPY Makefile ./
-
-RUN apt-get upgrade
-RUN apt-get update
-RUN DEBIAN_FRONTEND=noninteractive apt-get install -y git-lfs \
-    build-essential \
-    ccache \
-    ninja-build \
-    pkg-config \
-    ibglib2.0-dev \
-    libpixman-1-dev \
-    python3 \
-    python-is-python3 \
-    curl \
-    protobuf-compiler \
-    libftdi-dev \
-    libftdi1 \
-    doxygen \
-    libsdl2-dev \
-    scons \
-    gtkwave \
-    libsndfile1-dev \
-    rsync \
-    autoconf \
-    automake \
-    texinfo \
-    libtool \
-    libsdl2-ttf-dev \
-    gcc-multilib \
-    wget \
-    clang-format
-
-# Install cmake 3.31.1
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.31.1/cmake-3.31.1-linux-x86_64.sh && \
-    chmod +x cmake-3.31.1-linux-x86_64.sh && \
-    ./cmake-3.31.1-linux-x86_64.sh --prefix=/usr --skip-license
-
-# Compile minimalloc
-RUN make minimalloc
-
-# Install Python
-RUN wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz
-RUN tar xzf Python-${PYTHON_VERSION}.tgz
-RUN cd Python-${PYTHON_VERSION} && \
-    ./configure --enable-optimizations --prefix=/opt/python/ && \
-    make install -j
-
-# Install pip
-RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
-    python get-pip.py && \
-    rm get-pip.py
-
-# Build Rust tools
-RUN apt remove cargo -y
-RUN apt autoremove -y
-RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
-ENV PATH="/root/.cargo/bin:${PATH}"
-RUN rustup install 1.63.0
-RUN rustup default 1.63.0
-RUN rustup component add rust-src
-
-# Compile toolchains
-RUN pip install meson
-RUN make llvm
-RUN make llvm-compiler-rt-riscv
-RUN make llvm-compiler-rt-arm
-RUN make picolibc-arm
-RUN make picolibc-riscv
-
-# # Compile emulators
-RUN make pulp-sdk
-RUN make qemu
-RUN make mempool
-RUN make banshee
-# Copy gvsoc requirements for later as they are removed when toolchain folder is deleted
-RUN make xtensor
-RUN make gvsoc && cp -r /app/toolchain/gvsoc/core/requirements.txt /app/core-requirements.txt && cp -r /app/toolchain/gvsoc/gapy/requirements.txt /app/gapy-requirements.txt
-
-# Dependencies needed for compiling Snitch
-## Bender's installaton
-RUN wget https://github.com/pulp-platform/bender/releases/download/v${BENDER_VERSION}/bender-${BENDER_VERSION}-x86_64-linux-gnu-ubuntu${UBUNTU_VERSION}.tar.gz && \
-    tar xzf bender-${BENDER_VERSION}-x86_64-linux-gnu-ubuntu${UBUNTU_VERSION}.tar.gz && cp  /app/bender /bin
-ENV PATH=/app/bender:$PATH
-
-## compile snitch
-ENV LLVM_INSTALL_DIR=/app/install/llvm
-RUN make snitch_runtime && rm -rf /app/snitch_cluster
-
-# Remove toolchain to make the container lighter
-RUN rm -rf toolchain
-
-
-########## Stage 2: Lightweight image with precompiled toolchain and emulators ##########
-FROM ubuntu:22.04
-
-ARG DEBIAN_FRONTEND=noninteractive
-ENV TZ=Etc/UTC
-
-# Export symbols necessary for Deeploy's build flow 
-ENV CMAKE=/usr/bin/cmake
-ENV PULP_SDK_HOME=/app/install/pulp-sdk
-ENV LLVM_INSTALL_DIR=/app/install/llvm
-ENV SNITCH_HOME=/app/install/snitch_cluster
-ENV GVSOC_INSTALL_DIR=/app/install/gvsoc
-ENV MINIMALLOC_INSTALL_DIR=/app/install/minimalloc
-ENV MEMPOOL_HOME=/app/install/mempool
-ENV PATH=/app/install/qemu/bin:/app/install/banshee:$PATH
-ENV PATH="/root/.cargo/bin:${PATH}"
-
-WORKDIR /app
-
-COPY pyproject.toml ./
-
-# Install dependencies
-RUN mkdir -p /root/.cargo/bin/ && \ 
-apt-get update && \ 
-DEBIAN_FRONTEND=noninteractive apt-get install -y git-lfs \
-cmake \
-ccache \ 
-curl \
-libpixman-1-dev \
-libsdl2-dev \
-python-is-python3 && \
-curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
-python get-pip.py && \
-rm get-pip.py && \
-pip install nvidia-pyindex && \
-pip install toml-to-requirements && \
-toml-to-req --toml-file pyproject.toml && \
-pip install -r requirements.txt
-
-COPY --from=builder /app/core-requirements.txt ./core-requirements.txt
-COPY --from=builder /app/gapy-requirements.txt ./gapy-requirements.txt
-RUN pip install -r core-requirements.txt -r gapy-requirements.txt
-
-# Copy pre-built toolchains and emulators
-COPY --from=builder /app/install ./install
-COPY --from=builder /root/.cargo/bin/banshee /root/.cargo/bin/banshee
\ No newline at end of file
diff --git a/Container/Dockerfile.deeploy b/Container/Dockerfile.deeploy
new file mode 100644
index 0000000000..00214219d5
--- /dev/null
+++ b/Container/Dockerfile.deeploy
@@ -0,0 +1,97 @@
+########## Stage 1: Large image to build toolchains and emulator ##########
+ARG BASE_IMAGE=ghcr.io/pulp-platform/deeploy-toolchain
+FROM ${BASE_IMAGE} AS toolchain
+
+# Intermediate Stage
+ARG DEBIAN_FRONTEND=noninteractive
+ARG BENDER_VERSION=0.28.1
+ARG UBUNTU_VERSION=22.04
+ARG TARGETPLATFORM
+
+ENV DEBIAN_FRONTEND=noninteractive
+ENV TZ=Etc/UTC
+ENV PATH="/root/.cargo/bin:/app/bender:${PATH}"
+ENV LLVM_INSTALL_DIR=/app/install/llvm
+
+WORKDIR /app
+
+# Make sure updates in the repo are reflected in the image
+COPY toolchain/*.patch toolchain/
+COPY Makefile ./
+
+# Compile emulators
+RUN --mount=type=cache,target=/ccache \
+    ccache -z && \
+    make pulp-sdk qemu mempool banshee xtensor && \
+    make gvsoc && \
+    cp -r /app/toolchain/gvsoc/core/requirements.txt /app/core-requirements.txt && \
+    cp -r /app/toolchain/gvsoc/gapy/requirements.txt /app/gapy-requirements.txt && \
+    ccache -s
+
+# Install Bender
+RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
+    wget https://github.com/pulp-platform/bender/releases/download/v${BENDER_VERSION}/bender-${BENDER_VERSION}-x86_64-linux-gnu-ubuntu${UBUNTU_VERSION}.tar.gz && \
+    tar xzf bender-${BENDER_VERSION}-x86_64-linux-gnu-ubuntu${UBUNTU_VERSION}.tar.gz && \
+    cp  /app/bender /bin; \
+elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
+    wget https://github.com/Xeratec/bender/releases/download/v0.28.3-rc1/bender-0.28.3-rc1-arm64-linux-gnu-ubuntu${UBUNTU_VERSION}.tar.gz && \
+    tar xzf bender-0.28.3-rc1-arm64-linux-gnu-ubuntu${UBUNTU_VERSION}.tar.gz && \
+    cp  /app/bender /bin; \
+fi
+
+# Compile Snitch Runtime
+ENV CC="gcc"
+ENV CXX="g++"
+RUN --mount=type=cache,target=/ccache \
+    ccache -z && \
+    make snitch_runtime && \
+    ccache -s
+
+# Remove toolchain to make the container lighter
+RUN rm -rf toolchain
+
+########## Stage 2: Lightweight image with precompiled toolchain and emulators ##########
+FROM ubuntu:22.04 AS deeploy
+
+ARG DEBIAN_FRONTEND=noninteractive
+ENV TZ=Etc/UTC
+
+# Export symbols necessary for Deeploy's build flow
+ENV CMAKE=/usr/bin/cmake
+ENV PULP_SDK_HOME=/app/install/pulp-sdk
+ENV LLVM_INSTALL_DIR=/app/install/llvm
+ENV SNITCH_HOME=/app/install/snitch_cluster
+ENV GVSOC_INSTALL_DIR=/app/install/gvsoc
+ENV MINIMALLOC_INSTALL_DIR=/app/install/minimalloc
+ENV MEMPOOL_HOME=/app/install/mempool
+ENV PATH=/root/.cargo/bin:/app/install/qemu/bin:/app/install/banshee:$PATH
+
+WORKDIR /app
+
+COPY pyproject.toml ./
+
+# Install dependencies
+RUN mkdir -p /root/.cargo/bin/ && \
+    apt-get update && \
+    apt-get install -y git-lfs \
+    cmake \
+    ccache \
+    curl \
+    libpixman-1-dev \
+    libsdl2-dev \
+    python-is-python3 && \
+    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
+    python get-pip.py && \
+    rm get-pip.py && \
+    pip install nvidia-pyindex && \
+    pip install toml-to-requirements && \
+    toml-to-req --toml-file pyproject.toml && \
+    pip install -r requirements.txt
+
+COPY --from=toolchain /app/core-requirements.txt ./core-requirements.txt
+COPY --from=toolchain /app/gapy-requirements.txt ./gapy-requirements.txt
+RUN pip install -r core-requirements.txt -r gapy-requirements.txt
+
+# Copy pre-built toolchains and emulators
+COPY --from=toolchain /app/install ./install
+COPY --from=toolchain /root/.cargo/bin/banshee /root/.cargo/bin/banshee
\ No newline at end of file
diff --git a/Container/Dockerfile.toolchain b/Container/Dockerfile.toolchain
new file mode 100644
index 0000000000..cb2037c860
--- /dev/null
+++ b/Container/Dockerfile.toolchain
@@ -0,0 +1,93 @@
+########## Stage 1: Large image to build toolchains and emulator ##########
+FROM ubuntu:22.04 AS toolchain
+
+ARG PYTHON_VERSION=3.8.0
+ARG TARGETPLATFORM
+ENV DEBIAN_FRONTEND=noninteractive
+
+ENV TZ=Etc/UTC
+ENV CC="ccache gcc"
+ENV CXX="ccache g++"
+ENV CCACHE_DIR=/ccache
+ENV PATH="/root/.cargo/bin:${PATH}"
+
+# Change the working directory
+WORKDIR /app
+
+# Install dependencies
+RUN apt-get upgrade && \
+    apt-get update && \
+    apt-get install -y git-lfs \
+    build-essential \
+    ccache \
+    ninja-build \
+    pkg-config \
+    ibglib2.0-dev \
+    libpixman-1-dev \
+    python3 \
+    python3-dev \
+    python-is-python3 \
+    curl \
+    protobuf-compiler \
+    libftdi-dev \
+    libftdi1 \
+    doxygen \
+    libsdl2-dev \
+    scons \
+    gtkwave \
+    libsndfile1-dev \
+    rsync \
+    autoconf \
+    automake \
+    texinfo \
+    libtool \
+    libsdl2-ttf-dev \
+    gcc \
+    wget \
+    clang-format
+
+# Install CMake
+RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
+    wget https://github.com/Kitware/CMake/releases/download/v3.31.1/cmake-3.31.1-linux-x86_64.sh && \
+    chmod +x cmake-3.31.1-linux-x86_64.sh && \
+    ./cmake-3.31.1-linux-x86_64.sh --prefix=/usr --skip-license; \
+elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
+    wget https://github.com/Kitware/CMake/releases/download/v3.31.1/cmake-3.31.1-linux-aarch64.sh && \
+    chmod +x ./cmake-3.31.1-linux-aarch64.sh && \
+    ./cmake-3.31.1-linux-aarch64.sh --prefix=/usr --skip-license; \
+fi
+
+# Install pip
+RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
+    python get-pip.py && \
+    rm get-pip.py
+
+# Build Rust tools
+RUN apt remove cargo -y && \
+    apt autoremove -y && \
+    curl https://sh.rustup.rs -sSf | bash -s -- -y && \
+    rustup install 1.63.0 && \
+    rustup default 1.63.0 && \
+    rustup component add rust-src
+
+# Install meson
+RUN pip install meson
+
+COPY toolchain/ toolchain/
+COPY Makefile ./
+
+# Compile minimalloc
+RUN --mount=type=cache,target=/ccache \
+    ccache -z && make minimalloc && ccache -s
+
+# Compile toolchains
+RUN --mount=type=cache,target=/ccache \
+    ccache -z && make llvm && make llvm-compiler-rt-riscv && \
+    make llvm-compiler-rt-arm && make picolibc-arm && \
+    make picolibc-riscv && ccache -s
+
+# Remove unecessary files
+RUN rm -rf cmake-* && \
+    rm -rf toolchain/llvm-project && \
+    rm -rf toolchain/minimalloc && \
+    rm -rf toolchain/picolibc
\ No newline at end of file
diff --git a/Container/Makefile b/Container/Makefile
new file mode 100644
index 0000000000..7432aa059e
--- /dev/null
+++ b/Container/Makefile
@@ -0,0 +1,64 @@
+# ----------------------------------------------------------------------
+#
+# File: Makefile
+#
+# Created: 20.05.2025
+#
+# Copyright (C) 2025, ETH Zurich and University of Bologna.
+#
+# Authors:
+# - Philip Wiese, ETH Zurich
+#
+# ----------------------------------------------------------------------
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed under the Apache License, Version 2.0 (the License); you may
+# not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an AS IS BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Variables
+TOOLCHAIN_IMAGE ?= ghcr.io/pulp-platform/deeploy-toolchain:latest
+DEEPOY_IMAGE ?= ghcr.io/pulp-platform/deeploy:latest
+
+.PHONY: all toolchain deeploy push clean help
+
+help:
+	@echo "Makefile for building Deeploy Docker images"
+	@echo ""
+	@echo "Usage:"
+	@echo "  make toolchain   # Build only the toolchain image"
+	@echo "  make deeploy     # Build only the deploy image"
+	@echo "  make all         # Build both images"
+	@echo "  make clean       # Remove all images (optional and dangerous)"
+	@echo ""
+	@echo "Build Variables:"
+	@echo "  TOOLCHAIN_IMAGE  # Name of the toolchain image (default: $(TOOLCHAIN_IMAGE))"
+	@echo "  DEEPOY_IMAGE     # Name of the deploy image (default: $(DEEPOY_IMAGE))"
+	@echo ""
+	@echo "Example Usage:"
+	@echo "  make toolchain TOOLCHAIN_IMAGE=my-toolchain:latest"
+	@echo "  make deeploy DEEPOY_IMAGE=my-deploy:latest"
+	@echo "  make all TOOLCHAIN_IMAGE=my-toolchain:latest DEEPOY_IMAGE=my-deploy:latest"
+
+# Build only the toolchain image
+toolchain:
+	DOCKER_BUILDKIT=1 docker build -f Dockerfile.toolchain -t $(TOOLCHAIN_IMAGE) ..
+
+# Build the final deploy image using the toolchain image
+deeploy:
+	DOCKER_BUILDKIT=1 docker build -f Dockerfile.deeploy --build-arg BASE_IMAGE=$(TOOLCHAIN_IMAGE) -t $(DEEPOY_IMAGE) ..
+
+# Build both
+all: toolchain deeploy
+
+# Clean all images (optional and dangerous)
+clean:
+	docker rmi $(TOOLCHAIN_IMAGE) $(DEEPOY_IMAGE) || true
diff --git a/Makefile b/Makefile
index afc8f58c4f..afc2be2245 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@
 #
 # Copyright (C) 2023, ETH Zurich and University of Bologna.
 #
-# Authors: 
+# Authors:
 # - Moritz Scherer, ETH Zurich
 # - Victor Jung, ETH Zurich
 #
@@ -62,7 +62,7 @@ CMAKE ?= cmake
 
 LLVM_COMMIT_HASH ?= 1ccb97ef1789b8c574e3fcab0de674e11b189b96
 PICOLIBC_COMMIT_HASH ?= 31ff1b3601b379e4cab63837f253f59729ce1fef
-PULP_SDK_COMMIT_HASH ?= 3e1e569bd789a11d9dde6d6b3930849505e68b4a
+PULP_SDK_COMMIT_HASH ?= d44cd601c67319dd8f35ab349568aab51f371248
 BANSHEE_COMMIT_HASH ?= 0e105921e77796e83d01c2aa4f4cadfa2005b4d9
 MEMPOOL_COMMIT_HASH ?= affd45d94e05e375a6966af6a762deeb182a7bd6
 SNITCH_COMMIT_HASH ?= e02cc9e3f24b92d4607455d5345caba3eb6273b2
@@ -119,6 +119,8 @@ ${LLVM_INSTALL_DIR}: ${TOOLCHAIN_DIR}/llvm-project
 	-DLLVM_OPTIMIZED_TABLEGEN=ON \
 	-DLLVM_PARALLEL_LINK_JOBS=2 \
 	-DCMAKE_BUILD_TYPE=Release \
+	-DCMAKE_C_COMPILER_LAUNCHER=ccache \
+	-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
 	../llvm && \
 	${CMAKE} --build . -j && \
 	${CMAKE} --install .
diff --git a/README.md b/README.md
index 819936adaa..0b4257778a 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@ However, to run the code generated by Deeploy on a certain target, you need the
 
 We provide a Docker container where Deeploy works Out-of-the-Box (*i.e.* with all the dependencies pre-installed). To pull the docker image, run:
 ```
-docker pull ghcr.io/pulp-platform/deeploy:main --platform linux/amd64
+docker pull ghcr.io/pulp-platform/deeploy:main
 ```
 Then you can create and start the container in interactive mode with:
 ```
diff --git a/toolchain/banshee.patch b/toolchain/banshee.patch
index 4f6c830123..6e982afcb8 100644
--- a/toolchain/banshee.patch
+++ b/toolchain/banshee.patch
@@ -1,10 +1,10 @@
 diff --git a/Cargo.toml b/Cargo.toml
-index d406357..492c1e0 100644
+index d406357..eb5ce8e 100644
 --- a/Cargo.toml
 +++ b/Cargo.toml
-@@ -11,30 +11,31 @@ edition = "2018"
+@@ -11,30 +11,32 @@ edition = "2018"
  build = "build/build.rs"
- 
+
  [dependencies]
 -anyhow = "1"
 -binread = "2.2.0"
@@ -50,7 +50,8 @@ index d406357..492c1e0 100644
 +termion = "=2.0.3"
 +thiserror = "=1.0.21"
 +to-binary = "=0.4.0"
- 
++libc = "0.2"
+
  [build-dependencies]
  cc = "1.0"
 diff --git a/build/runtime.rs b/build/runtime.rs
@@ -72,10 +73,26 @@ index 216996b..e5abe38 100644
 --- a/src/engine.rs
 +++ b/src/engine.rs
 @@ -281,7 +281,6 @@ impl Engine {
- 
+
              LLVMPassManagerBuilderPopulateFunctionPassManager(builder, func_passes);
              LLVMAddAnalysisPasses(tm, module_passes);
 -            LLVMPassManagerBuilderPopulateLTOPassManager(builder, module_passes, 0, 1);
              LLVMPassManagerBuilderPopulateModulePassManager(builder, module_passes);
- 
+
              // Create and run the function pass manager.
+diff --git a/src/tran.rs b/src/tran.rs
+index 1054744..ae5ae78 100644
+--- a/src/tran.rs
++++ b/src/tran.rs
+@@ -18,9 +18,10 @@ use std::{
+     collections::{BTreeSet, HashMap},
+     ffi::CString,
+ };
++use libc;
+ extern crate flexfloat;
+
+-static NONAME: &'static i8 = unsafe { std::mem::transmute("\0".as_ptr()) };
++static NONAME: &'static libc::c_char = unsafe { std::mem::transmute("\0".as_ptr()) };
+
+ /// Base address of the stream semantic regsiters
+ static SSR_BASE: u64 = 0x204800;
