diff --git a/settings.gradle b/settings.gradle
index cb613b6..cf075af 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -16,3 +16,4 @@ include 'org.jdrupes.vmoperator.vmconlet'
include 'org.jdrupes.vmoperator.runner.qemu'
include 'org.jdrupes.vmoperator.common'
include 'org.jdrupes.vmoperator.util'
+include 'spice-squid'
diff --git a/spice-squid/.checkstyle b/spice-squid/.checkstyle
new file mode 100644
index 0000000..7f2c604
--- /dev/null
+++ b/spice-squid/.checkstyle
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/spice-squid/.eclipse-pmd b/spice-squid/.eclipse-pmd
new file mode 100644
index 0000000..8b394f8
--- /dev/null
+++ b/spice-squid/.eclipse-pmd
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/spice-squid/.settings/net.sf.jautodoc.prefs b/spice-squid/.settings/net.sf.jautodoc.prefs
new file mode 100644
index 0000000..03e8200
--- /dev/null
+++ b/spice-squid/.settings/net.sf.jautodoc.prefs
@@ -0,0 +1,8 @@
+add_header=true
+eclipse.preferences.version=1
+header_text=/*\n * VM-Operator\n * Copyright (C) 2024 Michael N. Lipp\n * \n * This program is free software\: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n */
+project_specific_settings=true
+replacements=\n\n\nReturns the\nSets the\nAdds the\nEdits the\nRemoves the\nInits the\nParses the\nCreates the\nBuilds the\nChecks if is\nPrints the\nChecks for\n\n\n
+visibility_package=false
+visibility_private=false
+visibility_protected=false
diff --git a/spice-squid/.settings/org.eclipse.buildship.core.prefs b/spice-squid/.settings/org.eclipse.buildship.core.prefs
new file mode 100644
index 0000000..258eb47
--- /dev/null
+++ b/spice-squid/.settings/org.eclipse.buildship.core.prefs
@@ -0,0 +1,13 @@
+arguments=
+auto.sync=false
+build.scans.enabled=false
+connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
+connection.project.dir=..
+eclipse.preferences.version=1
+gradle.user.home=
+java.home=
+jvm.arguments=
+offline.mode=false
+override.workspace.settings=false
+show.console.view=false
+show.executions.view=false
diff --git a/spice-squid/.settings/org.eclipse.core.resources.prefs b/spice-squid/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/spice-squid/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/spice-squid/.settings/org.eclipse.core.runtime.prefs b/spice-squid/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..5a0ad22
--- /dev/null
+++ b/spice-squid/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/spice-squid/Containerfile b/spice-squid/Containerfile
new file mode 100644
index 0000000..b65b631
--- /dev/null
+++ b/spice-squid/Containerfile
@@ -0,0 +1,11 @@
+FROM alpine:3.19
+
+RUN apk update &&\
+ apk add --no-cache inotify-tools &&\
+ apk add --no-cache squid
+
+COPY run.sh /usr/local/bin/run-squid.sh
+
+CMD ["/usr/local/bin/run-squid.sh"]
+
+EXPOSE 3128
diff --git a/spice-squid/build.gradle b/spice-squid/build.gradle
new file mode 100644
index 0000000..2cb7183
--- /dev/null
+++ b/spice-squid/build.gradle
@@ -0,0 +1,77 @@
+plugins {
+ id 'org.jdrupes.vmoperator.java-application-conventions'
+}
+
+dependencies {
+}
+
+task buildImage(type: Exec) {
+ inputs.files 'Containerfile'
+
+ commandLine 'podman', 'build', '--pull',
+ '-t', "${project.name}:${project.version}",\
+ '-f', 'Containerfile', '.'
+}
+
+task tagLatestImage(type: Exec) {
+ dependsOn buildImage
+
+ enabled = !project.version.contains("SNAPSHOT")
+ && !project.version.contains("alpha") \
+ && !project.version.contains("beta") \
+ || project.rootProject.properties['docker.testRegistry'] \
+ && project.rootProject.properties['docker.registry'] \
+ == project.rootProject.properties['docker.testRegistry']
+
+ commandLine 'podman', 'tag', "${project.name}:${project.version}",\
+ "${project.name}:latest"
+}
+
+task buildLatestImage {
+ dependsOn buildImage
+ dependsOn tagLatestImage
+}
+
+task pushImage(type: Exec) {
+ dependsOn buildImage
+
+ commandLine 'podman', 'push', '--tls-verify=false', \
+ "localhost/${project.name}:${project.version}", \
+ "${project.rootProject.properties['docker.registry']}" \
+ + "/${project.name}:${project.version}"
+}
+
+task pushLatestImage(type: Exec) {
+ dependsOn buildLatestImage
+
+ enabled = !project.version.contains("SNAPSHOT")
+ && !project.version.contains("alpha") \
+ && !project.version.contains("beta") \
+ || project.rootProject.properties['docker.testRegistry'] \
+ && project.rootProject.properties['docker.registry'] \
+ == project.rootProject.properties['docker.testRegistry']
+
+ commandLine 'podman', 'push', '--tls-verify=false', \
+ "localhost/${project.name}:${project.version}", \
+ "${project.rootProject.properties['docker.registry']}" \
+ + "/${project.name}:latest"
+}
+
+task pushImages {
+ // Don't push without testing first
+ dependsOn pushImage
+ dependsOn pushLatestImage
+}
+
+test {
+ enabled = project.hasProperty("k8s.testCluster")
+
+ useJUnitPlatform()
+
+ testLogging {
+ showStandardStreams = true
+ }
+
+ systemProperty "k8s.testCluster", project.hasProperty("k8s.testCluster")
+ ? project.getProperty("k8s.testCluster") : null
+}
diff --git a/spice-squid/run.sh b/spice-squid/run.sh
new file mode 100755
index 0000000..eddea39
--- /dev/null
+++ b/spice-squid/run.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+CONF_OPT="-f /run/etc/squid/squid.conf"
+/usr/sbin/squid $CONF_OPT
+
+inotifywait -m -e create -r /run/etc/squid |
+ while read file_path file_event file_name; do
+ if [ "$file_event" != "CREATE" ]; then
+ continue
+ fi
+ if [ -r /run/squid/squid.pid ]; then
+ echo "Reconfiguring squid"
+ /usr/sbin/squid $CONF_OPT -k reconfigure
+ else
+ echo "Restarting squid"
+ /usr/sbin/squid $CONF_OPT
+ fi
+ echo "Processed event"
+ done
diff --git a/spice-squid/squid.conf b/spice-squid/squid.conf
new file mode 100644
index 0000000..724b0df
--- /dev/null
+++ b/spice-squid/squid.conf
@@ -0,0 +1,4 @@
+http_access deny all
+
+# Squid normally listens to port 3128
+http_port 3128