diff --git a/_test/tests/inc/PageUtilsIsHiddenPage.test.php b/_test/tests/inc/PageUtilsIsHiddenPage.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..a7077862e2fe19f06bb9285e84062860c0240ac1
--- /dev/null
+++ b/_test/tests/inc/PageUtilsIsHiddenPage.test.php
@@ -0,0 +1,95 @@
+<?php
+
+class PageUtilsIsHiddenPageTest extends DokuWikiTest {
+
+    function prepare($hidePages = '^:test$', $act = 'show') {
+        global $conf;
+        global $ACT;
+        $conf['hidepages'] = $hidePages;
+        $ACT = $act;
+    }
+
+    function testHiddenOff(){
+        $this->prepare('');
+
+        $this->assertFalse(isHiddenPage('test'));
+    }
+
+    function testHiddenOffAdmin(){
+        $this->prepare('^:test$', 'admin');
+
+        $this->assertFalse(isHiddenPage('test'));
+    }
+
+    function testHiddenOnMatch(){
+        $this->prepare();
+
+        $this->assertTrue(isHiddenPage('test'));
+    }
+
+    function testHiddenOnNoMatch(){
+        $this->prepare();
+
+        $this->assertFalse(isHiddenPage('another'));
+    }
+
+    function testEventHandlerBefore() {
+        global $EVENT_HANDLER;
+        $this->prepare();
+        $EVENT_HANDLER->register_hook('PAGEUTILS_ID_HIDEPAGE', 'BEFORE', $this, 'alwaysHide');
+
+        $this->assertTrue(isHiddenPage('another'));
+    }
+
+    function alwaysHide(Doku_Event &$event, $params) {
+        $event->data['hidden'] = true;
+    }
+
+    function testEventHandlerBeforeAndPrevent() {
+        global $EVENT_HANDLER;
+        $this->prepare();
+        $EVENT_HANDLER->register_hook('PAGEUTILS_ID_HIDEPAGE', 'BEFORE', $this, 'showBefore');
+
+        $this->assertFalse(isHiddenPage('test'));
+    }
+
+    function showBefore(Doku_Event &$event, $params) {
+        $event->data['hidden'] = false;
+        $event->preventDefault();
+        $event->stopPropagation();
+    }
+
+    function testEventHandlerAfter() {
+        global $EVENT_HANDLER;
+        $this->prepare();
+        $EVENT_HANDLER->register_hook('PAGEUTILS_ID_HIDEPAGE', 'AFTER', $this, 'alwaysHide');
+
+        $this->assertTrue(isHiddenPage('another'));
+    }
+
+    function testEventHandlerAfterHide() {
+        global $EVENT_HANDLER;
+        $this->prepare();
+        $EVENT_HANDLER->register_hook('PAGEUTILS_ID_HIDEPAGE', 'AFTER', $this, 'hideBeforeWithoutPrevent');
+
+        $this->assertTrue(isHiddenPage('another'));
+    }
+
+    function hideBeforeWithoutPrevent(Doku_Event &$event, $params) {
+        $event->data['hidden'] = true;
+    }
+
+    function testEventHandlerAfterShow() {
+        global $EVENT_HANDLER;
+        $this->prepare();
+        $EVENT_HANDLER->register_hook('PAGEUTILS_ID_HIDEPAGE', 'AFTER', $this, 'showAfter');
+
+        $this->assertFalse(isHiddenPage('test'));
+    }
+
+    function showAfter(Doku_Event &$event, $params) {
+        $event->data['hidden'] = false;
+    }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/inc/pageutils.php b/inc/pageutils.php
index 55cc081a11928b9c21f5a498ff343c7c041884c6..3bb10883f4062108763da72a2a5a746e8b742a1f 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -536,15 +536,25 @@ function getCacheName($data,$ext=''){
  * @author Andreas Gohr <gohr@cosmocode.de>
  */
 function isHiddenPage($id){
+    $data = array(
+        'id' => $id,
+        'hidden' => false
+    );
+    trigger_event('PAGEUTILS_ID_HIDEPAGE', $data, '_isHiddenPage');
+    return $data['hidden'];
+}
+
+function _isHiddenPage(&$data) {
     global $conf;
     global $ACT;
-    if(empty($conf['hidepages'])) return false;
-    if($ACT == 'admin') return false;
 
-    if(preg_match('/'.$conf['hidepages'].'/ui',':'.$id)){
-        return true;
+    if ($data['hidden']) return;
+    if(empty($conf['hidepages'])) return;
+    if($ACT == 'admin') return;
+
+    if(preg_match('/'.$conf['hidepages'].'/ui',':'.$data['id'])){
+        $data['hidden'] = true;
     }
-    return false;
 }
 
 /**