diff --git a/inc/Ui/Search.php b/inc/Ui/Search.php
index 73c3473042a0932a084c10834ed6b55839f6169e..2d7ae6b3bcabfca349c30a541489a16b034ea7dd 100644
--- a/inc/Ui/Search.php
+++ b/inc/Ui/Search.php
@@ -20,12 +20,10 @@ class Search extends Ui
     public function __construct()
     {
         global $QUERY;
-
         $Indexer = idx_get_indexer();
-        $parsedQuery = ft_queryParser($Indexer, $QUERY);
 
         $this->query = $QUERY;
-        $this->parsedQuery = $parsedQuery;
+        $this->parsedQuery = ft_queryParser($Indexer, $QUERY);
     }
 
     /**
@@ -36,6 +34,28 @@ class Search extends Ui
         $this->pageLookupResults = ft_pageLookup($this->query, true, useHeading('navigation'));
         $this->fullTextResults = ft_pageSearch($this->query, $highlight);
         $this->highlight = $highlight;
+
+        // fixme: find better place for this
+        global $INPUT;
+        if ($INPUT->has('after') || $INPUT->has('before')) {
+            $after = $INPUT->str('after');
+            $after = is_int($after) ? $after : strtotime($after);
+
+            $before = $INPUT->str('before');
+            $before = is_int($before) ? $before : strtotime($before);
+
+            // todo: should we filter $this->pageLookupResults as well?
+            foreach ($this->fullTextResults as $id => $cnt) {
+                $mTime = filemtime(wikiFN($id));
+                if ($after && $after > $mTime) {
+                    unset($this->fullTextResults[$id]);
+                    continue;
+                }
+                if ($before && $before < $mTime) {
+                    unset($this->fullTextResults[$id]);
+                }
+            }
+        }
     }
 
     /**
@@ -67,12 +87,18 @@ class Search extends Ui
      */
     protected function getSearchFormHTML($query)
     {
-        global $lang, $ID;
+        global $lang, $ID, $INPUT;
 
         $searchForm = (new Form())->attrs(['method' => 'get'])->addClass('search-results-form');
         $searchForm->setHiddenField('do', 'search');
         $searchForm->setHiddenField('from', $ID);
         $searchForm->setHiddenField('searchPageForm', '1');
+        if ($INPUT->has('after')) {
+            $searchForm->setHiddenField('after', $INPUT->str('after'));
+        }
+        if ($INPUT->has('before')) {
+            $searchForm->setHiddenField('before', $INPUT->str('before'));
+        }
         $searchForm->addFieldsetOpen()->addClass('search-results-form__fieldset');
         $searchForm->addTextInput('id')->val($query)->useInput(false);
         $searchForm->addButton('', $lang['btn_search'])->attr('type', 'submit');
@@ -142,6 +168,7 @@ class Search extends Ui
 
         $this->addFragmentBehaviorLinks($searchForm, $parsedQuery);
         $this->addNamespaceSelector($searchForm, $parsedQuery);
+        $this->addDateSelector($searchForm, $parsedQuery);
 
         $searchForm->addTagClose('div');
     }
@@ -149,55 +176,92 @@ class Search extends Ui
     protected function addFragmentBehaviorLinks(Form $searchForm, array $parsedQuery)
     {
         $searchForm->addTagOpen('div')->addClass('search-results-form__subwrapper');
+        $searchForm->addHTML('fragment behavior: ');
 
         $this->addSearchLink(
             $searchForm,
-            'exact Match',
-            array_map(function($term){return trim($term, '*');},$this->parsedQuery['and']),
-            $this->parsedQuery['ns']
+            'exact match',
+            array_map(function($term){return trim($term, '*');},$this->parsedQuery['and'])
         );
 
-        $searchForm->addHTML(' ');
+        $searchForm->addHTML(', ');
 
         $this->addSearchLink(
             $searchForm,
             'starts with',
-            array_map(function($term){return trim($term, '*') . '*';},$this->parsedQuery['and']),
-            $this->parsedQuery['ns']
+            array_map(function($term){return trim($term, '*') . '*';},$this->parsedQuery['and'])
         );
 
-        $searchForm->addHTML(' ');
+        $searchForm->addHTML(', ');
 
         $this->addSearchLink(
             $searchForm,
             'ends with',
-            array_map(function($term){return '*' . trim($term, '*');},$this->parsedQuery['and']),
-            $this->parsedQuery['ns']
+            array_map(function($term){return '*' . trim($term, '*');},$this->parsedQuery['and'])
         );
 
-        $searchForm->addHTML(' ');
+        $searchForm->addHTML(', ');
 
         $this->addSearchLink(
             $searchForm,
             'contains',
-            array_map(function($term){return '*' . trim($term, '*') . '*';},$this->parsedQuery['and']),
-            $this->parsedQuery['ns']
+            array_map(function($term){return '*' . trim($term, '*') . '*';},$this->parsedQuery['and'])
         );
 
         $searchForm->addTagClose('div');
     }
 
-    protected function addSearchLink(Form $searchForm, $label, $and, $ns) {
+    protected function addSearchLink(
+        Form $searchForm,
+        $label,
+        array $and = null,
+        array $ns = null,
+        array $not = null,
+        array $notns = null,
+        array $phrases = null,
+        $after = null,
+        $before = null
+    ) {
+        global $INPUT;
+        if (null === $and) {
+            $and = $this->parsedQuery['and'];
+        }
+        if (null === $ns) {
+            $ns = $this->parsedQuery['ns'];
+        }
+        if (null === $not) {
+            $not = $this->parsedQuery['not'];
+        }
+        if (null === $phrases) {
+            $phrases = $this->parsedQuery['phrases'];
+        }
+        if (null === $notns) {
+            $notns = $this->parsedQuery['notns'];
+        }
+        if (null === $after) {
+            $after = $INPUT->str('after');
+        }
+        if (null === $before) {
+            $before = $INPUT->str('before');
+        }
+
         $newQuery = ft_queryUnparser_simple(
             $and,
-            [],
-            [],
+            $not,
+            $phrases,
             $ns,
-            []
+            $notns
         );
+        $hrefAttributes = ['do' => 'search', 'searchPageForm' => '1'];
+        if ($after) {
+            $hrefAttributes['after'] = $after;
+        }
+        if ($before) {
+            $hrefAttributes['before'] = $before;
+        }
         $searchForm->addTagOpen('a')
             ->attrs([
-                'href' => wl($newQuery, ['do' => 'search', 'searchPageForm' => '1'], false, '&')
+                'href' => wl($newQuery, $hrefAttributes, false, '&')
             ])
         ;
         $searchForm->addHTML($label);
@@ -215,29 +279,27 @@ class Search extends Ui
         $baseNS = empty($parsedQuery['ns']) ? '' : $parsedQuery['ns'][0];
         $searchForm->addTagOpen('div')->addClass('search-results-form__subwrapper');
 
-        if ($baseNS) {
-            $searchForm->addTagOpen('div');
-
-            $this->addSearchLink(
-                $searchForm,
-                'remove current namespace restriction',
-                $this->parsedQuery['and'],
-                []
-            );
-
-            $searchForm->addTagClose('div');
-        }
-
         $extraNS = $this->getAdditionalNamespacesFromResults($baseNS);
-        if (!empty($extraNS)) {
+        if (!empty($extraNS) || $baseNS) {
             $searchForm->addTagOpen('div');
-            $searchForm->addHTML('first level ns below current: ');
+            $searchForm->addHTML('limit to namespace: ');
+
+            if ($baseNS) {
+                $this->addSearchLink(
+                    $searchForm,
+                    '(remove limit)',
+                    null,
+                    [],
+                    null,
+                    []
+                );
+            }
 
             foreach ($extraNS as $extraNS => $count) {
                 $searchForm->addHTML(' ');
                 $label = $extraNS . ($count ? " ($count)" : '');
 
-                $this->addSearchLink($searchForm, $label, $this->parsedQuery['and'], [$extraNS]);
+                $this->addSearchLink($searchForm, $label, null, [$extraNS], null, []);
             }
             $searchForm->addTagClose('div');
         }
@@ -275,6 +337,90 @@ class Search extends Ui
         return $namespaces;
     }
 
+    /**
+     * @ToDo: we need to remember this date when clicking on other links
+     * @ToDo: custom date input
+     *
+     * @param Form $searchForm
+     * @param      $parsedQuery
+     */
+    protected function addDateSelector(Form $searchForm, $parsedQuery) {
+        $searchForm->addTagOpen('div')->addClass('search-results-form__subwrapper');
+        $searchForm->addHTML('limit by date: ');
+
+        global $INPUT;
+        if ($INPUT->has('before') || $INPUT->has('after')) {
+            $this->addSearchLink(
+                $searchForm,
+                '(remove limit)',
+                null,
+                null,
+                null,
+                null,
+                null,
+                false,
+                false
+            );
+
+            $searchForm->addHTML(', ');
+        }
+
+        if ($INPUT->str('after') === '1 week ago') {
+            $searchForm->addHTML('<span class="active">past 7 days</span>');
+        } else {
+            $this->addSearchLink(
+                $searchForm,
+                'past 7 days',
+                null,
+                null,
+                null,
+                null,
+                null,
+                '1 week ago',
+                false
+            );
+        }
+
+        $searchForm->addHTML(', ');
+
+        if ($INPUT->str('after') === '1 month ago') {
+            $searchForm->addHTML('<span class="active">past month</span>');
+        } else {
+            $this->addSearchLink(
+                $searchForm,
+                'past month',
+                null,
+                null,
+                null,
+                null,
+                null,
+                '1 month ago',
+                false
+            );
+        }
+
+        $searchForm->addHTML(', ');
+
+        if ($INPUT->str('after') === '1 year ago') {
+            $searchForm->addHTML('<span class="active">past year</span>');
+        } else {
+            $this->addSearchLink(
+                $searchForm,
+                'past year',
+                null,
+                null,
+                null,
+                null,
+                null,
+                '1 year ago',
+                false
+            );
+        }
+
+        $searchForm->addTagClose('div');
+    }
+
+
     /**
      * Build the intro text for the search page
      *
@@ -416,20 +562,9 @@ class Search extends Ui
         if (!empty($this->parsedQuery['ns']) && $this->parsedQuery['ns'][0] === $ns) {
             return false;
         }
-
-        $newQuery = ft_queryUnparser_simple(
-            $this->parsedQuery['and'],
-            [],
-            [],
-            [$ns],
-            []
-        );
-        $href = wl($newQuery, ['do' => 'search', 'searchPageForm' => '1']);
-        $attributes = buildAttributes([
-            'rel' => 'nofollow',
-            'class' => 'search_namespace_link',
-        ]);
         $name = '@' . $ns;
-        return "<a href=\"$href\" $attributes>$name</a>";
+        $tmpForm = new Form();
+        $this->addSearchLink($tmpForm, $name, null, [$ns], null, []);
+        return $tmpForm->toHTML();
     }
 }