diff --git a/README.md b/README.md
index c93aa716ba7187c645e15bb6c4622235df8b91e4..f02bba0fd0bd64e504ec89b0ccfdc622e0c17276 100644
--- a/README.md
+++ b/README.md
@@ -118,13 +118,10 @@ test suite is provided. You can follow the instructions below to run the tests:
 
     ```sh
     pytest ckanext/odsh/tests/
-    pytest ckanext/odsh/tests_tpsh/
     ```
 
 Running these commands will initiate the test suite, which will automatically execute
-various test cases and verify the expected behavior of the extension. The tests are
-organized into two directories: `tests` and `tests_tpsh`, each containing different
-sets of tests.
+various test cases and verify the expected behavior of the extension.
 
 ### Internationalization
 
diff --git a/ckanext/odsh/tests_tpsh/__init__.py b/ckanext/odsh/tests/resources/__init__.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/__init__.py
rename to ckanext/odsh/tests/resources/__init__.py
diff --git a/ckanext/odsh/tests_tpsh/resources/collection1.rdf b/ckanext/odsh/tests/resources/collection1.rdf
similarity index 100%
rename from ckanext/odsh/tests_tpsh/resources/collection1.rdf
rename to ckanext/odsh/tests/resources/collection1.rdf
diff --git a/ckanext/odsh/tests_tpsh/resources/org_dicts.py b/ckanext/odsh/tests/resources/org_dicts.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/resources/org_dicts.py
rename to ckanext/odsh/tests/resources/org_dicts.py
diff --git a/ckanext/odsh/tests_tpsh/resources/test.pdf b/ckanext/odsh/tests/resources/test.pdf
similarity index 100%
rename from ckanext/odsh/tests_tpsh/resources/test.pdf
rename to ckanext/odsh/tests/resources/test.pdf
diff --git a/ckanext/odsh/tests_tpsh/test_checksum.py b/ckanext/odsh/tests/test_checksum.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_checksum.py
rename to ckanext/odsh/tests/test_checksum.py
diff --git a/ckanext/odsh/tests_tpsh/test_date_range.py b/ckanext/odsh/tests/test_date_range.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_date_range.py
rename to ckanext/odsh/tests/test_date_range.py
diff --git a/ckanext/odsh/tests_tpsh/test_date_range_formatter.py b/ckanext/odsh/tests/test_date_range_formatter.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_date_range_formatter.py
rename to ckanext/odsh/tests/test_date_range_formatter.py
diff --git a/ckanext/odsh/tests_tpsh/test_helper_pkg_dict.py b/ckanext/odsh/tests/test_helper_pkg_dict.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_helper_pkg_dict.py
rename to ckanext/odsh/tests/test_helper_pkg_dict.py
diff --git a/ckanext/odsh/tests_tpsh/test_helpers_tpsh.py b/ckanext/odsh/tests/test_helpers_tpsh.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_helpers_tpsh.py
rename to ckanext/odsh/tests/test_helpers_tpsh.py
diff --git a/ckanext/odsh/tests_tpsh/test_odsh_helpers.py b/ckanext/odsh/tests/test_odsh_helpers.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_odsh_helpers.py
rename to ckanext/odsh/tests/test_odsh_helpers.py
diff --git a/ckanext/odsh/tests_tpsh/test_password_validation.py b/ckanext/odsh/tests/test_password_validation.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_password_validation.py
rename to ckanext/odsh/tests/test_password_validation.py
diff --git a/ckanext/odsh/tests/test_plugin.py b/ckanext/odsh/tests/test_plugin.py
index af2f6e90324119090a8d6ca0c324b900e4cb1690..140bd8ae92afc4a21e9235038898f13a3da489b8 100644
--- a/ckanext/odsh/tests/test_plugin.py
+++ b/ckanext/odsh/tests/test_plugin.py
@@ -1,30 +1,53 @@
-import paste.fixture
-import pylons.test
-import ckan.plugins
-import ckan.model as model
-import ckan.tests.factories as factories
-import ckan.tests.legacy as tests
-from ckan.common import config
+import datetime
 
+import ckanext.odsh.plugin as plugin
+import unittest
 
-# class TestOdshPlugin(object):
+class TestMethodBeforeView(unittest.TestCase):
+    date_time_format = '%Y-%m-%dT%H:%M:%S'
 
-#     @classmethod
-#     def setup_class(cls):
-#         cls.app = paste.fixture.TestApp(pylons.test.pylonsapp)
-#         ckan.plugins.load('odsh')
+    def test_before_view_adds_false_for_old_dataset(self):
+        plugin_object = plugin.OdshPlugin()
+        today = datetime.date.today()
+        hundred_days_ago = today - datetime.timedelta(days=100)
+        hundred_days_ago_as_ckan_str = self._date_as_ckan_str(hundred_days_ago)
+        dict_for_template = plugin_object.before_view(
+            {
+                'extras': [
+                    {'key': 'issued', 'value': hundred_days_ago_as_ckan_str}
+                ]
+            }
+        )
+        assert dict_for_template['is_new']==False
 
-#     def teardown(self):
-#         model.repo.rebuild_db()
+    def _date_as_ckan_str(self, date):
+        return date.strftime(self.date_time_format)
 
-#     @classmethod
-#     def teardown_class(cls):
-#         ckan.plugins.unload('odsh')
-
-#     def test_plugin(self):
-#         pass
-
-#     def test_user_cannot_access_dashboard(self):
-#         user = factories.User()
-#         tests.call_action_api(self.app, 'group_create', name='test-group',
-#                               apikey=user['apikey'])
+    def test_before_view_adds_true_for_new_dataset(self):
+        plugin_object = plugin.OdshPlugin()
+        today = datetime.date.today()
+        ten_days_ago = today - datetime.timedelta(days=10)
+        ten_days_ago_as_ckan_str = self._date_as_ckan_str(ten_days_ago)
+        dict_for_template = plugin_object.before_view(
+            {
+                'extras': [
+                    {'key': 'issued', 'value': ten_days_ago_as_ckan_str}
+                ]
+            }
+        )
+        assert dict_for_template['is_new']==True
+    
+    def test_before_view_does_not_modify_unconcerned_dict_values(self):
+        plugin_object = plugin.OdshPlugin()
+        today = datetime.date.today()
+        ten_days_ago = today - datetime.timedelta(days=10)
+        ten_days_ago_as_ckan_str = self._date_as_ckan_str(ten_days_ago)
+        dict_for_template = plugin_object.before_view(
+            {
+                'extras': [
+                    {'key': 'issued', 'value': ten_days_ago_as_ckan_str}
+                ],
+                'some_other_key': 'some_other_value', 
+            }
+        )
+        assert dict_for_template['some_other_key']=='some_other_value'
diff --git a/ckanext/odsh/tests_tpsh/test_profiles.py b/ckanext/odsh/tests/test_profiles.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_profiles.py
rename to ckanext/odsh/tests/test_profiles.py
diff --git a/ckanext/odsh/tests/test_search.py b/ckanext/odsh/tests/test_search.py
index 854a7917a5f7a0c3a8e27ccafe1cae33f153f185..0988d909ce2f5e86cc9af2822abd03169653a5ec 100644
--- a/ckanext/odsh/tests/test_search.py
+++ b/ckanext/odsh/tests/test_search.py
@@ -1,253 +1,133 @@
-# encoding: utf-8
-
-import ckan.tests.factories as factories
-import ckan.tests.helpers as helpers
-from bs4 import BeautifulSoup
-from ckan import model
-from ckan.lib.mailer import create_reset_key
-from routes import url_for
-import ckan.plugins
-from .test_helpers import odsh_test
-import pdb
-
-
-
-class TestSearch(helpers.FunctionalTestBase):
-
-    _load_plugins = ['odsh', 'spatial_metadata', 'spatial_query']
-
-    def teardown(self):
-        model.repo.rebuild_db()
-
-    @odsh_test()
-    def test_dataset_is_in_search_result(self):
-        # arrange
-        dataset = self._create_dataset()
-
-        # act
-        response = self._perform_search()
-
-        # assert
-        assert dataset['name'] in response
-
-    @odsh_test()
-    def test_query_with_no_match_finds_no_dataset(self):
-        # arrange
-        dataset = self._create_dataset()
-
-        # act
-        response = self._perform_search("foobar")
-
-        # assert
-        self._assert_no_results(response)
-
-    @odsh_test()
-    def test_query_with_no_dates_finds_dataset(self):
-        # arrange
-        dataset = self._create_dataset()
-
+import ckanext.odsh.search as search
+import unittest
+
+class Test_before_search(unittest.TestCase):
+    def setUp(self):
+        self.search_params_before_test = {
+            'extras': {}, 
+            'facet.field': ['organization', 'groups'], 
+            'fq': 'organization:"test-organisation" groups:"gove" +dataset_type:dataset', 
+            'include_private': True, 
+            'q': '', 
+            'rows': 20, 
+            'sort': 'score desc, metadata_modified desc', 
+            'start': 0
+        }
+        self.search_params_with_facet_mincount = self.search_params_before_test.copy()
+        self.search_params_with_facet_mincount.update({'facet.mincount': 0})
+    
+    def test_it_solely_adds_facet_mincount_to_dict_if_no_extras(self):
+        # arange
+        search_params = self.search_params_before_test.copy()
         # act
-        response = self._perform_date_search(None, None)
-
+        search.before_search(search_params)
         # assert
-        assert dataset['name'] in response
-
-    @odsh_test()
-    def test_query_with_very_old_dataset(self):
-        # arrange
-        dataseta = self._create_dataset('do_not_find_me', '2011-01-01', '2013-12-31')
-        datasetb = self._create_dataset('old_dataset', '1111-01-01', '1860-12-31')
-
-        # act
-        response = self._perform_date_search('1110-12-30', '1960-02-01')
-
-        # assert
-        assert 'wrong_start_date_for_search' not in response
-        self._assert_datasets_in_response([datasetb], response)
-        self._assert_datasets_not_in_response([dataseta], response)
-
-    @odsh_test()
-    def test_query_with_end_before_start_finds_no_dataset(self):
-        # arrange
-        datasetA = self._create_dataset('dataseta', '1960-01-01', '1960-12-31')
-
-        # act
-        response = self._perform_date_search('1960-12-30', '1960-02-01')
-
-        # assert
-        self._assert_no_results(response)
-
-    @odsh_test()
-    def test_query_with_wrong_dates_shows_error(self):
-        # arrange
-        dataset = self._create_dataset()
-
+        search_params_expected = self.search_params_with_facet_mincount.copy()
+        assert search_params == search_params_expected
+
+    def test_it_adds_fq_if_empty_range(self):
+        # arange
+        search_params = self.search_params_before_test.copy()
+        extras = {'ext_enddate': '2019-08-01', 'ext_startdate': '2019-08-02'}
+        search_params.update({'extras': extras})
+        search_params_expected = self.search_params_with_facet_mincount.copy()
+        search_params_expected.update({'extras': extras})
+        search_params_expected.update({
+            'fq': (
+                'organization:"test-organisation" groups:"gove" '
+                '+dataset_type:dataset (+extras_temporal_start:[2019-08-02T00:00:00Z TO 2019-08-01T00:00:00Z] '
+                'OR +extras_temporal_end:[2019-08-02T00:00:00Z TO 2019-08-01T00:00:00Z]  OR '
+                '((*:* NOT extras_temporal_end:[* TO *]) AND extras_temporal_start:[* TO 2019-08-01T00:00:00Z]))'
+            )
+        })
         # act
-        response1 = self._perform_date_search('foo', None)
-        response2 = self._perform_date_search(None, 'foo')
-        response3 = self._perform_date_search('11-11-11', None)
-
+        search.before_search(search_params)
         # assert
-        assert 'wrong_start_date_for_search' in response1
-        self._assert_datasets_in_response([dataset], response1)
-        assert 'daterange: to' not in response1
-        assert 'daterange: from' not in response1
-        assert 'wrong_end_date_for_search' in response2
-        self._assert_datasets_in_response([dataset], response2)
-        assert 'daterange: to' not in response2
-        assert 'daterange: from' not in response2
-        assert 'wrong_start_date_for_search' in response3
-        assert 'daterange: to' not in response3
-        assert 'daterange: from' not in response3
-        self._assert_datasets_in_response([dataset], response3)
-
-    @odsh_test()
-    def test_query_with_start_date_finds_one_dataset(self):
-        # arrange
-        datasetA = self._create_dataset('dataseta', '1960-01-01', '1960-12-31')
-        datasetB = self._create_dataset('datasetb', '1980-01-01', '1990-06-30')
-        datasetC = self._create_dataset('datasetc', '2001-03-01', '2001-04-30')
-
+        assert search_params == search_params_expected
+    
+    def test_it_solely_adds_facet_mincount_to_dict_if_wrong_date_format_in_extras(self):
+        # arange
+        search_params = self.search_params_before_test.copy()
+        extras = {'ext_enddate': 'some_date', 'ext_startdate': 'some_date'}
+        search_params.update({'extras': extras})
+        search_params_expected = self.search_params_with_facet_mincount.copy()
+        search_params_expected.update({'extras': extras})
         # act
-        response1 = self._perform_date_search(None, '1990-01-01')
-        response2 = self._perform_date_search(None, '2010-12-31')
-        response3 = self._perform_date_search('2010-12-31', None)
-        response4 = self._perform_date_search('1985-04-01', '1985-04-20')
-        response5 = self._perform_date_search('2001-04-01', None)
-
+        search.before_search(search_params)
         # assert
-        self._assert_datasets_in_response([datasetA, datasetB], response1)
-        self._assert_datasets_not_in_response([datasetC], response1)
-        assert 'daterange: to' in response1
-
-        self._assert_datasets_in_response(
-            [datasetA, datasetB, datasetC], response2)
-        assert 'daterange: to' in response2
-
-        self._assert_no_results(response3)
-        assert 'daterange: from' in response3
-
-        self._assert_datasets_in_response([datasetB], response4)
-        self._assert_datasets_not_in_response([datasetA, datasetC], response4)
-        assert 'daterange: to' in response4
-        assert 'daterange: from' in response4
-
-        self._assert_datasets_in_response([datasetC], response5)
-        self._assert_datasets_not_in_response([datasetA, datasetB], response5)
-
-    @odsh_test()
-    def test_dataset_combime_date_range_search_and_text_search_same_title(self):
-        # arrange
-        datasetA = self._create_dataset('dataseta', '1960-01-01', '1960-12-31','mytitle')
-        datasetB = self._create_dataset('datasetb', '1980-01-01', '1990-06-30', 'mytitle')
-
+        assert search_params == search_params_expected
+    
+    def test_it_adds_fq_if_enclosing_range(self):
+        # arange
+        search_params = self.search_params_before_test.copy()
+        extras = {'ext_enddate': '2019-08-02', 'ext_startdate': '2019-08-01'}
+        search_params.update({'extras': extras})
+        search_params_expected = self.search_params_with_facet_mincount.copy()
+        search_params_expected.update({'extras': extras})
+        search_params_expected.update({
+            'fq': (
+                'organization:"test-organisation" groups:"gove" '
+                '+dataset_type:dataset '
+                '(+extras_temporal_start:[2019-08-01T00:00:00Z TO 2019-08-02T00:00:00Z] '
+                'OR +extras_temporal_end:[2019-08-01T00:00:00Z TO 2019-08-02T00:00:00Z]  '
+                'OR (extras_temporal_start:[* TO 2019-08-01T00:00:00Z] AND '
+                'extras_temporal_end:[2019-08-02T00:00:00Z TO *]) OR '
+                '((*:* NOT extras_temporal_end:[* TO *]) AND '
+                'extras_temporal_start:[* TO 2019-08-02T00:00:00Z]))'
+            )
+        })
         # act
-        response = self._perform_text_and_date_search('mytitle', None, '1970-01-01')
-
+        search.before_search(search_params)
         # assert
-        self._assert_datasets_in_response([datasetA], response)
-        self._assert_datasets_not_in_response([datasetB], response)
-
-    @odsh_test()
-    def test_dataset_combime_date_range_search_and_text_search_same_dates(self):
-        # arrange
-        datasetA = self._create_dataset('dataseta', '1960-01-01', '1960-12-31','mytitle')
-        datasetB = self._create_dataset('datasetb', '1960-01-01', '1960-12-31','othertitle')
-        datasetC = self._create_dataset('datasetc', '1980-01-01', '1990-06-30', 'mytitle')
-
+        assert search_params == search_params_expected
+
+    def test_it_adds_fq_if_start_only(self):
+        # arange
+        search_params = self.search_params_before_test.copy()
+        extras = {'ext_startdate': '2019-08-01'}
+        search_params.update({'extras': extras})
+        search_params_expected = self.search_params_with_facet_mincount.copy()
+        search_params_expected.update({'extras': extras})
+        search_params_expected.update({
+            'fq': (
+                'organization:"test-organisation" groups:"gove" '
+                '+dataset_type:dataset '
+                '(+extras_temporal_start:[2019-08-01T00:00:00Z TO *] '
+                'OR +extras_temporal_end:[2019-08-01T00:00:00Z TO *]  '
+                'OR (*:* NOT extras_temporal_end:[* TO *]))'
+            )
+        })
         # act
-        response = self._perform_text_and_date_search('mytitle', None, '1970-01-01')
-
+        search.before_search(search_params)
         # assert
-        self._assert_datasets_in_response([datasetA], response)
-        self._assert_datasets_not_in_response([datasetB, datasetC], response)
-
-    @odsh_test()
-    def test_dataset_without_end(self):
-        # arrange
-        datasetA = self._create_dataset('dataseta', '1960-01-01', None,'mytitle')
-
+        assert search_params == search_params_expected
+    
+    def test_it_adds_fq_if_end_only(self):
+        # arange
+        search_params = self.search_params_before_test.copy()
+        extras = {'ext_enddate': '2019-08-02'}
+        search_params.update({'extras': extras})
+        search_params_expected = self.search_params_with_facet_mincount.copy()
+        search_params_expected.update({'extras': extras})
+        search_params_expected.update({
+            'fq': (
+                'organization:"test-organisation" groups:"gove" '
+                '+dataset_type:dataset '
+                '(+extras_temporal_start:[* TO 2019-08-02T00:00:00Z] OR '
+                '+extras_temporal_end:[* TO 2019-08-02T00:00:00Z]  '
+                'OR ((*:* NOT extras_temporal_end:[* TO *]) '
+                'AND extras_temporal_start:[* TO 2019-08-02T00:00:00Z]))'
+            )
+        })
         # act
-        response1 = self._perform_text_and_date_search('mytitle', '1950-01-01', '1950-02-01')
-        response2 = self._perform_text_and_date_search('mytitle', '1950-01-01', '1960-02-01')
-        response3 = self._perform_text_and_date_search('mytitle', '1950-01-01', None)
-        response4 = self._perform_text_and_date_search('mytitle', None, '1970-01-01')
-        response5 = self._perform_text_and_date_search('mytitle', '1970-01-01', '1980-02-01')
-        response6 = self._perform_text_and_date_search('mytitle', None, '1950-01-01')
-
+        search.before_search(search_params)
         # assert
-        self._assert_datasets_not_in_response([datasetA], response1)
-        self._assert_datasets_in_response([datasetA], response2)
-        self._assert_datasets_in_response([datasetA], response3)
-        self._assert_datasets_in_response([datasetA], response4)
-        self._assert_datasets_in_response([datasetA], response5)
-        self._assert_datasets_not_in_response([datasetA], response6)
-
-    @odsh_test()
-    def test_dataset_new_has_label(self):
-        # arrange
-        datasetA = self._create_dataset('dataseta', '1960-01-01', None,'mytitle')
-
+        assert search_params == search_params_expected
+    
+    def test_it_returns_search_params(self):
+        # arange
+        search_params = self.search_params_before_test.copy()
         # act
-        response = self._perform_text_and_date_search('mytitle', None, None)
-
+        return_value = search.before_search(search_params)
         # assert
-        response.mustcontain('new-dataset-label')
-
-    def _assert_datasets_in_response(self, datasets, response):
-        for dataset in datasets:
-            assert dataset['name'] in response
-
-    def _assert_datasets_not_in_response(self, datasets, response):
-        for dataset in datasets:
-            assert dataset['name'] not in response
-
-    def _assert_no_results(self, response):
-        assert "No datasets found" in response
-
-    def _create_dataset(self, name='my-own-dataset', temporal_start='2000-01-27', temporal_end='2000-01-27',title='title'):
-        user = factories.User()
-        extras = [
-            {'key': 'temporal_start', 'value': temporal_start},
-            {'key': 'temporal_end', 'value': temporal_end},
-            {'key': 'issued', 'value': '2000-01-27'},
-            {'key': 'groups', 'value': 'soci'},
-            {'key': 'licenseAttributionByText', 'value': 'text'},
-            {'key': 'spatial_uri', 'value': 'http://dcat-ap.de/def/politicalGeocoding/districtKey/01001'}
-        ]
-        return factories.Dataset(user=user,
-                                 name=name,
-                                 title=title,
-                                 issued='27-01-2000',
-                                 extras=extras,
-                                 license_id='http://dcat-ap.de/def/licenses/dl-by-de/2.0')
-
-    def _perform_search(self, query=None):
-        search_form = self._perform_search_for_form('dataset-search-box-form')
-        if query is not None:
-            search_form['q'] = query
-        return helpers.webtest_submit(search_form)
-
-    def _perform_date_search(self, search_from, search_to):
-        search_form = self._perform_search_for_form('dataset-search-box-form')
-        if search_form is not None:
-            search_form['ext_startdate'] = search_from
-        if search_to is not None:
-            search_form['ext_enddate'] = search_to
-        return helpers.webtest_submit(search_form)
-
-    def _perform_text_and_date_search(self, query, search_from, search_to):
-        search_form = self._perform_search_for_form('dataset-search-box-form')
-        search_form['q'] = query
-        if search_form is not None:
-            search_form['ext_startdate'] = search_from
-        if search_to is not None:
-            search_form['ext_enddate'] = search_to
-        return helpers.webtest_submit(search_form)
-
-    def _perform_search_for_form(self, form):
-        search_url = url_for(named_route='dataset.search')
-        search_response = self._get_test_app().get(search_url)
-
-        search_form = search_response.forms[form]
-        return search_form
+        assert search_params == return_value
diff --git a/ckanext/odsh/tests_tpsh/test_uri_store.py b/ckanext/odsh/tests/test_uri_store.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/test_uri_store.py
rename to ckanext/odsh/tests/test_uri_store.py
diff --git a/ckanext/odsh/tests_tpsh/test_plugin.py b/ckanext/odsh/tests_tpsh/test_plugin.py
deleted file mode 100644
index 140bd8ae92afc4a21e9235038898f13a3da489b8..0000000000000000000000000000000000000000
--- a/ckanext/odsh/tests_tpsh/test_plugin.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import datetime
-
-import ckanext.odsh.plugin as plugin
-import unittest
-
-class TestMethodBeforeView(unittest.TestCase):
-    date_time_format = '%Y-%m-%dT%H:%M:%S'
-
-    def test_before_view_adds_false_for_old_dataset(self):
-        plugin_object = plugin.OdshPlugin()
-        today = datetime.date.today()
-        hundred_days_ago = today - datetime.timedelta(days=100)
-        hundred_days_ago_as_ckan_str = self._date_as_ckan_str(hundred_days_ago)
-        dict_for_template = plugin_object.before_view(
-            {
-                'extras': [
-                    {'key': 'issued', 'value': hundred_days_ago_as_ckan_str}
-                ]
-            }
-        )
-        assert dict_for_template['is_new']==False
-
-    def _date_as_ckan_str(self, date):
-        return date.strftime(self.date_time_format)
-
-    def test_before_view_adds_true_for_new_dataset(self):
-        plugin_object = plugin.OdshPlugin()
-        today = datetime.date.today()
-        ten_days_ago = today - datetime.timedelta(days=10)
-        ten_days_ago_as_ckan_str = self._date_as_ckan_str(ten_days_ago)
-        dict_for_template = plugin_object.before_view(
-            {
-                'extras': [
-                    {'key': 'issued', 'value': ten_days_ago_as_ckan_str}
-                ]
-            }
-        )
-        assert dict_for_template['is_new']==True
-    
-    def test_before_view_does_not_modify_unconcerned_dict_values(self):
-        plugin_object = plugin.OdshPlugin()
-        today = datetime.date.today()
-        ten_days_ago = today - datetime.timedelta(days=10)
-        ten_days_ago_as_ckan_str = self._date_as_ckan_str(ten_days_ago)
-        dict_for_template = plugin_object.before_view(
-            {
-                'extras': [
-                    {'key': 'issued', 'value': ten_days_ago_as_ckan_str}
-                ],
-                'some_other_key': 'some_other_value', 
-            }
-        )
-        assert dict_for_template['some_other_key']=='some_other_value'
diff --git a/ckanext/odsh/tests_tpsh/test_search.py b/ckanext/odsh/tests_tpsh/test_search.py
deleted file mode 100644
index 0988d909ce2f5e86cc9af2822abd03169653a5ec..0000000000000000000000000000000000000000
--- a/ckanext/odsh/tests_tpsh/test_search.py
+++ /dev/null
@@ -1,133 +0,0 @@
-import ckanext.odsh.search as search
-import unittest
-
-class Test_before_search(unittest.TestCase):
-    def setUp(self):
-        self.search_params_before_test = {
-            'extras': {}, 
-            'facet.field': ['organization', 'groups'], 
-            'fq': 'organization:"test-organisation" groups:"gove" +dataset_type:dataset', 
-            'include_private': True, 
-            'q': '', 
-            'rows': 20, 
-            'sort': 'score desc, metadata_modified desc', 
-            'start': 0
-        }
-        self.search_params_with_facet_mincount = self.search_params_before_test.copy()
-        self.search_params_with_facet_mincount.update({'facet.mincount': 0})
-    
-    def test_it_solely_adds_facet_mincount_to_dict_if_no_extras(self):
-        # arange
-        search_params = self.search_params_before_test.copy()
-        # act
-        search.before_search(search_params)
-        # assert
-        search_params_expected = self.search_params_with_facet_mincount.copy()
-        assert search_params == search_params_expected
-
-    def test_it_adds_fq_if_empty_range(self):
-        # arange
-        search_params = self.search_params_before_test.copy()
-        extras = {'ext_enddate': '2019-08-01', 'ext_startdate': '2019-08-02'}
-        search_params.update({'extras': extras})
-        search_params_expected = self.search_params_with_facet_mincount.copy()
-        search_params_expected.update({'extras': extras})
-        search_params_expected.update({
-            'fq': (
-                'organization:"test-organisation" groups:"gove" '
-                '+dataset_type:dataset (+extras_temporal_start:[2019-08-02T00:00:00Z TO 2019-08-01T00:00:00Z] '
-                'OR +extras_temporal_end:[2019-08-02T00:00:00Z TO 2019-08-01T00:00:00Z]  OR '
-                '((*:* NOT extras_temporal_end:[* TO *]) AND extras_temporal_start:[* TO 2019-08-01T00:00:00Z]))'
-            )
-        })
-        # act
-        search.before_search(search_params)
-        # assert
-        assert search_params == search_params_expected
-    
-    def test_it_solely_adds_facet_mincount_to_dict_if_wrong_date_format_in_extras(self):
-        # arange
-        search_params = self.search_params_before_test.copy()
-        extras = {'ext_enddate': 'some_date', 'ext_startdate': 'some_date'}
-        search_params.update({'extras': extras})
-        search_params_expected = self.search_params_with_facet_mincount.copy()
-        search_params_expected.update({'extras': extras})
-        # act
-        search.before_search(search_params)
-        # assert
-        assert search_params == search_params_expected
-    
-    def test_it_adds_fq_if_enclosing_range(self):
-        # arange
-        search_params = self.search_params_before_test.copy()
-        extras = {'ext_enddate': '2019-08-02', 'ext_startdate': '2019-08-01'}
-        search_params.update({'extras': extras})
-        search_params_expected = self.search_params_with_facet_mincount.copy()
-        search_params_expected.update({'extras': extras})
-        search_params_expected.update({
-            'fq': (
-                'organization:"test-organisation" groups:"gove" '
-                '+dataset_type:dataset '
-                '(+extras_temporal_start:[2019-08-01T00:00:00Z TO 2019-08-02T00:00:00Z] '
-                'OR +extras_temporal_end:[2019-08-01T00:00:00Z TO 2019-08-02T00:00:00Z]  '
-                'OR (extras_temporal_start:[* TO 2019-08-01T00:00:00Z] AND '
-                'extras_temporal_end:[2019-08-02T00:00:00Z TO *]) OR '
-                '((*:* NOT extras_temporal_end:[* TO *]) AND '
-                'extras_temporal_start:[* TO 2019-08-02T00:00:00Z]))'
-            )
-        })
-        # act
-        search.before_search(search_params)
-        # assert
-        assert search_params == search_params_expected
-
-    def test_it_adds_fq_if_start_only(self):
-        # arange
-        search_params = self.search_params_before_test.copy()
-        extras = {'ext_startdate': '2019-08-01'}
-        search_params.update({'extras': extras})
-        search_params_expected = self.search_params_with_facet_mincount.copy()
-        search_params_expected.update({'extras': extras})
-        search_params_expected.update({
-            'fq': (
-                'organization:"test-organisation" groups:"gove" '
-                '+dataset_type:dataset '
-                '(+extras_temporal_start:[2019-08-01T00:00:00Z TO *] '
-                'OR +extras_temporal_end:[2019-08-01T00:00:00Z TO *]  '
-                'OR (*:* NOT extras_temporal_end:[* TO *]))'
-            )
-        })
-        # act
-        search.before_search(search_params)
-        # assert
-        assert search_params == search_params_expected
-    
-    def test_it_adds_fq_if_end_only(self):
-        # arange
-        search_params = self.search_params_before_test.copy()
-        extras = {'ext_enddate': '2019-08-02'}
-        search_params.update({'extras': extras})
-        search_params_expected = self.search_params_with_facet_mincount.copy()
-        search_params_expected.update({'extras': extras})
-        search_params_expected.update({
-            'fq': (
-                'organization:"test-organisation" groups:"gove" '
-                '+dataset_type:dataset '
-                '(+extras_temporal_start:[* TO 2019-08-02T00:00:00Z] OR '
-                '+extras_temporal_end:[* TO 2019-08-02T00:00:00Z]  '
-                'OR ((*:* NOT extras_temporal_end:[* TO *]) '
-                'AND extras_temporal_start:[* TO 2019-08-02T00:00:00Z]))'
-            )
-        })
-        # act
-        search.before_search(search_params)
-        # assert
-        assert search_params == search_params_expected
-    
-    def test_it_returns_search_params(self):
-        # arange
-        search_params = self.search_params_before_test.copy()
-        # act
-        return_value = search.before_search(search_params)
-        # assert
-        assert search_params == return_value
diff --git a/ckanext/odsh/tests_tpsh/resources/__init__.py b/ckanext/odsh/tests_wip/__init__.py
similarity index 100%
rename from ckanext/odsh/tests_tpsh/resources/__init__.py
rename to ckanext/odsh/tests_wip/__init__.py
diff --git a/ckanext/odsh/tests/ckan_selenium.py b/ckanext/odsh/tests_wip/ckan_selenium.py
similarity index 100%
rename from ckanext/odsh/tests/ckan_selenium.py
rename to ckanext/odsh/tests_wip/ckan_selenium.py
diff --git a/ckanext/odsh/tests/harvest_sever_mock.py b/ckanext/odsh/tests_wip/harvest_sever_mock.py
similarity index 100%
rename from ckanext/odsh/tests/harvest_sever_mock.py
rename to ckanext/odsh/tests_wip/harvest_sever_mock.py
diff --git a/ckanext/odsh/tests/icap_sever_mock.py b/ckanext/odsh/tests_wip/icap_sever_mock.py
similarity index 100%
rename from ckanext/odsh/tests/icap_sever_mock.py
rename to ckanext/odsh/tests_wip/icap_sever_mock.py
diff --git a/ckanext/odsh/tests/rdf_catalog.xml b/ckanext/odsh/tests_wip/rdf_catalog.xml
similarity index 100%
rename from ckanext/odsh/tests/rdf_catalog.xml
rename to ckanext/odsh/tests_wip/rdf_catalog.xml
diff --git a/ckanext/odsh/tests/rdf_catalog_empty.xml b/ckanext/odsh/tests_wip/rdf_catalog_empty.xml
similarity index 100%
rename from ckanext/odsh/tests/rdf_catalog_empty.xml
rename to ckanext/odsh/tests_wip/rdf_catalog_empty.xml
diff --git a/ckanext/odsh/tests/result_data.json b/ckanext/odsh/tests_wip/result_data.json
similarity index 100%
rename from ckanext/odsh/tests/result_data.json
rename to ckanext/odsh/tests_wip/result_data.json
diff --git a/ckanext/odsh/tests/spatial_mapping.csv b/ckanext/odsh/tests_wip/spatial_mapping.csv
similarity index 100%
rename from ckanext/odsh/tests/spatial_mapping.csv
rename to ckanext/odsh/tests_wip/spatial_mapping.csv
diff --git a/ckanext/odsh/tests/test_data.json b/ckanext/odsh/tests_wip/test_data.json
similarity index 100%
rename from ckanext/odsh/tests/test_data.json
rename to ckanext/odsh/tests_wip/test_data.json
diff --git a/ckanext/odsh/tests/test_datarequest.py b/ckanext/odsh/tests_wip/test_datarequest.py
similarity index 100%
rename from ckanext/odsh/tests/test_datarequest.py
rename to ckanext/odsh/tests_wip/test_datarequest.py
diff --git a/ckanext/odsh/tests/test_env.py b/ckanext/odsh/tests_wip/test_env.py
similarity index 100%
rename from ckanext/odsh/tests/test_env.py
rename to ckanext/odsh/tests_wip/test_env.py
diff --git a/ckanext/odsh/tests/test_harvest.py b/ckanext/odsh/tests_wip/test_harvest.py
similarity index 100%
rename from ckanext/odsh/tests/test_harvest.py
rename to ckanext/odsh/tests_wip/test_harvest.py
diff --git a/ckanext/odsh/tests/test_helpers.py b/ckanext/odsh/tests_wip/test_helpers.py
similarity index 100%
rename from ckanext/odsh/tests/test_helpers.py
rename to ckanext/odsh/tests_wip/test_helpers.py
diff --git a/ckanext/odsh/tests_wip/test_plugin.py b/ckanext/odsh/tests_wip/test_plugin.py
new file mode 100644
index 0000000000000000000000000000000000000000..af2f6e90324119090a8d6ca0c324b900e4cb1690
--- /dev/null
+++ b/ckanext/odsh/tests_wip/test_plugin.py
@@ -0,0 +1,30 @@
+import paste.fixture
+import pylons.test
+import ckan.plugins
+import ckan.model as model
+import ckan.tests.factories as factories
+import ckan.tests.legacy as tests
+from ckan.common import config
+
+
+# class TestOdshPlugin(object):
+
+#     @classmethod
+#     def setup_class(cls):
+#         cls.app = paste.fixture.TestApp(pylons.test.pylonsapp)
+#         ckan.plugins.load('odsh')
+
+#     def teardown(self):
+#         model.repo.rebuild_db()
+
+#     @classmethod
+#     def teardown_class(cls):
+#         ckan.plugins.unload('odsh')
+
+#     def test_plugin(self):
+#         pass
+
+#     def test_user_cannot_access_dashboard(self):
+#         user = factories.User()
+#         tests.call_action_api(self.app, 'group_create', name='test-group',
+#                               apikey=user['apikey'])
diff --git a/ckanext/odsh/tests/test_rdfexport.py b/ckanext/odsh/tests_wip/test_rdfexport.py
similarity index 100%
rename from ckanext/odsh/tests/test_rdfexport.py
rename to ckanext/odsh/tests_wip/test_rdfexport.py
diff --git a/ckanext/odsh/tests/test_routes.py b/ckanext/odsh/tests_wip/test_routes.py
similarity index 100%
rename from ckanext/odsh/tests/test_routes.py
rename to ckanext/odsh/tests_wip/test_routes.py
diff --git a/ckanext/odsh/tests_wip/test_search.py b/ckanext/odsh/tests_wip/test_search.py
new file mode 100644
index 0000000000000000000000000000000000000000..854a7917a5f7a0c3a8e27ccafe1cae33f153f185
--- /dev/null
+++ b/ckanext/odsh/tests_wip/test_search.py
@@ -0,0 +1,253 @@
+# encoding: utf-8
+
+import ckan.tests.factories as factories
+import ckan.tests.helpers as helpers
+from bs4 import BeautifulSoup
+from ckan import model
+from ckan.lib.mailer import create_reset_key
+from routes import url_for
+import ckan.plugins
+from .test_helpers import odsh_test
+import pdb
+
+
+
+class TestSearch(helpers.FunctionalTestBase):
+
+    _load_plugins = ['odsh', 'spatial_metadata', 'spatial_query']
+
+    def teardown(self):
+        model.repo.rebuild_db()
+
+    @odsh_test()
+    def test_dataset_is_in_search_result(self):
+        # arrange
+        dataset = self._create_dataset()
+
+        # act
+        response = self._perform_search()
+
+        # assert
+        assert dataset['name'] in response
+
+    @odsh_test()
+    def test_query_with_no_match_finds_no_dataset(self):
+        # arrange
+        dataset = self._create_dataset()
+
+        # act
+        response = self._perform_search("foobar")
+
+        # assert
+        self._assert_no_results(response)
+
+    @odsh_test()
+    def test_query_with_no_dates_finds_dataset(self):
+        # arrange
+        dataset = self._create_dataset()
+
+        # act
+        response = self._perform_date_search(None, None)
+
+        # assert
+        assert dataset['name'] in response
+
+    @odsh_test()
+    def test_query_with_very_old_dataset(self):
+        # arrange
+        dataseta = self._create_dataset('do_not_find_me', '2011-01-01', '2013-12-31')
+        datasetb = self._create_dataset('old_dataset', '1111-01-01', '1860-12-31')
+
+        # act
+        response = self._perform_date_search('1110-12-30', '1960-02-01')
+
+        # assert
+        assert 'wrong_start_date_for_search' not in response
+        self._assert_datasets_in_response([datasetb], response)
+        self._assert_datasets_not_in_response([dataseta], response)
+
+    @odsh_test()
+    def test_query_with_end_before_start_finds_no_dataset(self):
+        # arrange
+        datasetA = self._create_dataset('dataseta', '1960-01-01', '1960-12-31')
+
+        # act
+        response = self._perform_date_search('1960-12-30', '1960-02-01')
+
+        # assert
+        self._assert_no_results(response)
+
+    @odsh_test()
+    def test_query_with_wrong_dates_shows_error(self):
+        # arrange
+        dataset = self._create_dataset()
+
+        # act
+        response1 = self._perform_date_search('foo', None)
+        response2 = self._perform_date_search(None, 'foo')
+        response3 = self._perform_date_search('11-11-11', None)
+
+        # assert
+        assert 'wrong_start_date_for_search' in response1
+        self._assert_datasets_in_response([dataset], response1)
+        assert 'daterange: to' not in response1
+        assert 'daterange: from' not in response1
+        assert 'wrong_end_date_for_search' in response2
+        self._assert_datasets_in_response([dataset], response2)
+        assert 'daterange: to' not in response2
+        assert 'daterange: from' not in response2
+        assert 'wrong_start_date_for_search' in response3
+        assert 'daterange: to' not in response3
+        assert 'daterange: from' not in response3
+        self._assert_datasets_in_response([dataset], response3)
+
+    @odsh_test()
+    def test_query_with_start_date_finds_one_dataset(self):
+        # arrange
+        datasetA = self._create_dataset('dataseta', '1960-01-01', '1960-12-31')
+        datasetB = self._create_dataset('datasetb', '1980-01-01', '1990-06-30')
+        datasetC = self._create_dataset('datasetc', '2001-03-01', '2001-04-30')
+
+        # act
+        response1 = self._perform_date_search(None, '1990-01-01')
+        response2 = self._perform_date_search(None, '2010-12-31')
+        response3 = self._perform_date_search('2010-12-31', None)
+        response4 = self._perform_date_search('1985-04-01', '1985-04-20')
+        response5 = self._perform_date_search('2001-04-01', None)
+
+        # assert
+        self._assert_datasets_in_response([datasetA, datasetB], response1)
+        self._assert_datasets_not_in_response([datasetC], response1)
+        assert 'daterange: to' in response1
+
+        self._assert_datasets_in_response(
+            [datasetA, datasetB, datasetC], response2)
+        assert 'daterange: to' in response2
+
+        self._assert_no_results(response3)
+        assert 'daterange: from' in response3
+
+        self._assert_datasets_in_response([datasetB], response4)
+        self._assert_datasets_not_in_response([datasetA, datasetC], response4)
+        assert 'daterange: to' in response4
+        assert 'daterange: from' in response4
+
+        self._assert_datasets_in_response([datasetC], response5)
+        self._assert_datasets_not_in_response([datasetA, datasetB], response5)
+
+    @odsh_test()
+    def test_dataset_combime_date_range_search_and_text_search_same_title(self):
+        # arrange
+        datasetA = self._create_dataset('dataseta', '1960-01-01', '1960-12-31','mytitle')
+        datasetB = self._create_dataset('datasetb', '1980-01-01', '1990-06-30', 'mytitle')
+
+        # act
+        response = self._perform_text_and_date_search('mytitle', None, '1970-01-01')
+
+        # assert
+        self._assert_datasets_in_response([datasetA], response)
+        self._assert_datasets_not_in_response([datasetB], response)
+
+    @odsh_test()
+    def test_dataset_combime_date_range_search_and_text_search_same_dates(self):
+        # arrange
+        datasetA = self._create_dataset('dataseta', '1960-01-01', '1960-12-31','mytitle')
+        datasetB = self._create_dataset('datasetb', '1960-01-01', '1960-12-31','othertitle')
+        datasetC = self._create_dataset('datasetc', '1980-01-01', '1990-06-30', 'mytitle')
+
+        # act
+        response = self._perform_text_and_date_search('mytitle', None, '1970-01-01')
+
+        # assert
+        self._assert_datasets_in_response([datasetA], response)
+        self._assert_datasets_not_in_response([datasetB, datasetC], response)
+
+    @odsh_test()
+    def test_dataset_without_end(self):
+        # arrange
+        datasetA = self._create_dataset('dataseta', '1960-01-01', None,'mytitle')
+
+        # act
+        response1 = self._perform_text_and_date_search('mytitle', '1950-01-01', '1950-02-01')
+        response2 = self._perform_text_and_date_search('mytitle', '1950-01-01', '1960-02-01')
+        response3 = self._perform_text_and_date_search('mytitle', '1950-01-01', None)
+        response4 = self._perform_text_and_date_search('mytitle', None, '1970-01-01')
+        response5 = self._perform_text_and_date_search('mytitle', '1970-01-01', '1980-02-01')
+        response6 = self._perform_text_and_date_search('mytitle', None, '1950-01-01')
+
+        # assert
+        self._assert_datasets_not_in_response([datasetA], response1)
+        self._assert_datasets_in_response([datasetA], response2)
+        self._assert_datasets_in_response([datasetA], response3)
+        self._assert_datasets_in_response([datasetA], response4)
+        self._assert_datasets_in_response([datasetA], response5)
+        self._assert_datasets_not_in_response([datasetA], response6)
+
+    @odsh_test()
+    def test_dataset_new_has_label(self):
+        # arrange
+        datasetA = self._create_dataset('dataseta', '1960-01-01', None,'mytitle')
+
+        # act
+        response = self._perform_text_and_date_search('mytitle', None, None)
+
+        # assert
+        response.mustcontain('new-dataset-label')
+
+    def _assert_datasets_in_response(self, datasets, response):
+        for dataset in datasets:
+            assert dataset['name'] in response
+
+    def _assert_datasets_not_in_response(self, datasets, response):
+        for dataset in datasets:
+            assert dataset['name'] not in response
+
+    def _assert_no_results(self, response):
+        assert "No datasets found" in response
+
+    def _create_dataset(self, name='my-own-dataset', temporal_start='2000-01-27', temporal_end='2000-01-27',title='title'):
+        user = factories.User()
+        extras = [
+            {'key': 'temporal_start', 'value': temporal_start},
+            {'key': 'temporal_end', 'value': temporal_end},
+            {'key': 'issued', 'value': '2000-01-27'},
+            {'key': 'groups', 'value': 'soci'},
+            {'key': 'licenseAttributionByText', 'value': 'text'},
+            {'key': 'spatial_uri', 'value': 'http://dcat-ap.de/def/politicalGeocoding/districtKey/01001'}
+        ]
+        return factories.Dataset(user=user,
+                                 name=name,
+                                 title=title,
+                                 issued='27-01-2000',
+                                 extras=extras,
+                                 license_id='http://dcat-ap.de/def/licenses/dl-by-de/2.0')
+
+    def _perform_search(self, query=None):
+        search_form = self._perform_search_for_form('dataset-search-box-form')
+        if query is not None:
+            search_form['q'] = query
+        return helpers.webtest_submit(search_form)
+
+    def _perform_date_search(self, search_from, search_to):
+        search_form = self._perform_search_for_form('dataset-search-box-form')
+        if search_form is not None:
+            search_form['ext_startdate'] = search_from
+        if search_to is not None:
+            search_form['ext_enddate'] = search_to
+        return helpers.webtest_submit(search_form)
+
+    def _perform_text_and_date_search(self, query, search_from, search_to):
+        search_form = self._perform_search_for_form('dataset-search-box-form')
+        search_form['q'] = query
+        if search_form is not None:
+            search_form['ext_startdate'] = search_from
+        if search_to is not None:
+            search_form['ext_enddate'] = search_to
+        return helpers.webtest_submit(search_form)
+
+    def _perform_search_for_form(self, form):
+        search_url = url_for(named_route='dataset.search')
+        search_response = self._get_test_app().get(search_url)
+
+        search_form = search_response.forms[form]
+        return search_form
diff --git a/ckanext/odsh/tests/test_selenium.py b/ckanext/odsh/tests_wip/test_selenium.py
similarity index 100%
rename from ckanext/odsh/tests/test_selenium.py
rename to ckanext/odsh/tests_wip/test_selenium.py
diff --git a/ckanext/odsh/tests/test_statistikNordHarvester_old.py b/ckanext/odsh/tests_wip/test_statistikNordHarvester_old.py
similarity index 100%
rename from ckanext/odsh/tests/test_statistikNordHarvester_old.py
rename to ckanext/odsh/tests_wip/test_statistikNordHarvester_old.py
diff --git a/ckanext/odsh/tests/test_upload.py b/ckanext/odsh/tests_wip/test_upload.py
similarity index 100%
rename from ckanext/odsh/tests/test_upload.py
rename to ckanext/odsh/tests_wip/test_upload.py
diff --git a/ckanext/odsh/tests/test_user.py b/ckanext/odsh/tests_wip/test_user.py
similarity index 100%
rename from ckanext/odsh/tests/test_user.py
rename to ckanext/odsh/tests_wip/test_user.py
diff --git a/ckanext/odsh/tests/test_validation.py b/ckanext/odsh/tests_wip/test_validation.py
similarity index 100%
rename from ckanext/odsh/tests/test_validation.py
rename to ckanext/odsh/tests_wip/test_validation.py