diff --git a/_test/cases/inc/pageutils_clean_id.test.php b/_test/cases/inc/pageutils_clean_id.test.php
index 01fa7dc1c843dd28e06370663290f9ec38b9a771..ece71e89937c795a2d7dd6b284ef46cd76c70fb9 100644
--- a/_test/cases/inc/pageutils_clean_id.test.php
+++ b/_test/cases/inc/pageutils_clean_id.test.php
@@ -36,6 +36,15 @@ class init_clean_id_test extends UnitTestCase {
         $tests[] = array('page:page',false,'page:page');
         $tests[] = array('page;page',false,'page:page');
 
+        $tests[] = array('page._#!','false','page');
+        $tests[] = array('._#!page','false','page');
+        $tests[] = array('page._#!page','false','page._page');
+        $tests[] = array('ns._#!:page','false','ns:page');
+        $tests[] = array('ns:._#!page','false','ns:page');
+        $tests[] = array('ns._#!ns:page','false','ns._ns:page');
+        $tests[] = array('ns_:page',false,'ns:page');
+        $tests[] = array('page...page','false','page...page');
+
         $conf['useslash'] = 0;
         $tests[] = array('page/page',false,'page_page');
 
diff --git a/inc/pageutils.php b/inc/pageutils.php
index 81dcb66e7f5ec4bddf3c4042a0884b64e759de0d..31b5f9ff94ac9de58479d29b610352ee9ab2b106 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -134,6 +134,7 @@ function cleanID($raw_id,$ascii=false,$media=false){
     $id = preg_replace('#:+#',':',$id);
     $id = ($media ? trim($id,':.-') : trim($id,':._-'));
     $id = preg_replace('#:[:\._\-]+#',':',$id);
+    $id = preg_replace('#[:\._\-]+:#',':',$id);
 
     $cache[(string)$raw_id] = $id;
     return($id);