diff --git a/README.md b/README.md
index d9ee385..d4c692e 100644
--- a/README.md
+++ b/README.md
@@ -22,18 +22,16 @@ Hosts that require a stable IPv4 address may be assigned a static mapping in the
 Protomask uses a [TOML](https://toml.io) configuration file. Here is a functional example:
 
 ```toml
-[Interface]
-# The IPv6 prefix to listen for V6 traffic on
-Prefix = "64:ff9b::/96"
-# A list of IPv4 prefixes to map V6 traffic to
-Pool = ["192.0.2.0/24"]
+# The NAT64 prefix to route to protomask
+Nat64Prefix = "64:ff9b::/96"
 
-[Rules]
-# A static mapping of IPv4 and IPv6 addresses
-# These addresses will not used in the dynamic pool
-MapStatic = [{ v4 = "192.0.2.2", v6 = "2001:db8:1::2" }]
-# How many seconds to keep a dynamic mapping alive for
-ReservationDuration = 7200 # Optional
+[Pool]
+# All prefixes in the pool
+Prefixes = ["192.0.2.0/24"]
+# The maximum duration a prefix will be reserved for after becoming idle
+MaxIdleDuration = 7200 # Optional, seconds. Defaults to 7200 (2 hours)
+# Permanent address mappings
+Static = [{ v4 = "192.0.2.2", v6 = "2001:db8:1::2" }]
 ```
 
 ## Installation
diff --git a/protomask.toml b/protomask.toml
index a8cc9c9..9d637bc 100644
--- a/protomask.toml
+++ b/protomask.toml
@@ -1,14 +1,12 @@
-# Example configuration file for protomask
-[Interface]
-# Addresses to use for ICMP messaging
-Address4 = "192.0.2.1"
-Address6 = "2001:db8:1::1"
-# A list of IPv4 prefixes to NAT to
-Pool = ["192.0.2.0/24"]
-# The IPv6 prefix to listen for traffic on
-Prefix = "64:ff9b::/96"
+# Protomask example configuraiton file
 
-[Rules]
-# A static mapping of IPv4 and IPv6 addresses
-# These addresses will be exclusively reserved, and not used in the general pool
-MapStatic = [{ v4 = "192.0.2.2", v6 = "2001:db8:1::2" }]
+# The NAT64 prefix to route to protomask
+Nat64Prefix = "64:ff9b::/96"
+
+[Pool]
+# All prefixes in the pool
+Prefixes = ["192.0.2.0/24"]
+# The maximum duration a prefix will be reserved for after becoming idle
+MaxIdleDuration = 7200 # Optional, seconds. Defaults to 7200 (2 hours)
+# Permanent address mappings
+Static = [{ v4 = "192.0.2.2", v6 = "2001:db8:1::2" }]
diff --git a/src/config.rs b/src/config.rs
index 29dbe78..4f7d013 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -7,17 +7,6 @@ use std::{
 use colored::Colorize;
 use ipnet::{Ipv4Net, Ipv6Net};
 
-/// Interface config
-#[derive(Debug, serde::Deserialize)]
-pub struct InterfaceConfig {
-    /// Ipv4 pool
-    #[serde(rename = "Pool")]
-    pub pool: Vec<Ipv4Net>,
-    /// IPv6 prefix
-    #[serde(rename = "Prefix")]
-    pub prefix: Ipv6Net,
-}
-
 /// A static mapping rule
 #[derive(Debug, serde::Deserialize)]
 pub struct AddressMappingRule {
@@ -34,16 +23,19 @@ fn default_reservation_duration() -> u64 {
 
 /// Rules config
 #[derive(Debug, serde::Deserialize)]
-pub struct RulesConfig {
+pub struct PoolConfig {
+    /// Pool prefixes
+    #[serde(rename = "Prefixes")]
+    pub prefixes: Vec<Ipv4Net>,
     /// Static mapping rules
-    #[serde(rename = "MapStatic", default="Vec::new")]
+    #[serde(rename = "Static", default = "Vec::new")]
     pub static_map: Vec<AddressMappingRule>,
     /// How long to hold a dynamic mapping for
-    #[serde(rename = "ReservationDuration", default="default_reservation_duration")]
+    #[serde(rename = "MaxIdleDuration", default = "default_reservation_duration")]
     reservation_duration: u64,
 }
 
-impl RulesConfig {
+impl PoolConfig {
     /// Get the reservation duration
     pub fn reservation_duration(&self) -> Duration {
         Duration::from_secs(self.reservation_duration)
@@ -53,12 +45,12 @@ impl RulesConfig {
 /// Representation of the `protomask.toml` config file
 #[derive(Debug, serde::Deserialize)]
 pub struct Config {
-    /// Interface config
-    #[serde(rename = "Interface")]
-    pub interface: InterfaceConfig,
-    /// Rules config
-    #[serde(rename = "Rules")]
-    pub rules: RulesConfig,
+    /// The NAT64 prefix
+    #[serde(rename = "Nat64Prefix")]
+    pub nat64_prefix: Ipv6Net,
+    /// Pool configuration
+    #[serde(rename = "Pool")]
+    pub pool: PoolConfig,
 }
 
 impl Config {
@@ -84,3 +76,14 @@ impl Config {
         }
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    /// Test that fails if the example file is not valid
+    #[test]
+    fn ensure_example_is_valid() {
+        let _ = Config::load("protomask.toml").unwrap();
+    }
+}
diff --git a/src/main.rs b/src/main.rs
index 875dcbb..74a0e64 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -20,6 +20,7 @@ pub async fn main() {
                 "{}: {}",
                 format!(
                     "{}{}",
+                    // Level messages are padded to keep the output looking somewhat sane
                     match record.level() {
                         log::Level::Error => "ERROR".red().bold().to_string(),
                         log::Level::Warn => "WARN ".yellow().bold().to_string(),
@@ -27,8 +28,9 @@ pub async fn main() {
                         log::Level::Debug => "DEBUG".bright_blue().bold().to_string(),
                         log::Level::Trace => "TRACE".bright_white().bold().to_string(),
                     },
+                    // Only show the outer package name if verbose logging is enabled (otherwise nothing)
                     match log_verbose {
-                        true => format!(" [{:13}]", record.target().split("::").nth(0).unwrap()),
+                        true => format!(" [{}]", record.target().split("::").nth(0).unwrap()),
                         false => String::new(),
                     }
                     .bright_black()
@@ -50,17 +52,23 @@ pub async fn main() {
     // Parse the config file
     let config = Config::load(args.config_file).unwrap();
 
+    // Currently, only a /96 is supported
+    if config.nat64_prefix.prefix_len() != 96 {
+        log::error!("Only a /96 prefix is supported for the NAT64 prefix");
+        std::process::exit(1);
+    }
+
     // Create the NAT64 instance
     let mut nat64 = Nat64::new(
-        config.interface.prefix,
-        config.interface.pool,
+        config.nat64_prefix,
+        config.pool.prefixes.clone(),
         config
-            .rules
+            .pool
             .static_map
             .iter()
             .map(|rule| (rule.v6, rule.v4))
             .collect(),
-        config.rules.reservation_duration(),
+        config.pool.reservation_duration(),
     )
     .await
     .unwrap();