diff --git a/inc/actions.php b/inc/actions.php
index 8da6c47cc85d2a73226835249a4dfcf7d4142ce5..62b39efc2246dbc3f3fddeb12df676364d32c3b9 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -340,11 +340,7 @@ function act_redirect($id,$preact){
 
   //get section name when coming from section edit
   if($PRE && preg_match('/^\s*==+([^=\n]+)/',$TEXT,$match)){
-    #FIXME duplicates code from xhtml renderer
-    $title = $match[0];
-    $title = str_replace(':','',cleanID($title));
-    $title = ltrim($title,'0123456789._-');
-    if(empty($title)) $title='section';
+    $title = sectionID($match[0]);
   }
 
   $opts = array(
diff --git a/inc/pageutils.php b/inc/pageutils.php
index e509dfde37cd1542443935d9b89780d5f2e96cbc..7a140ef8c41e2d022c9410f44605f3901a9c7674 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -162,19 +162,19 @@ function noNS($id) {
 }
 
 /**
-* Returns the current namespace
-*
-* @author Nathan Fritz <fritzn@crown.edu>
-*/
+ * Returns the current namespace
+ *
+ * @author Nathan Fritz <fritzn@crown.edu>
+ */
 function curNS($id) {
     return noNS(getNS($id));
 }
 
 /**
-* Returns the ID without the namespace or current namespace for 'start' pages
-*
-* @author Nathan Fritz <fritzn@crown.edu>
-*/
+ * Returns the ID without the namespace or current namespace for 'start' pages
+ *
+ * @author Nathan Fritz <fritzn@crown.edu>
+ */
 function noNSorNS($id) {
     global $conf;
 
@@ -188,6 +188,36 @@ function noNSorNS($id) {
     return $p;
 }
 
+/**
+ * Creates a XHTML valid linkid from a given headline title
+ *
+ * @param string  $title   The headline title
+ * @param array   $check   List of existing IDs
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function sectionID($title,&$check=null) {
+    $title = str_replace(':','',cleanID($title));
+    $new = ltrim($title,'0123456789._-');
+    if(empty($new)){
+        $title = 'section'.preg_replace('/[^0-9]+/','',$title); //keep numbers from headline
+    }else{
+        $title = $new;
+    }
+
+    if(!is_null($check) && is_array($check)){
+        // make sure tiles are unique
+        $num = '';
+        while(in_array($title.$num,$check)){
+            ($num) ? $num++ : $num = 1;
+        }
+        $title = $title.$num;
+        $check[] = $title;
+    }
+
+    return $title;
+}
+
+
 /**
  *  Wiki page existence check
  *
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 4fb6cb548e381421c8b1a532d50d5b7623411040..fda1ef36e113dd47bbc430f2bbef54d4448a68d9 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -1004,21 +1004,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
      * @author Andreas Gohr <andi@splitbrain.org>
      */
     function _headerToLink($title,$create=false) {
-        $title = str_replace(':','',cleanID($title));
-        $title = ltrim($title,'0123456789._-');
-        if(empty($title)) $title='section';
-
         if($create){
-            // make sure tiles are unique
-            $num = '';
-            while(in_array($title.$num,$this->headers)){
-                ($num) ? $num++ : $num = 1;
-            }
-            $title = $title.$num;
-            $this->headers[] = $title;
+            return sectionID($title,$this->headers);
+        }else{
+            return sectionID($title);
         }
-
-        return $title;
     }
 
     /**