diff --git a/Cargo.lock b/Cargo.lock
index c484e9b..5226ac6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -993,7 +993,8 @@ name = "hostd"
 version = "0.2.0"
 dependencies = [
  "anyhow",
- "internal",
+ "ipc",
+ "systemd-ipc",
  "varlink",
 ]
 
@@ -1354,7 +1355,7 @@ dependencies = [
 ]
 
 [[package]]
-name = "internal"
+name = "ipc"
 version = "0.2.0"
 dependencies = [
  "serde",
@@ -3129,6 +3130,18 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "systemd-ipc"
+version = "0.2.0"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "varlink",
+ "varlink_generator",
+ "walkdir",
+]
+
 [[package]]
 name = "take_mut"
 version = "0.2.2"
diff --git a/Cargo.toml b/Cargo.toml
index 99e13c5..83c8e99 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,7 +7,8 @@ members = [
   "hostd",
   "trace-request",
   "xtask",
-  "internal",
+  "ipc",
+  "systemd-ipc",
 ]
 default-members = [
   "agent",
diff --git a/hostd/Cargo.toml b/hostd/Cargo.toml
index 464fa55..4a8dee3 100644
--- a/hostd/Cargo.toml
+++ b/hostd/Cargo.toml
@@ -6,4 +6,5 @@ edition.workspace = true
 [dependencies]
 anyhow.workspace = true
 varlink = "11.0.1"
-internal = { path = "../internal" }
+ipc = { path = "../ipc" }
+systemd-ipc = { path = "../systemd-ipc" }
diff --git a/hostd/src/main.rs b/hostd/src/main.rs
index fe1b597..f5d0bea 100644
--- a/hostd/src/main.rs
+++ b/hostd/src/main.rs
@@ -1,10 +1,8 @@
 use anyhow::Result;
 
-use internal::ipc::patagia::io_patagia_hostd;
-use internal::ipc::systemd::io_systemd_hostname::{self, VarlinkClientInterface};
-
-const LISTEN_ADDRESS: &str = "unix:/tmp/patagia/io.patagia.hostd";
-const SYSTEMD_ADDRESS: &str = "unix:/run/systemd/io.systemd.Hostname";
+use ipc::io_patagia_hostd;
+use systemd_ipc::addrs::SYSTEMD_HOSTNAME;
+use systemd_ipc::io_systemd_hostname::{self, VarlinkClientInterface};
 
 struct PatagiaHostd;
 
@@ -21,7 +19,7 @@ impl io_patagia_hostd::VarlinkInterface for PatagiaHostd {
 
     fn describe(&self, call: &mut dyn io_patagia_hostd::Call_Describe) -> varlink::Result<()> {
         // Connect to systemd.Hostname
-        let conn = varlink::Connection::with_address(SYSTEMD_ADDRESS).unwrap();
+        let conn = varlink::Connection::with_address(SYSTEMD_HOSTNAME).unwrap();
         let mut sd = io_systemd_hostname::VarlinkClient::new(conn);
 
         let machine = io_patagia_hostd::Machine {
@@ -45,20 +43,14 @@ fn main() -> Result<()> {
         vec![Box::new(hostd_iface)],
     );
 
-    let addr_path = std::path::Path::new(LISTEN_ADDRESS.strip_prefix("unix:").unwrap())
-        .parent()
-        .unwrap();
+    let addr = format!("unix:{}/{}", env!("XDG_RUNTIME_DIR"), "io.patagia.hostd");
 
-    std::fs::create_dir_all(addr_path)?;
-
-    println!("Varlink Listening on {}", LISTEN_ADDRESS);
+    println!("Varlink Listening on {}", addr);
 
     varlink::listen(
         svc,
-        LISTEN_ADDRESS,
+        &addr,
         &varlink::ListenConfig {
-            // Listen forever (0 = forever)
-            idle_timeout: 0,
             ..Default::default()
         },
     )?;
diff --git a/internal/src/ipc/mod.rs b/internal/src/ipc/mod.rs
deleted file mode 100644
index 8bf455d..0000000
--- a/internal/src/ipc/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub mod patagia;
-pub mod systemd;
diff --git a/internal/src/lib.rs b/internal/src/lib.rs
deleted file mode 100644
index ce14ad3..0000000
--- a/internal/src/lib.rs
+++ /dev/null
@@ -1 +0,0 @@
-pub mod ipc;
diff --git a/internal/.gitignore b/ipc/.gitignore
similarity index 100%
rename from internal/.gitignore
rename to ipc/.gitignore
diff --git a/internal/Cargo.toml b/ipc/Cargo.toml
similarity index 94%
rename from internal/Cargo.toml
rename to ipc/Cargo.toml
index 7a5bc4a..b26a1f5 100644
--- a/internal/Cargo.toml
+++ b/ipc/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "internal"
+name = "ipc"
 version.workspace = true
 edition.workspace = true
 
diff --git a/internal/build.rs b/ipc/build.rs
similarity index 100%
rename from internal/build.rs
rename to ipc/build.rs
diff --git a/internal/src/ipc/patagia/io.patagia.hostd.varlink b/ipc/src/io.patagia.hostd.varlink
similarity index 100%
rename from internal/src/ipc/patagia/io.patagia.hostd.varlink
rename to ipc/src/io.patagia.hostd.varlink
diff --git a/internal/src/ipc/patagia/io_patagia_hostd.rs b/ipc/src/io_patagia_hostd.rs
similarity index 100%
rename from internal/src/ipc/patagia/io_patagia_hostd.rs
rename to ipc/src/io_patagia_hostd.rs
diff --git a/internal/src/ipc/patagia/mod.rs b/ipc/src/lib.rs
similarity index 100%
rename from internal/src/ipc/patagia/mod.rs
rename to ipc/src/lib.rs
diff --git a/systemd-ipc/.gitignore b/systemd-ipc/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/systemd-ipc/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/systemd-ipc/Cargo.toml b/systemd-ipc/Cargo.toml
new file mode 100644
index 0000000..4667cf5
--- /dev/null
+++ b/systemd-ipc/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "systemd-ipc"
+version.workspace = true
+edition.workspace = true
+
+[dependencies]
+serde.workspace = true
+serde_derive = "1.0.217"
+serde_json = "1.0.135"
+varlink = "11.0.1"
+
+[build-dependencies]
+varlink_generator = "10.1.0"
+walkdir = "2.5.0"
+
+[package.metadata.cargo-machete]
+ignored = ["serde"]
diff --git a/systemd-ipc/build.rs b/systemd-ipc/build.rs
new file mode 100644
index 0000000..89bc35a
--- /dev/null
+++ b/systemd-ipc/build.rs
@@ -0,0 +1,12 @@
+extern crate varlink_generator;
+
+use walkdir::WalkDir;
+
+fn main() {
+    // walk dir to find varlink files
+    for entry in WalkDir::new("src").into_iter().filter_map(|e| e.ok()) {
+        if entry.file_name().to_str().unwrap().ends_with(".varlink") {
+            varlink_generator::cargo_build_tosource(&entry.path().display().to_string(), true);
+        }
+    }
+}
diff --git a/systemd-ipc/src/addrs.rs b/systemd-ipc/src/addrs.rs
new file mode 100644
index 0000000..a05aca2
--- /dev/null
+++ b/systemd-ipc/src/addrs.rs
@@ -0,0 +1,2 @@
+#[allow(dead_code)]
+pub const SYSTEMD_HOSTNAME: &str = "unix:/run/systemd/io.systemd.Hostname";
diff --git a/internal/src/ipc/systemd/io.systemd.hostname.varlink b/systemd-ipc/src/io.systemd.hostname.varlink
similarity index 100%
rename from internal/src/ipc/systemd/io.systemd.hostname.varlink
rename to systemd-ipc/src/io.systemd.hostname.varlink
diff --git a/internal/src/ipc/systemd/io_systemd_hostname.rs b/systemd-ipc/src/io_systemd_hostname.rs
similarity index 100%
rename from internal/src/ipc/systemd/io_systemd_hostname.rs
rename to systemd-ipc/src/io_systemd_hostname.rs
diff --git a/internal/src/ipc/systemd/mod.rs b/systemd-ipc/src/lib.rs
similarity index 65%
rename from internal/src/ipc/systemd/mod.rs
rename to systemd-ipc/src/lib.rs
index e13378d..606c22e 100644
--- a/internal/src/ipc/systemd/mod.rs
+++ b/systemd-ipc/src/lib.rs
@@ -1 +1,2 @@
+pub mod addrs;
 pub mod io_systemd_hostname;