diff --git a/src/config.rs b/src/config.rs
index 4828be022b9ec34998a9c69bda7f702e8f060fc8..0c6a0f6fb123a5304dad712c04fe360ce0f7c7ff 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -60,6 +60,12 @@ pub fn argv_to_config(argv: &Vec<String>) -> config::Config {
 pub fn get_optional<'de, T: Deserialize<'de>>(conf: &config::Config, key: &str) -> Option<T> {
     match conf.get(key) {
         Ok(v) => Some(v),
-        Err(_) => None,
+        Err(_) => {
+            // Try falling back to parent block
+            match key.find('.') {
+                Some(i) => get_optional(conf, &key[i+1..]),
+                None => None,
+            }
+        },
     }
 }
diff --git a/src/pam.rs b/src/pam.rs
index 2761e25fceeb38983458b71dd58fcddd78f1fc40..b469af08f4de90955c12c009b231854eecb45291 100644
--- a/src/pam.rs
+++ b/src/pam.rs
@@ -133,7 +133,7 @@ fn pam_sm_prepare(argv: &Vec<String>) -> Config {
     let conf = get_config(Some(conf_args));
 
     let mut log_level = log::LevelFilter::Error;
-    if conf.get_bool("debug").unwrap_or_default() || conf.get_bool("pam.debug").unwrap_or_default() {
+    if get_optional(&conf, "pam.debug").unwrap_or_default() {
         log_level = log::LevelFilter::Debug;
     }
     setup_log(log_level);