diff --git a/inc/confutils.php b/inc/confutils.php
index 8643a056c54c7dd25057eb08484f05e0245ed65e..4035d6dd4a2c08716219191004a805d9774b19c4 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -6,6 +6,12 @@
  * @author     Harry Fuecks <hfuecks@gmail.com>
  */
 
+/*
+ * line prefix used to negate single value config items
+ * (scheme.conf & stopwords.conf), e.g.
+ * !gopher
+ */
+const DOKU_CONF_NEGATION = '!';
 
 /**
  * Returns the (known) extension and mimetype of a given filename
@@ -49,6 +55,7 @@ function getMimeTypes() {
     static $mime = null;
     if ( !$mime ) {
         $mime = retrieveConfig('mime','confToHash');
+        $mime = array_filter($mime);
     }
     return $mime;
 }
@@ -62,6 +69,7 @@ function getAcronyms() {
     static $acronyms = null;
     if ( !$acronyms ) {
         $acronyms = retrieveConfig('acronyms','confToHash');
+        $acronyms = array_filter($acronyms, 'strlen');
     }
     return $acronyms;
 }
@@ -75,6 +83,7 @@ function getSmileys() {
     static $smileys = null;
     if ( !$smileys ) {
         $smileys = retrieveConfig('smileys','confToHash');
+        $smileys = array_filter($smileys, 'strlen');
     }
     return $smileys;
 }
@@ -88,6 +97,7 @@ function getEntities() {
     static $entities = null;
     if ( !$entities ) {
         $entities = retrieveConfig('entities','confToHash');
+        $entities = array_filter($entities, 'strlen');
     }
     return $entities;
 }
@@ -101,9 +111,11 @@ function getInterwiki() {
     static $wikis = null;
     if ( !$wikis ) {
         $wikis = retrieveConfig('interwiki','confToHash',array(true));
+        $wikis = array_filter($wikis, 'strlen');
+
+        //add sepecial case 'this'
+        $wikis['this'] = DOKU_URL.'{NAME}';
     }
-    //add sepecial case 'this'
-    $wikis['this'] = DOKU_URL.'{NAME}';
     return $wikis;
 }
 
@@ -114,7 +126,7 @@ function getInterwiki() {
 function getWordblocks() {
     static $wordblocks = null;
     if ( !$wordblocks ) {
-        $wordblocks = retrieveConfig('wordblock','file');
+        $wordblocks = retrieveConfig('wordblock','file',null,'array_merge_with_removal');
     }
     return $wordblocks;
 }
@@ -127,11 +139,11 @@ function getWordblocks() {
 function getSchemes() {
     static $schemes = null;
     if ( !$schemes ) {
-        $schemes = retrieveConfig('scheme','file');
+        $schemes = retrieveConfig('scheme','file',null,'array_merge_with_removal');
+        $schemes = array_map('trim', $schemes);
+        $schemes = preg_replace('/^#.*/', '', $schemes);
+        $schemes = array_filter($schemes);
     }
-    $schemes = array_map('trim', $schemes);
-    $schemes = preg_replace('/^#.*/', '', $schemes);
-    $schemes = array_filter($schemes);
     return $schemes;
 }
 
@@ -196,7 +208,7 @@ function confToHash($file,$lower=false) {
  * @param  array    $params   optional additional params to pass to the callback
  * @return array    configuration values
  */
-function retrieveConfig($type,$fn,$params=null) {
+function retrieveConfig($type,$fn,$params=null,$combine='array_merge') {
     global $config_cascade;
 
     if(!is_array($params)) $params = array();
@@ -208,7 +220,7 @@ function retrieveConfig($type,$fn,$params=null) {
         foreach ($config_cascade[$type][$config_group] as $file) {
             if (file_exists($file)) {
                 $config = call_user_func_array($fn,array_merge(array($file),$params));
-                $combined = array_merge($combined, $config);
+                $combined = $combine($combined, $config);
             }
         }
     }
@@ -347,4 +359,27 @@ function conf_decodeString($str) {
                      return $str;
     }
 }
+
+/**
+ * array combination function to remove negated values (prefixed by !)
+ *
+ * @param  array $current
+ * @param  array $new
+ *
+ * @return array the combined array, numeric keys reset
+ */
+function array_merge_with_removal($current, $new) {
+    foreach ($new as $val) {
+        if (substr($val,0,1) == DOKU_CONF_NEGATION) {
+            $idx = array_search(trim(substr($val,1)),$current);
+            if ($idx !== false) {
+                unset($current[$idx]);
+            }
+        } else {
+            $current[] = trim($val);
+        }
+    }
+
+    return array_slice($current,0);
+}
 //Setup VIM: ex: et ts=4 :