diff --git a/Cargo.lock b/Cargo.lock
index e4ade8e..c484e9b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1362,6 +1362,7 @@ dependencies = [
  "serde_json",
  "varlink",
  "varlink_generator",
+ "walkdir",
 ]
 
 [[package]]
@@ -2486,6 +2487,15 @@ version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
 
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
 [[package]]
 name = "schannel"
 version = "0.1.27"
@@ -3799,6 +3809,16 @@ dependencies = [
  "atomic-waker",
 ]
 
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
 [[package]]
 name = "want"
 version = "0.3.1"
@@ -3959,6 +3979,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
+[[package]]
+name = "winapi-util"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
 [[package]]
 name = "winapi-x86_64-pc-windows-gnu"
 version = "0.4.0"
diff --git a/hostd/src/main.rs b/hostd/src/main.rs
index 3ebbabe..c9b7a65 100644
--- a/hostd/src/main.rs
+++ b/hostd/src/main.rs
@@ -1,6 +1,8 @@
 use anyhow::Result;
 
-use internal::io_patagia_hostd::{Call_Apply, Call_Describe, Label, Machine, VarlinkInterface};
+use internal::ipc::patagia::io_patagia_hostd::{
+    Call_Apply, Call_Describe, Label, Machine, VarlinkInterface,
+};
 
 const LISTEN_ADDRESS: &str = "unix:/tmp/patagia/io.patagia.hostd";
 
@@ -35,7 +37,7 @@ impl VarlinkInterface for PatagiaHostd {
 
 fn main() -> Result<()> {
     let hostd = PatagiaHostd;
-    let hostd_iface = internal::io_patagia_hostd::new(Box::new(hostd));
+    let hostd_iface = internal::ipc::patagia::io_patagia_hostd::new(Box::new(hostd));
 
     let svc = varlink::VarlinkService::new(
         "io.patagia.hostd",
diff --git a/internal/Cargo.toml b/internal/Cargo.toml
index f0a2b58..4bff095 100644
--- a/internal/Cargo.toml
+++ b/internal/Cargo.toml
@@ -11,3 +11,4 @@ varlink = "11.0.1"
 
 [build-dependencies]
 varlink_generator = "10.1.0"
+walkdir = "2.5.0"
diff --git a/internal/build.rs b/internal/build.rs
index 0b22cad..89bc35a 100644
--- a/internal/build.rs
+++ b/internal/build.rs
@@ -1,11 +1,12 @@
 extern crate varlink_generator;
 
+use walkdir::WalkDir;
+
 fn main() {
-    // iterate over all varlink files
-    std::fs::read_dir("src").unwrap().for_each(|f| {
-        let f = f.unwrap();
-        if f.file_name().to_str().unwrap().ends_with(".varlink") {
-            varlink_generator::cargo_build_tosource(&f.path().display().to_string(), true);
+    // 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/internal/src/ipc/mod.rs b/internal/src/ipc/mod.rs
new file mode 100644
index 0000000..8bf455d
--- /dev/null
+++ b/internal/src/ipc/mod.rs
@@ -0,0 +1,2 @@
+pub mod patagia;
+pub mod systemd;
diff --git a/internal/src/io.patagia.hostd.varlink b/internal/src/ipc/patagia/io.patagia.hostd.varlink
similarity index 100%
rename from internal/src/io.patagia.hostd.varlink
rename to internal/src/ipc/patagia/io.patagia.hostd.varlink
diff --git a/internal/src/io_patagia_hostd.rs b/internal/src/ipc/patagia/io_patagia_hostd.rs
similarity index 100%
rename from internal/src/io_patagia_hostd.rs
rename to internal/src/ipc/patagia/io_patagia_hostd.rs
diff --git a/internal/src/ipc/patagia/mod.rs b/internal/src/ipc/patagia/mod.rs
new file mode 100644
index 0000000..02666ab
--- /dev/null
+++ b/internal/src/ipc/patagia/mod.rs
@@ -0,0 +1 @@
+pub mod io_patagia_hostd;
diff --git a/internal/src/io.systemd.hostname.varlink b/internal/src/ipc/systemd/io.systemd.hostname.varlink
similarity index 100%
rename from internal/src/io.systemd.hostname.varlink
rename to internal/src/ipc/systemd/io.systemd.hostname.varlink
diff --git a/internal/src/io_systemd_hostname.rs b/internal/src/ipc/systemd/io_systemd_hostname.rs
similarity index 100%
rename from internal/src/io_systemd_hostname.rs
rename to internal/src/ipc/systemd/io_systemd_hostname.rs
diff --git a/internal/src/ipc/systemd/mod.rs b/internal/src/ipc/systemd/mod.rs
new file mode 100644
index 0000000..e13378d
--- /dev/null
+++ b/internal/src/ipc/systemd/mod.rs
@@ -0,0 +1 @@
+pub mod io_systemd_hostname;
diff --git a/internal/src/lib.rs b/internal/src/lib.rs
index 8e3b981..ce14ad3 100644
--- a/internal/src/lib.rs
+++ b/internal/src/lib.rs
@@ -1,2 +1 @@
-pub mod io_patagia_hostd;
-pub mod io_systemd_hostname;
+pub mod ipc;