From 84174c28d9b7ed87fc9203c3154f73e075400f77 Mon Sep 17 00:00:00 2001
From: root <root@vmt-ubu1604.rz.uni-kiel.de>
Date: Mon, 4 May 2020 11:17:32 +0200
Subject: [PATCH] =?UTF-8?q?Anpassungen=20f=C3=BCr=20Open-Data?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore                                    |    9 +
 README.md                                     |   28 +
 ckanext/odsh/collection/__init__.py           |    0
 ckanext/odsh/collection/controller.py         |   38 +
 ckanext/odsh/collection/helpers.py            |  161 +++
 ckanext/odsh/collection/plugin.py             |   60 +
 ckanext/odsh/fanstatic/datepicker.css         |  307 +----
 ckanext/odsh/fanstatic/odsh.js                |    2 +-
 ckanext/odsh/fanstatic/tpsh_toggle_menu.js    |   21 +
 .../odsh/fanstatic/tpsh_validate_password.js  |   71 +
 ckanext/odsh/harvesters/kielharvester.py      |    2 +-
 .../harvesters/number_dcat_de_hamburg.json    |   14 +-
 .../harvesters/statistikamtnordharvester.py   |    2 +-
 ckanext/odsh/helper_pkg_dict.py               |  197 +++
 ckanext/odsh/helpers.py                       |  162 ++-
 ckanext/odsh/helpers_tpsh.py                  |  211 +++
 ckanext/odsh/i18n/ckanext-odsh.pot            | 1129 +++++++++++++++-
 .../de/LC_MESSAGES/ckanext-datarequest.po     |    2 +-
 .../i18n/de/LC_MESSAGES/ckanext-odsh.1.po     |    2 +-
 .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo  |  Bin 8946 -> 10265 bytes
 .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po  |   91 +-
 ckanext/odsh/lib/odsh_icap_client.cfg         |    9 -
 ckanext/odsh/lib/odsh_icap_client.py          |   65 +-
 ckanext/odsh/lib/uploader.py                  |   80 +-
 ckanext/odsh/logic/action.py                  |   63 +-
 ckanext/odsh/matomo.py                        |    9 +
 ckanext/odsh/odsh_logger.py                   |   53 +
 ckanext/odsh/pdf_to_thumbnail/__init__.py     |    0
 ckanext/odsh/pdf_to_thumbnail/action.py       |   30 +
 ckanext/odsh/pdf_to_thumbnail/helpers.py      |   27 +
 ckanext/odsh/pdf_to_thumbnail/plugin.py       |   58 +
 ckanext/odsh/pdf_to_thumbnail/thumbnail.py    |  170 +++
 ckanext/odsh/plugin.py                        |  781 +++++------
 ckanext/odsh/plugin_odsh_autocomplete.py      |    8 +
 ckanext/odsh/plugin_odsh_dcat_harvest.py      |   65 +
 ckanext/odsh/plugin_odsh_harvest.py           |   48 +
 ckanext/odsh/plugin_odsh_icap.py              |   11 +
 ckanext/odsh/pretty_daterange/README.md       |   62 +
 ckanext/odsh/pretty_daterange/__init__.py     |    0
 ckanext/odsh/pretty_daterange/date_range.py   |  181 +++
 .../pretty_daterange/date_range_formatter.py  |   99 ++
 ckanext/odsh/profiles/__init__.py             |    2 +
 ckanext/odsh/profiles/odsh_dcat_de_profile.py |  169 +++
 .../odsh_european_dcatap_profile.py}          |   66 +-
 .../public/base/images/icon_arrow_left.svg    |    1 +
 .../public/base/images/icon_arrow_right.svg   |    1 +
 .../odsh/public/base/images/icon_close.svg    |    1 +
 .../public/base/images/icon_close_white.svg   |    1 +
 .../odsh/public/base/images/icon_funnel.svg   |    1 +
 ckanext/odsh/public/base/images/icon_info.svg |    1 +
 .../public/base/images/icon_lang_danish.png   |  Bin 0 -> 209 bytes
 .../public/base/images/icon_lang_english.png  |  Bin 0 -> 676 bytes
 .../odsh/public/base/images/icon_latest.svg   |    1 +
 .../odsh/public/base/images/icon_phone.svg    |   18 +
 ckanext/odsh/public/base/images/logo-quer.png |  Bin 0 -> 15695 bytes
 .../odsh/public/base/images/logo-quer@2x.png  |  Bin 0 -> 52446 bytes
 .../odsh/public/base/images/platzhalter.svg   |   53 +
 ckanext/odsh/public/odsh.css                  | 1027 +++++++++++----
 ckanext/odsh/public/odsh_header.css           |  146 ++-
 ckanext/odsh/search.py                        |   80 ++
 ckanext/odsh/templates/base.html              |    4 +
 ckanext/odsh/templates/footer.html            |   14 +-
 ckanext/odsh/templates/header.html            |  209 +--
 ckanext/odsh/templates/macros/form.html       |  825 ++++++------
 .../snippets/organization_form.html           |   43 +-
 ckanext/odsh/templates/package/read.html      |   66 +-
 ckanext/odsh/templates/package/read_base.html |    3 +-
 ckanext/odsh/templates/package/search.html    |   71 +-
 .../odsh/templates/package/search.html_neu    |  123 ++
 .../snippets/close_mobile_sidebar_button.html |    3 +
 .../odsh/templates/package/snippets/info.html |   98 +-
 .../snippets/package_basic_fields.html        |  535 ++++----
 .../package/snippets/resource_item.html       |   70 +-
 ckanext/odsh/templates/page.html              |   10 +
 .../odsh/templates/snippets/datepicker.html   |   15 +-
 .../odsh/templates/snippets/facet_list.html   |   74 +-
 .../snippets/home_breadcrumb_item.html        |    6 +-
 .../odsh/templates/snippets/organization.html |   69 +-
 .../odsh/templates/snippets/package_item.html |  151 ++-
 .../odsh/templates/snippets/search_box.html   |   14 +-
 .../odsh/templates/snippets/search_form.html  |   93 +-
 .../snippets/search_result_text.html          |    3 -
 .../odsh/templates/user/edit_user_form.html   |   59 +
 ckanext/odsh/tests/test_validation.py         |   22 +
 ckanext/odsh/tests_tpsh/__init__.py           |    0
 ckanext/odsh/tests_tpsh/resources/__init__.py |    0
 .../odsh/tests_tpsh/resources/collection1.rdf |  474 +++++++
 .../odsh/tests_tpsh/resources/org_dicts.py    |   87 ++
 .../resources/subject_mapping_for_tests.json  |   26 +
 ckanext/odsh/tests_tpsh/resources/test.pdf    |  Bin 0 -> 112437 bytes
 .../odsh/tests_tpsh/resources/transparenz.rdf | 1145 +++++++++++++++++
 ckanext/odsh/tests_tpsh/test_checksum.py      |   59 +
 ckanext/odsh/tests_tpsh/test_date_range.py    |  158 +++
 .../tests_tpsh/test_date_range_formatter.py   |  145 +++
 .../odsh/tests_tpsh/test_helper_pkg_dict.py   |  200 +++
 ckanext/odsh/tests_tpsh/test_helpers_tpsh.py  |  281 ++++
 ckanext/odsh/tests_tpsh/test_icap.py          |   67 +
 ckanext/odsh/tests_tpsh/test_matomo.py        |   53 +
 ckanext/odsh/tests_tpsh/test_odsh_helpers.py  |  161 +++
 .../tests_tpsh/test_password_validation.py    |   35 +
 ckanext/odsh/tests_tpsh/test_plugin.py        |   52 +
 ckanext/odsh/tests_tpsh/test_profiles.py      |  184 +++
 ckanext/odsh/tests_tpsh/test_search.py        |  133 ++
 ckanext/odsh/tests_tpsh/test_uri_store.py     |   38 +
 ckanext/odsh/tools.py                         |   45 +
 ckanext/odsh/uri_store/__init__.py            |    1 +
 ckanext/odsh/uri_store/modifiers.py           |   20 +
 ckanext/odsh/uri_store/store.py               |    1 +
 ckanext/odsh/validation.py                    |  146 ++-
 dev-requirements.txt                          |  185 +++
 language_mapping.json                         |    5 +
 requirements.txt                              |    6 +-
 setup.py                                      |   11 +-
 subject_mapping.json                          |   25 +
 114 files changed, 9884 insertions(+), 2335 deletions(-)
 create mode 100644 README.md
 create mode 100644 ckanext/odsh/collection/__init__.py
 create mode 100644 ckanext/odsh/collection/controller.py
 create mode 100644 ckanext/odsh/collection/helpers.py
 create mode 100644 ckanext/odsh/collection/plugin.py
 create mode 100644 ckanext/odsh/fanstatic/tpsh_toggle_menu.js
 create mode 100644 ckanext/odsh/fanstatic/tpsh_validate_password.js
 create mode 100644 ckanext/odsh/helper_pkg_dict.py
 create mode 100644 ckanext/odsh/helpers_tpsh.py
 delete mode 100644 ckanext/odsh/lib/odsh_icap_client.cfg
 create mode 100644 ckanext/odsh/odsh_logger.py
 create mode 100644 ckanext/odsh/pdf_to_thumbnail/__init__.py
 create mode 100644 ckanext/odsh/pdf_to_thumbnail/action.py
 create mode 100644 ckanext/odsh/pdf_to_thumbnail/helpers.py
 create mode 100644 ckanext/odsh/pdf_to_thumbnail/plugin.py
 create mode 100644 ckanext/odsh/pdf_to_thumbnail/thumbnail.py
 create mode 100644 ckanext/odsh/plugin_odsh_autocomplete.py
 create mode 100644 ckanext/odsh/plugin_odsh_dcat_harvest.py
 create mode 100644 ckanext/odsh/plugin_odsh_harvest.py
 create mode 100644 ckanext/odsh/plugin_odsh_icap.py
 create mode 100644 ckanext/odsh/pretty_daterange/README.md
 create mode 100644 ckanext/odsh/pretty_daterange/__init__.py
 create mode 100644 ckanext/odsh/pretty_daterange/date_range.py
 create mode 100644 ckanext/odsh/pretty_daterange/date_range_formatter.py
 create mode 100644 ckanext/odsh/profiles/__init__.py
 create mode 100644 ckanext/odsh/profiles/odsh_dcat_de_profile.py
 rename ckanext/odsh/{profiles.py => profiles/odsh_european_dcatap_profile.py} (70%)
 create mode 100644 ckanext/odsh/public/base/images/icon_arrow_left.svg
 create mode 100644 ckanext/odsh/public/base/images/icon_arrow_right.svg
 create mode 100644 ckanext/odsh/public/base/images/icon_close.svg
 create mode 100644 ckanext/odsh/public/base/images/icon_close_white.svg
 create mode 100644 ckanext/odsh/public/base/images/icon_funnel.svg
 create mode 100644 ckanext/odsh/public/base/images/icon_info.svg
 create mode 100644 ckanext/odsh/public/base/images/icon_lang_danish.png
 create mode 100644 ckanext/odsh/public/base/images/icon_lang_english.png
 create mode 100644 ckanext/odsh/public/base/images/icon_latest.svg
 create mode 100644 ckanext/odsh/public/base/images/icon_phone.svg
 create mode 100644 ckanext/odsh/public/base/images/logo-quer.png
 create mode 100644 ckanext/odsh/public/base/images/logo-quer@2x.png
 create mode 100644 ckanext/odsh/public/base/images/platzhalter.svg
 create mode 100644 ckanext/odsh/search.py
 create mode 100644 ckanext/odsh/templates/package/search.html_neu
 create mode 100644 ckanext/odsh/templates/package/snippets/close_mobile_sidebar_button.html
 create mode 100644 ckanext/odsh/templates/user/edit_user_form.html
 create mode 100644 ckanext/odsh/tests_tpsh/__init__.py
 create mode 100644 ckanext/odsh/tests_tpsh/resources/__init__.py
 create mode 100644 ckanext/odsh/tests_tpsh/resources/collection1.rdf
 create mode 100644 ckanext/odsh/tests_tpsh/resources/org_dicts.py
 create mode 100644 ckanext/odsh/tests_tpsh/resources/subject_mapping_for_tests.json
 create mode 100644 ckanext/odsh/tests_tpsh/resources/test.pdf
 create mode 100644 ckanext/odsh/tests_tpsh/resources/transparenz.rdf
 create mode 100644 ckanext/odsh/tests_tpsh/test_checksum.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_date_range.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_date_range_formatter.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_helper_pkg_dict.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_helpers_tpsh.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_icap.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_matomo.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_odsh_helpers.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_password_validation.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_plugin.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_profiles.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_search.py
 create mode 100644 ckanext/odsh/tests_tpsh/test_uri_store.py
 create mode 100644 ckanext/odsh/tools.py
 create mode 100644 ckanext/odsh/uri_store/__init__.py
 create mode 100644 ckanext/odsh/uri_store/modifiers.py
 create mode 100644 ckanext/odsh/uri_store/store.py
 create mode 100644 language_mapping.json
 create mode 100644 subject_mapping.json

diff --git a/.gitignore b/.gitignore
index 1f6580a7..2bcbcdda 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,3 +41,12 @@ coverage.xml
 # Sphinx documentation
 docs/_build/
 .vscode/settings.json
+
+# VS Code
+.vscode/
+
+# symlink to env
+env
+
+# nose
+.noseids
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..3e20b46d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,28 @@
+# ckanext-odsh
+Diese CKAN-Extension enthält die wichtigsten Features und das Layout für das Tranzparenzportal Schleswig-Holstein.
+Sie ist eine Weiterentwicklung der gleichnamigen Extension, die im Zuge der Entwicklung des Open Data Portals Schleswig-Holstein entwickelt wurde.
+
+## Branches
+### master
+Dieser Branch enthält den aktuell auf den Stage- bzw. Prod-Servern laufenden Code.
+
+### dev
+Dieser Branch enthält den aktuellsten Stand mit allen fertig entwickelten Features.
+
+### andere Branches
+Für die Entwicklung neuer Features soll jeweils ein eigener Branch vom dev-Branch abgezweigt werden. Für den Branch soll ein sprechender Name gewählt werden.
+
+## Deployment auf Produktivsystem
+Das Deployment auf das Produktivsystem geschieht über Ansible. Die dafür benötigten Skripte befinden sich im Repository `tpsh_deploy`. 
+
+## Manuelle Installation
+
+
+## Konfiguration
+Die Extension benötigt Konfigurationsparameter in der CKAN-Konfigurationsdatei (z.B. `production.ini`). Die korrekten Parameter für das Produktivsystem befinden sich im Repository `tpsh_deploy` unter `resources/production.ini`. Folgende Parameter sollten für Enwicklungssysteme geändert werden:
+
+| Parameter                             | Erläuterung                                                   | Wert für Entwicklungssysteme              |
+|---------------------------------------|---------------------------------------------------------------|-------------------------------------------|
+| ckanext.odsh.use_matomo               | `true` schaltet das matomo-Tracking ein.                      | `false`                                   |
+| ckanext.odsh.skip_icap_virus_check    | `false` schaltet den Virus-Check ein.                         | `true`                                    |
+| ckanext.odsh.showtestbanner           | `true` schaltet das Banner "Testsystem" ein, Muss `false` für Production-Server sein. | -                 |
\ No newline at end of file
diff --git a/ckanext/odsh/collection/__init__.py b/ckanext/odsh/collection/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/ckanext/odsh/collection/controller.py b/ckanext/odsh/collection/controller.py
new file mode 100644
index 00000000..5b049563
--- /dev/null
+++ b/ckanext/odsh/collection/controller.py
@@ -0,0 +1,38 @@
+from ckan.lib.helpers import is_url, url_for
+import ckan.plugins.toolkit as toolkit
+from ckan.controllers.package import PackageController
+from helpers import get_latest_resources_for_type, get_latest_dataset
+
+
+
+class LatestDatasetController(PackageController):
+    
+    def latest_dataset(self, id):
+        latest_dataset= get_latest_dataset(id)
+        toolkit.redirect_to(controller='package', action='read', id=latest_dataset)
+
+class LatestRecourcesController(PackageController):
+    
+    def latest_resource(self, id, type):
+        latest_resources = get_latest_resources_for_type(id, type)
+        if latest_resources is None:
+            abort(404)
+        url_type = latest_resources.get('url_type')
+        if url_type is None:
+            resource_url = latest_resources.get('url')
+            toolkit.redirect_to(resource_url)
+        if url_type == 'upload':
+            download_package_id = latest_resources.get('package_id')
+            download_resource_id = latest_resources.get('id')
+            pre_resource_url = latest_resources.get('url')
+            if is_url(pre_resource_url):
+                url_resource = pre_resource_url
+            else:
+                url_resource = url_for(controller='package',
+                                    action='resource_download',
+                                    id=download_package_id,
+                                    resource_id=download_resource_id,
+                                    filename=pre_resource_url,
+                                    qualified = True)
+            toolkit.redirect_to(url_resource)
+        abort(404)
\ No newline at end of file
diff --git a/ckanext/odsh/collection/helpers.py b/ckanext/odsh/collection/helpers.py
new file mode 100644
index 00000000..ec0f7dcb
--- /dev/null
+++ b/ckanext/odsh/collection/helpers.py
@@ -0,0 +1,161 @@
+from string import lower
+
+import ckan.lib.helpers as helpers
+import ckan.model as model
+import ckan.plugins.toolkit as toolkit
+
+
+
+#routine functions
+
+def get_package_dict(name):
+    return model.Package.get(name).as_dict()
+
+def get_relationships(name):
+    collection_dict = get_package_dict(name)
+    return collection_dict.get('relationships')
+
+def get_all_datasets_belonging_to_collection(collection_name):
+    list_rel_collection = get_relationships(collection_name)
+    name_list = list()
+    for item in list_rel_collection:
+        item_object = item.get('object') 
+        name_list.append(item_object)
+    return name_list
+
+#for mapping latest resources and latest dataset
+
+def get_latest_dataset(collection_name):
+    collection_list_relationships = get_all_datasets_belonging_to_collection(collection_name)
+    latest_issued = latest_name = None
+    for item in collection_list_relationships:
+        item_pkt_dict =  get_package_dict(item)
+        if helpers.check_access('package_show', item_pkt_dict):
+            item_issued = item_pkt_dict.get('extras').get('issued')
+            if latest_issued < item_issued or (latest_issued == item_issued and latest_name < item):
+                latest_name=item
+                latest_issued=item_issued
+    return latest_name
+
+
+def is_latest_resources(resource_format, type, resource_created,latest_created, resource_id, latest_id):
+    if lower(resource_format) == lower(type):
+        return (resource_created > latest_created or (resource_created == latest_created and resource_id > latest_id))
+    else:
+        return False
+
+def get_latest_resources_for_type(collection_name, type):
+    latest_dataset_name = get_latest_dataset(collection_name)
+    latest_dataset = get_package_dict(latest_dataset_name)
+    resource_list = latest_dataset.get('resources')
+    latest_resource = latest_created = latest_id = None
+    for resource in resource_list:
+        resource_format = resource.get('format')
+        resource_created = resource.get('created')
+        resource_id = resource.get('id')
+        if is_latest_resources(resource_format, type, resource_created, latest_created, resource_id, latest_id):
+            latest_id=resource_id
+            latest_created=resource_created
+            latest_resource=resource
+    return latest_resource
+
+#for predecessor and successor
+
+
+
+def get_collection_name_by_dataset(dataset_name):
+    list_rel_dataset = get_relationships(dataset_name)
+    if len(list_rel_dataset):        
+        return list_rel_dataset[0]['object']
+
+def get_collection_title_by_dataset(pkg_dict_dataset):
+    dataset_name = pkg_dict_dataset.get('name')
+    collection_name = get_collection_name_by_dataset(dataset_name)
+    if not collection_name:
+        return None
+    context = None
+    pkg_dict_collection = toolkit.get_action('package_show')(context, {'id': collection_name})
+    if not pkg_dict_collection:
+        return None
+    title_collection = pkg_dict_collection.get('title')
+    return title_collection
+
+def get_all_datasets_belonging_to_collection_by_dataset(dataset_name):
+    collection_name = get_collection_name_by_dataset(dataset_name)
+    if collection_name: 
+        return get_all_datasets_belonging_to_collection(collection_name)
+    return []
+
+def _get_siblings_dicts_with_access(pkg_dict):
+    dataset_name = pkg_dict.get('name')
+    list_of_siblings = get_all_datasets_belonging_to_collection_by_dataset(dataset_name)
+    n_siblings = len(list_of_siblings)
+    if n_siblings>0:
+        siblings_dicts = [get_package_dict(name) for name in list_of_siblings]
+        user_has_access = lambda pkg_dict:helpers.check_access('package_show', pkg_dict)
+        siblings_dicts_with_access = filter(user_has_access, siblings_dicts)
+        return siblings_dicts_with_access
+    return None
+
+def _sort_siblings_by_name_and_date(siblings_dicts):
+    '''
+    sort by name first and then by date to have a fallback if dates are the same
+    '''
+    _get_name = lambda pkg_dict:pkg_dict.get('name')
+    _get_issued = lambda pkg_dict:pkg_dict.get('extras').get('issued')
+    siblings_dicts_sorted_by_name = sorted(siblings_dicts, key=_get_name)
+    siblings_dicts_sorted_by_date_issued = sorted(siblings_dicts_sorted_by_name, key=_get_issued)
+    return siblings_dicts_sorted_by_date_issued
+
+def get_successor_and_predecessor_dataset(pkg_dict):
+    dataset_name = pkg_dict.get('name')
+    siblings_dicts_with_access = _get_siblings_dicts_with_access(pkg_dict)
+    if siblings_dicts_with_access:
+        n_siblings = len(siblings_dicts_with_access)
+        siblings_dicts_sorted_by_date_issued = _sort_siblings_by_name_and_date(siblings_dicts_with_access)
+        siblings_names_sorted_by_date_issued = [d['name'] for d in siblings_dicts_sorted_by_date_issued]
+        id_current_dataset = siblings_names_sorted_by_date_issued.index(dataset_name)
+        predecessor_name = (
+            siblings_names_sorted_by_date_issued[id_current_dataset-1] if (id_current_dataset > 0) 
+            else None
+        )
+        successor_name = (
+            siblings_names_sorted_by_date_issued[id_current_dataset+1] if (id_current_dataset < n_siblings-1) 
+            else None
+        )
+    else:
+        predecessor_name, successor_name = None, None
+    return successor_name, predecessor_name
+
+def get_successor_and_predecessor_urls(pkg_dict):
+    successor_name, predecessor_name = get_successor_and_predecessor_dataset(pkg_dict)
+    successor_url, predecessor_url = (
+        helpers.url_for(controller='package', action='read', id=name)
+        if name is not None
+        else None
+        for name in (successor_name, predecessor_name)
+    )
+    return successor_url, predecessor_url
+
+def get_successor(pkg_dict):
+    successor_and_predecessor = get_successor_and_predecessor_urls(pkg_dict)
+    return successor_and_predecessor[0]
+    
+def get_predecessor(pkg_dict):
+    successor_and_predecessor = get_successor_and_predecessor_urls(pkg_dict)
+    return successor_and_predecessor[1]
+
+#link to latest collection member
+def latest_collection_member_persistent_link(pkg_dict):
+    dataset_name = pkg_dict.get('name')
+    collection_name = get_collection_name_by_dataset(
+        dataset_name=dataset_name
+    )
+    if not collection_name:
+        return None
+    url = helpers.url_for(
+        controller='ckanext.odsh.collection.controller:LatestDatasetController', 
+        action='latest',
+        id=collection_name
+    )
+    return url
\ No newline at end of file
diff --git a/ckanext/odsh/collection/plugin.py b/ckanext/odsh/collection/plugin.py
new file mode 100644
index 00000000..2ebcefc1
--- /dev/null
+++ b/ckanext/odsh/collection/plugin.py
@@ -0,0 +1,60 @@
+
+from ckan.lib.plugins import DefaultTranslation, DefaultDatasetForm
+import ckan.plugins as plugins 
+import helpers as collection_helpers
+from routes.mapper import SubMapper
+
+class CollectionsPlugin(plugins.SingletonPlugin, DefaultDatasetForm):
+    plugins.implements(plugins.IDatasetForm, inherit=True)
+    plugins.implements(plugins.IRoutes, inherit=True)
+    plugins.implements(plugins.ITemplateHelpers)
+
+
+    # IDataSetForm
+    def package_types(self):
+        return ('collection', )
+    
+    def is_fallback(self):
+        return False
+
+    
+    # IRoutes    
+    def before_map(self, map):
+
+        map.connect(
+            '/collection/{id}/aktuell',
+            controller='ckanext.odsh.collection.controller:LatestDatasetController',
+            action='latest_dataset'
+        )
+
+        map.connect(
+            '/collection/{id}/aktuell.{type}',
+            controller='ckanext.odsh.collection.controller:LatestRecourcesController',
+            action='latest_resource'
+        )
+
+        with SubMapper(
+            map, 
+            controller='ckanext.odsh.collection.controller:LatestDatasetController', 
+            path_prefix='/collection/'
+        ) as m:
+            m.connect('latest', '{id}/aktuell', action='latest')
+            m.connect('latest_resource', '{id}/aktuell.{type}', action='latest_resource')  
+        return map
+
+    def after_map(self, map):
+        return map
+
+    
+    # ITemplateHelpers
+    def get_helpers(self):
+        # Template helper function names should begin with the name of the
+        # extension they belong to, to avoid clashing with functions from
+        # other extensions.
+
+        return {
+            'collection_get_successor': collection_helpers.get_successor,
+            'collection_get_predecessor': collection_helpers.get_predecessor,
+            'collection_get_latest_member':collection_helpers.latest_collection_member_persistent_link,
+            'collection_get_title': collection_helpers.get_collection_title_by_dataset,
+        }
diff --git a/ckanext/odsh/fanstatic/datepicker.css b/ckanext/odsh/fanstatic/datepicker.css
index c2a0a0a7..408f3afa 100644
--- a/ckanext/odsh/fanstatic/datepicker.css
+++ b/ckanext/odsh/fanstatic/datepicker.css
@@ -3,308 +3,5 @@
  *
  * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
  */
- .datepicker{
-    padding:4px;
-    -webkit-border-radius:4px;
-    -moz-border-radius:4px;
-    border-radius:4px;
-    direction:ltr
-}
-.datepicker-inline{
-    width:220px
-}
-.datepicker-rtl{
-    direction:rtl
-}
-.datepicker-rtl.dropdown-menu{
-    left:auto
-}
-.datepicker-rtl table tr td span{
-    float:right
-}
-.datepicker-dropdown{
-    top:0;
-    left:0
-}
-.datepicker-dropdown:before{
-    content:'';
-    display:inline-block;
-    border-left:7px solid transparent;
-    border-right:7px solid transparent;
-    border-bottom:7px solid #999;
-    border-top:0;
-    border-bottom-color:rgba(0,0,0,.2);
-    position:absolute
-}
-.datepicker-dropdown:after{
-    content:'';
-    display:inline-block;
-    border-left:6px solid transparent;
-    border-right:6px solid transparent;
-    border-bottom:6px solid #fff;
-    border-top:0;
-    position:absolute
-}
-.datepicker-dropdown.datepicker-orient-left:before{
-    left:6px
-}
-.datepicker-dropdown.datepicker-orient-left:after{
-    left:7px
-}
-.datepicker-dropdown.datepicker-orient-right:before{
-    right:6px
-}
-.datepicker-dropdown.datepicker-orient-right:after{
-    right:7px
-}
-.datepicker-dropdown.datepicker-orient-bottom:before{
-    top:-7px
-}
-.datepicker-dropdown.datepicker-orient-bottom:after{
-    top:-6px
-}
-.datepicker-dropdown.datepicker-orient-top:before{
-    bottom:-7px;
-    border-bottom:0;
-    border-top:7px solid #999
-}
-.datepicker-dropdown.datepicker-orient-top:after{
-    bottom:-6px;
-    border-bottom:0;
-    border-top:6px solid #fff
-}
-.datepicker table{
-    margin:0;
-    -webkit-touch-callout:none;
-    -webkit-user-select:none;
-    -khtml-user-select:none;
-    -moz-user-select:none;
-    -ms-user-select:none;
-    user-select:none
-}
-.datepicker td,.datepicker th{
-    text-align:center;
-    width:20px;
-    height:20px;
-    -webkit-border-radius:4px;
-    -moz-border-radius:4px;
-    border-radius:4px;
-    border:none
-}
-.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{
-    background-color:transparent
-}
-.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{
-    background:#eee;
-    cursor:pointer
-}
-.datepicker table tr td.new,.datepicker table tr td.old{
-    color:#999
-}
-.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{
-    background:0 0;
-    color:#999;
-    cursor:default
-}
-.datepicker table tr td.highlighted{
-    background:#d9edf7;
-    border-radius:0
-}
-.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{
-    background-color:#fde19a;
-    background-image:-moz-linear-gradient(to bottom,#fdd49a,#fdf59a);
-    background-image:-ms-linear-gradient(to bottom,#fdd49a,#fdf59a);
-    background-image:-webkit-gradient(linear,0 0,0 100%,from(#fdd49a),to(#fdf59a));
-    background-image:-webkit-linear-gradient(to bottom,#fdd49a,#fdf59a);
-    background-image:-o-linear-gradient(to bottom,#fdd49a,#fdf59a);
-    background-image:linear-gradient(to bottom,#fdd49a,#fdf59a);
-    background-repeat:repeat-x;
-    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
-    border-color:#fdf59a #fdf59a #fbed50;
-    border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
-    filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);
-    color:#000
-}
-.datepicker table tr td.today.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today:active,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today[disabled]{
-    background-color:#fdf59a
-}
-.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active{
-    background-color:#fbf069\9
-}
-.datepicker table tr td.today:hover:hover{
-    color:#000
-}
-.datepicker table tr td.today.active:hover{
-    color:#fff
-}
-.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{
-    background:#eee;
-    -webkit-border-radius:0;
-    -moz-border-radius:0;
-    border-radius:0
-}
-.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{
-    background-color:#f3d17a;
-    background-image:-moz-linear-gradient(to bottom,#f3c17a,#f3e97a);
-    background-image:-ms-linear-gradient(to bottom,#f3c17a,#f3e97a);
-    background-image:-webkit-gradient(linear,0 0,0 100%,from(#f3c17a),to(#f3e97a));
-    background-image:-webkit-linear-gradient(to bottom,#f3c17a,#f3e97a);
-    background-image:-o-linear-gradient(to bottom,#f3c17a,#f3e97a);
-    background-image:linear-gradient(to bottom,#f3c17a,#f3e97a);
-    background-repeat:repeat-x;
-    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
-    border-color:#f3e97a #f3e97a #edde34;
-    border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
-    filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);
-    -webkit-border-radius:0;
-    -moz-border-radius:0;
-    border-radius:0
-}
-.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today[disabled]{
-    background-color:#f3e97a
-}
-.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active{
-    background-color:#efe24b\9
-}
-.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{
-    background-color:#9e9e9e;
-    background-image:-moz-linear-gradient(to bottom,#b3b3b3,grey);
-    background-image:-ms-linear-gradient(to bottom,#b3b3b3,grey);
-    background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3b3b3),to(grey));
-    background-image:-webkit-linear-gradient(to bottom,#b3b3b3,grey);
-    background-image:-o-linear-gradient(to bottom,#b3b3b3,grey);
-    background-image:linear-gradient(to bottom,#b3b3b3,grey);
-    background-repeat:repeat-x;
-    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
-    border-color:grey grey #595959;
-    border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
-    filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);
-    color:#fff;
-    text-shadow:0 -1px 0 rgba(0,0,0,.25)
-}
-.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected[disabled]{
-    background-color:grey
-}
-.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active{
-    background-color:#666\9
-}
-.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{
-    background-color:#006dcc;
-    background-image:-moz-linear-gradient(to bottom,#08c,#04c);
-    background-image:-ms-linear-gradient(to bottom,#08c,#04c);
-    background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));
-    background-image:-webkit-linear-gradient(to bottom,#08c,#04c);
-    background-image:-o-linear-gradient(to bottom,#08c,#04c);
-    background-image:linear-gradient(to bottom,#08c,#04c);
-    background-repeat:repeat-x;
-    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
-    border-color:#04c #04c #002a80;
-    border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
-    filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);
-    color:#fff;
-    text-shadow:0 -1px 0 rgba(0,0,0,.25)
-}
-.datepicker table tr td.active.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active:active,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active[disabled]{
-    background-color:#04c
-}
-.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active{
-    background-color:#039\9
-}
-.datepicker table tr td span{
-    display:block;
-    width:23%;
-    height:54px;
-    line-height:54px;
-    float:left;
-    margin:1%;
-    cursor:pointer;
-    -webkit-border-radius:4px;
-    -moz-border-radius:4px;
-    border-radius:4px
-}
-.datepicker table tr td span.focused,.datepicker table tr td span:hover{
-    background:#eee
-}
-.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{
-    background:0 0;
-    color:#999;
-    cursor:default
-}
-.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{
-    background-color:#006dcc;
-    background-image:-moz-linear-gradient(to bottom,#08c,#04c);
-    background-image:-ms-linear-gradient(to bottom,#08c,#04c);
-    background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));
-    background-image:-webkit-linear-gradient(to bottom,#08c,#04c);
-    background-image:-o-linear-gradient(to bottom,#08c,#04c);
-    background-image:linear-gradient(to bottom,#08c,#04c);
-    background-repeat:repeat-x;
-    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
-    border-color:#04c #04c #002a80;
-    border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
-    filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);
-    color:#fff;
-    text-shadow:0 -1px 0 rgba(0,0,0,.25)
-}
-.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active[disabled]{
-    background-color:#04c
-}
-.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active{
-    background-color:#039\9
-}
-.datepicker table tr td span.new,.datepicker table tr td span.old{
-    color:#999
-}
-.datepicker .datepicker-switch{
-    width:145px
-}
-.datepicker .datepicker-switch,.datepicker .next,.datepicker .prev,.datepicker tfoot tr th{
-    cursor:pointer
-}
-.datepicker .datepicker-switch:hover,.datepicker .next:hover,.datepicker .prev:hover,.datepicker tfoot tr th:hover{
-    background:#eee
-}
-.datepicker .next.disabled,.datepicker .prev.disabled{
-    visibility:hidden
-}
-.datepicker .cw{
-    font-size:10px;
-    width:12px;
-    padding:0 2px 0 5px;
-    vertical-align:middle
-}
-.input-append.date .add-on,.input-prepend.date .add-on{
-    cursor:pointer
-}
-.input-append.date .add-on i,.input-prepend.date .add-on i{
-    margin-top:3px
-}
-.input-daterange input{
-    text-align:center
-}
-.input-daterange input:first-child{
-    -webkit-border-radius:3px 0 0 3px;
-    -moz-border-radius:3px 0 0 3px;
-    border-radius:3px 0 0 3px
-}
-.input-daterange input:last-child{
-    -webkit-border-radius:0 3px 3px 0;
-    -moz-border-radius:0 3px 3px 0;
-    border-radius:0 3px 3px 0
-}
-.input-daterange .add-on{
-    display:inline-block;
-    width:auto;
-    min-width:16px;
-    height:18px;
-    padding:4px 5px;
-    font-weight:400;
-    line-height:18px;
-    text-align:center;
-    text-shadow:0 1px 0 #fff;
-    vertical-align:middle;
-    background-color:#eee;
-    border:1px solid #ccc;
-    margin-left:-5px;
-    margin-right:-5px
-}
\ No newline at end of file
+
+.datepicker{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl.dropdown-menu{left:auto}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #999;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.highlighted{background:#d9edf7;border-radius:0}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{background-color:#fde19a;background-image:-moz-linear-gradient(to bottom,#fdd49a,#fdf59a);background-image:-ms-linear-gradient(to bottom,#fdd49a,#fdf59a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fdd49a),to(#fdf59a));background-image:-webkit-linear-gradient(to bottom,#fdd49a,#fdf59a);background-image:-o-linear-gradient(to bottom,#fdd49a,#fdf59a);background-image:linear-gradient(to bottom,#fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today:active,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today[disabled]{background-color:#fdf59a}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active{background-color:#fbf069\9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{background-color:#f3d17a;background-image:-moz-linear-gradient(to bottom,#f3c17a,#f3e97a);background-image:-ms-linear-gradient(to bottom,#f3c17a,#f3e97a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f3c17a),to(#f3e97a));background-image:-webkit-linear-gradient(to bottom,#f3c17a,#f3e97a);background-image:-o-linear-gradient(to bottom,#f3c17a,#f3e97a);background-image:linear-gradient(to bottom,#f3c17a,#f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active{background-color:#efe24b\9}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{background-color:#9e9e9e;background-image:-moz-linear-gradient(to bottom,#b3b3b3,grey);background-image:-ms-linear-gradient(to bottom,#b3b3b3,grey);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3b3b3),to(grey));background-image:-webkit-linear-gradient(to bottom,#b3b3b3,grey);background-image:-o-linear-gradient(to bottom,#b3b3b3,grey);background-image:linear-gradient(to bottom,#b3b3b3,grey);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:grey grey #595959;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected[disabled]{background-color:grey}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active{background-color:#666\9}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{background-color:#006dcc;background-image:-moz-linear-gradient(to bottom,#08c,#04c);background-image:-ms-linear-gradient(to bottom,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(to bottom,#08c,#04c);background-image:-o-linear-gradient(to bottom,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active:active,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active[disabled]{background-color:#04c}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active{background-color:#039\9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datepicker table tr td span.focused,.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{background-color:#006dcc;background-image:-moz-linear-gradient(to bottom,#08c,#04c);background-image:-ms-linear-gradient(to bottom,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(to bottom,#08c,#04c);background-image:-o-linear-gradient(to bottom,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active[disabled]{background-color:#04c}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active{background-color:#039\9}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch,.datepicker .next,.datepicker .prev,.datepicker tfoot tr th{cursor:pointer}.datepicker .datepicker-switch:hover,.datepicker .next:hover,.datepicker .prev:hover,.datepicker tfoot tr th:hover{background:#eee}.datepicker .next.disabled,.datepicker .prev.disabled{visibility:hidden}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-append.date .add-on,.input-prepend.date .add-on{cursor:pointer}.input-append.date .add-on i,.input-prepend.date .add-on i{margin-top:3px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-daterange input:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:400;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}
\ No newline at end of file
diff --git a/ckanext/odsh/fanstatic/odsh.js b/ckanext/odsh/fanstatic/odsh.js
index b3081447..97cd4326 100644
--- a/ckanext/odsh/fanstatic/odsh.js
+++ b/ckanext/odsh/fanstatic/odsh.js
@@ -2,7 +2,7 @@ $(document).ready(function ()
 {
     $('.mylabel').click(function ()
     {
-        window.location = $(this).siblings('a').attr('href');
+        window.location = $(this).siblings('label').children('a').attr('href');
     });
 
     let search = function (score)
diff --git a/ckanext/odsh/fanstatic/tpsh_toggle_menu.js b/ckanext/odsh/fanstatic/tpsh_toggle_menu.js
new file mode 100644
index 00000000..1a8a8c82
--- /dev/null
+++ b/ckanext/odsh/fanstatic/tpsh_toggle_menu.js
@@ -0,0 +1,21 @@
+"use strict";
+
+ckan.module('tpsh_toggle_menu', function ($) {
+    return {
+        initialize: function () {
+            $.proxyAll(this, /_on/);
+            this.el.on('click', this._onClick);
+        },
+        
+        _onClick: function(event) {
+            var element = $("body");
+            var className = "menu-modal"
+            if (element.hasClass(className)){
+                element.removeClass(className)
+            }
+            else {
+                element.addClass(className);
+            }
+        }
+    };
+});
\ No newline at end of file
diff --git a/ckanext/odsh/fanstatic/tpsh_validate_password.js b/ckanext/odsh/fanstatic/tpsh_validate_password.js
new file mode 100644
index 00000000..f0f8f71b
--- /dev/null
+++ b/ckanext/odsh/fanstatic/tpsh_validate_password.js
@@ -0,0 +1,71 @@
+"use strict";
+
+function isPasswordValid(password) {
+    if (password.length == 0) return true;
+    var minimumLength = 8;
+    var isValid = 
+        (password.length >= minimumLength) &&
+        (atLeastOneUpperCaseLetter(password)) &&
+        (atLeastOneLowerCaseLetter(password)) &&
+        (atLeastOneNoneLetter(password));
+    return isValid
+
+    function atLeastOneUpperCaseLetter(password) {
+        return (password !== password.toLowerCase())
+    }
+
+    function atLeastOneLowerCaseLetter(password) {
+        return (password !== password.toUpperCase())
+    }
+
+    function atLeastOneNoneLetter(password) {
+        return /[\W\d_]/.test(password)
+    }
+}
+
+
+function showPasswordStatus(isValid, inputElement) {
+    if (isValid) {
+        messageText = '';
+    } else {
+        messageText = 'Passwörter müssen länger als 8 Zeichen sein und Großbuchstaben, Kleinbuchstaben und andere Zeichen enthalten.'
+    }
+    get_error_element(inputElement).innerHTML = messageText;
+
+    function get_error_element(inputElement) {
+        // assumes that there is an element after input_element's parent that
+        // contains a class "inline-error"
+        var currentNode = inputElement.parentNode
+        do {
+            currentNode = currentNode.nextElementSibling;
+        } while (
+            (currentNode !== null) &&
+            !(currentNode.classList.contains('inline-error'))
+        )
+        return currentNode
+    }
+}
+
+
+function setSubmitButtonState(isPasswordValid) {
+    var submitButton = document.getElementsByName('save')[0];
+    submitButton.disabled = !isPasswordValid;
+}
+
+
+ckan.module('tpsh_validate_password', function ($) {
+    return {
+        initialize: function () {
+            $.proxyAll(this, /_on/);
+            this.el.on('input', this._onChange);
+        },
+        
+        _onChange: function(event) {
+            var inputElement = event.target;
+            var newPassword = inputElement.value;
+            var isValid = isPasswordValid(newPassword);
+            showPasswordStatus(isValid, inputElement);
+            setSubmitButtonState(isValid);
+        }
+    };
+});
\ No newline at end of file
diff --git a/ckanext/odsh/harvesters/kielharvester.py b/ckanext/odsh/harvesters/kielharvester.py
index 55a7317e..c1dfb652 100755
--- a/ckanext/odsh/harvesters/kielharvester.py
+++ b/ckanext/odsh/harvesters/kielharvester.py
@@ -112,7 +112,7 @@ class KielHarvester(ODSHBaseHarvester):
                 context.copy(), {'id': harvest_object.source.id})
             package_dict['owner_org'] = source_dataset.get('owner_org')
 
-            if package_dict['type'] == 'datensatz':
+            if package_dict['type'] in ('datensatz', 'dokument', 'document'):
                 package_dict['type'] = 'dataset'
             package_dict['id'] = harvest_object.guid
 
diff --git a/ckanext/odsh/harvesters/number_dcat_de_hamburg.json b/ckanext/odsh/harvesters/number_dcat_de_hamburg.json
index 8ccefed4..51c0efe1 100644
--- a/ckanext/odsh/harvesters/number_dcat_de_hamburg.json
+++ b/ckanext/odsh/harvesters/number_dcat_de_hamburg.json
@@ -28,7 +28,7 @@
 "32" : ["soci"],
 "33" : ["soci"],
 "34" : ["soci"],
-"35" : ["regi"],
+"35" : ["econ","regi","agri"],
 "36" : ["educ"],
 "37" : ["educ"],
 "38" : ["educ"],
@@ -64,16 +64,16 @@
 "68" : ["econ"],
 "69" : ["econ"],
 "70" : ["econ"],
-"71" : ["educ"],
+"71" : ["econ"],
 "72" : ["econ"],
 "73" : ["econ"],
-"74" : ["econ"],
+"74" : ["econ","intr"],
 "75" : ["econ"],
 "76" : ["econ"],
 "77" : ["econ"],
 "78" : ["econ"],
 "79" : ["gove"],
-"80" : ["gove"],
+"80" : ["gove","econ"],
 "81" : ["gove"],
 "82" : ["gove"],
 "83" : ["envi"],
@@ -91,7 +91,9 @@
 "95" : ["educ"],
 "97" : ["gove"],
 "98" : ["gove"],
-"104" : ["agri"],
+"100" : ["gove","intr"],
+"101" : ["gove"],
+"104" : ["gove","regi"],
 "105" : ["regi"],
 "106" : ["regi"],
 "108" : ["econ"],
@@ -101,7 +103,7 @@
 "115" : ["agri"],
 "116" : ["soci"],
 "117" : ["econ"],
-"122" : ["econ"],
+"122" : ["gove","intr"],
 "124" : ["econ"],
 "127" : ["agri"],
 "128" : ["agri"],
diff --git a/ckanext/odsh/harvesters/statistikamtnordharvester.py b/ckanext/odsh/harvesters/statistikamtnordharvester.py
index 50a082a6..64ffbc98 100755
--- a/ckanext/odsh/harvesters/statistikamtnordharvester.py
+++ b/ckanext/odsh/harvesters/statistikamtnordharvester.py
@@ -225,7 +225,7 @@ class StatistikamtNordHarvester(ODSHBaseHarvester):
                 resource_file = urllib2.urlopen(resource['url'])
                 resource_dict['file_size'] = resource_file['Content-Length']
             else:
-                file_size = int(round(float(resource['Dateigroesse']) * 1000000000))
+                file_size = int(round(float(resource['Dateigroesse']) * 1048576 ))
                 resource_dict['size'] = file_size
             package_dict['resources'].append(resource_dict)
 
diff --git a/ckanext/odsh/helper_pkg_dict.py b/ckanext/odsh/helper_pkg_dict.py
new file mode 100644
index 00000000..912b0b83
--- /dev/null
+++ b/ckanext/odsh/helper_pkg_dict.py
@@ -0,0 +1,197 @@
+import re
+
+import ckanext.odsh.helpers as helpers_odsh
+import datetime
+
+import ckanext.odsh.helpers_tpsh as helpers_tpsh
+import ckanext.odsh.collection.helpers as helpers_collection
+
+import ckanext.odsh.uri_store as uri_store
+
+from ckanext.odsh.pretty_daterange.date_range_formatter import DateRangeFormatter
+
+import logging
+log = logging.getLogger(__name__)
+
+
+class HelperPgkDict(object):
+    '''
+    a convenience class for all operations related to pkg_dict
+    aka dataset_dict, dict_pkg ...
+    '''
+    def __init__(self, pkg_dict):
+        self.pkg_dict = pkg_dict
+    
+    def is_collection(self):
+        '''
+        return True if self.pkg_dict['type'] is collection,
+        false otherwise
+        '''
+        dataset_type = self.pkg_dict.get(u'type')
+        return dataset_type == 'collection'
+    
+    def shall_be_part_of_collection(self):
+        '''
+        return the flag 'add_to_collection',
+        this one is set by ODSHDCATdeProfile._mark_for_adding_to_ckan_collection
+        '''
+        shall_be_part_of_collection = self.pkg_dict.get('add_to_collection')
+        return shall_be_part_of_collection
+    
+    def update_relations_to_collection_members(self):
+        '''
+        update a collection's relationships to its members
+
+        '''
+
+        id_collection = self.pkg_dict.get('id')
+        uris_collection_members = self.get_uris_collection_members()
+        ckan_ids_collection_members = [self.get_id_from_store(uri) for uri in uris_collection_members]
+        for id_pkg in ckan_ids_collection_members:
+            helpers_tpsh.add_pkg_to_collection(id_pkg, id_collection)
+            log.info('Added package with id {} to collection with id {}'.format(id_pkg, id_collection))
+    
+    def get_uris_collection_members(self):
+        '''
+        get the uris of a collection's members
+        
+        Returns:
+            list of uris taken from the 'has_version' in in self.pkg_dict['extras']
+        '''
+        extras = self.pkg_dict.get('extras')
+        uris_collection_members_as_string = helpers_odsh.odsh_extract_value_from_extras(
+            extras, 'has_version'
+        )
+        uris_collection_members_as_string_cleaned = re.sub(
+            r'[\"\[\] ]',
+            '',
+            uris_collection_members_as_string,
+            0, 0,
+        )
+        uris_collection_members = uris_collection_members_as_string_cleaned.split(',')
+        return uris_collection_members
+
+    
+    def update_relation_to_collection(self):
+        '''
+        update a package's relation to its collection
+        '''
+        id_pkg = self.pkg_dict.get('id')
+        uri_collection = self.get_collection_uri()
+        id_collection = uri_store.get_id_from_uri(uri_collection)
+        helpers_tpsh.add_pkg_to_collection(id_pkg, id_collection)
+        log.info('Added package with id {} to collection with id {}'.format(id_pkg, id_collection))
+    
+
+    def get_collection_uri(self):
+        '''
+        return the collection uri stored in 'extras
+        '''
+        extras = self.pkg_dict.get('extras')
+        uri_collection = helpers_odsh.odsh_extract_value_from_extras(
+            extras, 'is_version_of'
+        )
+        if uri_collection:
+            uri_collection_cleaned = re.sub(
+                r'[\"\[\] ]',
+                '',
+                uri_collection,
+                0, 0,
+            )
+            return uri_collection_cleaned
+        return None
+    
+
+    def get_collection_id(self):
+        '''
+        construct a collection uri from the id of 
+        the containing collection
+        '''
+        package_name = self.pkg_dict.get('name')
+        collection_name = helpers_collection.get_collection_name_by_dataset(package_name)
+        collection_dict = helpers_collection.get_package_dict(collection_name)
+        collection_id = collection_dict.get('id')
+        return collection_id
+
+    
+    def add_uri_to_store(self):
+        '''
+        store pair of uri and id for subsequent use
+        '''
+        uri_store.add_uri(self.pkg_dict)
+    
+    @staticmethod
+    def get_id_from_store(uri):
+        '''
+        get id from known uri
+        '''
+        id = uri_store.get_id_from_uri(uri)
+        return id
+
+    def is_package_new(self):
+        date_package_created_as_str = self._get_date_of_package_creation_from_pkg_dict()
+        if date_package_created_as_str == None:
+            is_new = False
+        else:
+            date_package_created = self._get_date_from_string(date_package_created_as_str)
+            if date_package_created == None:
+                is_new = False
+            else:
+                is_new = helpers_odsh.is_within_last_month(date_package_created)
+        return is_new
+    
+    def _get_date_of_package_creation_from_pkg_dict(self):
+        if 'extras' in self.pkg_dict:
+            extras = self.pkg_dict['extras']
+            issued = helpers_odsh.odsh_extract_value_from_extras(extras=extras, key='issued') # is None if issued not in extras
+            return issued
+        else:
+            return None
+        
+    @staticmethod
+    def _get_date_from_string(date_time_str):
+        date_time_format = '%Y-%m-%dT%H:%M:%S' #e.g. u'2019-06-12T11:56:25'
+        try:
+            date_time = datetime.datetime.strptime(date_time_str, date_time_format)
+            date = date_time.date()
+        except (ValueError, TypeError):
+            # if date cannot be converted from string return None
+            date = None
+        return date
+
+    def get_prettified_daterange(self):
+        date_start, date_end = self._get_date_start_and_end_from_pkg_dict()
+        prettified_daterange = self._construct_prettified_daterange(date_start, date_end)
+        return prettified_daterange
+    
+    @staticmethod
+    def _construct_prettified_daterange(date_start, date_end):
+        try:
+            prettified_daterange = DateRangeFormatter(date_start, date_end).get_formatted_str()
+        except ValueError as err:
+            log.warning(err.message)
+            return '-'
+        return prettified_daterange
+    
+    def _get_date_start_and_end_from_pkg_dict(self):
+        if 'extras' in self.pkg_dict:
+            extras = self.pkg_dict['extras']
+            date_start_as_str, date_end_as_str = (
+                helpers_odsh.odsh_extract_value_from_extras(
+                    extras=extras, key=key)
+                for key in ('temporal_start', 'temporal_end')
+            )
+            date_start = self._get_date_from_string(date_start_as_str)
+            date_end = self._get_date_from_string(date_end_as_str)
+        else:
+            date_start = None
+            date_end = None
+        return date_start, date_end
+
+
+def get_daterange_prettified(pkg_dict):
+    '''
+    wrapper function to use as a template helper
+    '''
+    daterange_prettified = HelperPgkDict(pkg_dict).get_prettified_daterange()
+    return daterange_prettified
\ No newline at end of file
diff --git a/ckanext/odsh/helpers.py b/ckanext/odsh/helpers.py
index 4acbb190..672ff820 100644
--- a/ckanext/odsh/helpers.py
+++ b/ckanext/odsh/helpers.py
@@ -1,9 +1,13 @@
+# encoding: utf-8
+
 import logging
 import traceback
 import ast
 import ckan.plugins.toolkit as toolkit
 import ckan.logic as logic
 import ckan.model as model
+import ckan.logic.action as action
+import ckan.lib.helpers as helpers
 import json
 from ckan.common import c
 import datetime
@@ -18,6 +22,7 @@ from ckan.common import request
 import pdb
 from urlparse import urlsplit, urlunsplit
 import subprocess
+import ckan.lib.helpers as helpers
 
 get_action = logic.get_action
 log = logging.getLogger(__name__)
@@ -116,7 +121,7 @@ def extend_search_convert_local_to_utc_timestamp(str_timestamp):
         return None 
 
     if not re.match(r'\d\d\d\d-\d\d-\d\d', str_timestamp):
-        raise 'wrong format'
+        raise ValueError('wrong format')
     
     dt = parser.parse(str_timestamp, dayfirst=False).isoformat()
 
@@ -268,6 +273,59 @@ def odsh_is_slave():
     return 1 if c == 'True' else 0
 
 
+def odsh_get_facet_items_dict(name, limit=None):
+    '''
+    Gets all facets like 'get_facet_items_dict' but sorted alphabetically
+    instead by count.
+    '''
+    if name == 'groups':
+        limit = 20
+    facets = helpers.get_facet_items_dict(name, limit)
+    facets.sort(key=lambda it: (it['display_name'].lower(), -it['count']))
+    return facets
+
+
+def odsh_main_groups():
+    '''Return a list of the groups to be shown on the start page.'''
+
+    # Get a list of all the site's groups from CKAN, sorted by number of
+    # datasets.
+    groups = toolkit.get_action('group_list')(
+        data_dict={'all_fields': True})
+
+    return groups
+
+
+def odsh_now():
+    return helpers.render_datetime(datetime.datetime.now(), "%Y-%m-%d")
+
+
+def odsh_group_id_selected(selected, group_id):
+    if type(selected) is not list:
+        selected = [selected]
+    for g in selected:
+        if (isinstance(g, basestring) and group_id == g) or (type(g) is dict and group_id == g['id']):
+            return True
+
+    return False
+
+
+def odsh_remove_route(map, routename):
+    route = None
+    for i, r in enumerate(map.matchlist):
+
+        if r.name == routename:
+            route = r
+            break
+    if route is not None:
+        map.matchlist.remove(route)
+        for key in map.maxkeys:
+            if key == route.maxkeys:
+                map.maxkeys.pop(key)
+                map._routenames.pop(route.name)
+                break
+
+
 def is_within_last_month(date, date_ref=None):
     '''
     date is a datetime.date object containing the date to be checked
@@ -293,3 +351,105 @@ def is_within_last_month(date, date_ref=None):
     if date > one_month_ago:
         return True
     return False
+
+def tpsh_get_all_datasets_belonging_to_collection(context, collection_name):
+    rel_collection_dict = dict({"id": collection_name})
+    name_list = list()
+    try:
+        list_rel_collection = get_action('package_relationships_list')(context, rel_collection_dict)
+    except AssertionError:
+        #if there does not exist an relationship, returns an empty list
+        return name_list 
+    for item in list_rel_collection:
+        item_object = item.get('object') 
+        name_list.append(item_object)
+    return name_list
+
+def tpsh_get_all_datasets_belonging_to_collection_by_dataset(context, dataset_name):
+    collection_name = tpsh_get_collection_name_by_dataset(context, dataset_name)
+    if collection_name:
+        name_list = tpsh_get_all_datasets_belonging_to_collection(context, collection_name)
+        return name_list
+    return list()
+
+def tpsh_get_collection_name_by_dataset(context, dataset_name):
+    rel_dataset_dict = dict({"id" : dataset_name})
+    list_rel_dataset = toolkit.get_action('package_relationships_list')(context, rel_dataset_dict)
+    if not len(list_rel_dataset):
+        return None    
+    collection_name = list_rel_dataset[0]['object']
+    return collection_name
+
+def tpsh_get_successor_and_predecessor_dataset(context, pkg_dict):
+    dataset_name = pkg_dict.get('name')
+    siblings_dicts_with_access = _get_siblings_dicts_with_access(context, pkg_dict)
+    if siblings_dicts_with_access:
+        n_siblings = len(siblings_dicts_with_access)
+        siblings_dicts_sorted_by_date_issued = _sort_siblings_by_name_and_date(siblings_dicts_with_access)
+        siblings_names_sorted_by_date_issued = [d['name'] for d in siblings_dicts_sorted_by_date_issued]
+        id_current_dataset = siblings_names_sorted_by_date_issued.index(dataset_name)
+        predecessor_name = (
+            siblings_names_sorted_by_date_issued[id_current_dataset-1] if (id_current_dataset > 0) 
+            else None
+        )
+        successor_name = (
+            siblings_names_sorted_by_date_issued[id_current_dataset+1] if (id_current_dataset < n_siblings-1) 
+            else None
+        )
+    else:
+        predecessor_name, successor_name = None, None
+    return successor_name, predecessor_name
+
+def _get_siblings_dicts_with_access(context, pkg_dict):
+    dataset_name = pkg_dict.get('name')
+    list_of_siblings = tpsh_get_all_datasets_belonging_to_collection_by_dataset(context, dataset_name)
+    n_siblings = len(list_of_siblings)
+    if n_siblings>0:
+        siblings_dicts = [get_package_dict(name) for name in list_of_siblings]
+        user_has_access = lambda pkg_dict:helpers.check_access('package_show', pkg_dict)
+        siblings_dicts_with_access = filter(user_has_access, siblings_dicts)
+        return siblings_dicts_with_access
+    return None
+
+    
+def _sort_siblings_by_name_and_date(siblings_dicts):
+    '''
+    sort by name first and then by date to have a fallback if dates are the same
+    '''
+    _get_name = lambda pkg_dict:pkg_dict.get('name')
+    _get_issued = lambda pkg_dict:odsh_extract_value_from_extras(pkg_dict.get('extras'), 'issued')
+    siblings_dicts_sorted_by_name = sorted(siblings_dicts, key=_get_name)
+    siblings_dicts_sorted_by_date_issued = sorted(siblings_dicts_sorted_by_name, key=_get_issued)
+    return siblings_dicts_sorted_by_date_issued
+
+
+def get_package_dict(name):
+    return model.Package.get(name).as_dict()
+
+def tpsh_get_successor_and_predecessor_urls(context, pkg_dict):
+    successor_name, predecessor_name = tpsh_get_successor_and_predecessor_dataset(context, pkg_dict)
+    successor_url, predecessor_url = (
+        helpers.url_for(controller='package', action='read', id=name)
+        if name is not None
+        else None
+        for name in (successor_name, predecessor_name)
+    )
+    return successor_url, predecessor_url
+
+def short_name_for_category(category_name):
+    translations = {
+        'soci': u'Bevölkerung',
+        'educ': u'Bildung',
+        'ener': u'Energie',
+        'heal': u'Gesundheit',
+        'intr': u'Internationales',
+        'just': u'Justiz',
+        'agri': u'Landwirtschaft',
+        'gove': u'Regierung',
+        'regi': u'Regionales',
+        'envi': u'Umwelt',
+        'tran': u'Verkehr',
+        'econ': u'Wirtschaft',
+        'tech': u'Wissenschaft',
+    }
+    return translations.get(category_name)
diff --git a/ckanext/odsh/helpers_tpsh.py b/ckanext/odsh/helpers_tpsh.py
new file mode 100644
index 00000000..608c9101
--- /dev/null
+++ b/ckanext/odsh/helpers_tpsh.py
@@ -0,0 +1,211 @@
+# encoding: utf-8
+
+import csv
+import datetime
+import logging
+from string import lower
+import json
+import re
+import urllib2
+from collections import OrderedDict
+
+from ckan.common import config
+import ckan.lib.helpers as helpers
+import ckan.logic.action.create as create
+import ckan.model as model
+import ckan.plugins.toolkit as toolkit
+
+
+import ckanext.odsh.helpers as odsh_helpers
+
+log = logging.getLogger(__name__)
+
+CKAN_TYPES = {'http://dcat-ap.de/def/datasetTypes/collection': 'collection'}
+
+
+def map_dct_type_to_ckan_type(dct_type):
+    '''
+    matches the field dct:type from a harvested rdf file 
+    to the corresponding ckan package type
+    '''
+    ckan_type = CKAN_TYPES.get(dct_type)
+    return ckan_type
+
+def map_ckan_type_to_dct_type(ckan_type):
+    DCT_TYPES = _revert_dict(CKAN_TYPES)
+    dct_type = DCT_TYPES.get(ckan_type)
+    return dct_type
+
+def _revert_dict(d):
+    d_inverse = {v: k for k, v in d.iteritems()}
+    return d_inverse
+
+def add_pkg_to_collection(id_pkg, id_collection):
+    if id_pkg and id_collection:
+        relationship_dict = {
+            'subject': id_pkg,
+            'object': id_collection,
+            'type': 'child_of',
+        }
+        toolkit.get_action('package_relationship_create')(None, relationship_dict)
+
+def use_matomo():
+    '''Return the value of the use_matomo config setting.
+
+    To enable using matomo, add this line to the
+    [app:main] section of your CKAN config file::
+
+      ckanext.odsh.use_matomo = True
+
+    Returns ``False`` by default, if the setting is not in the config file.
+
+    :rtype: bool
+
+    '''
+    value = config.get('ckanext.odsh.use_matomo', False)
+    value = toolkit.asbool(value)
+    return value
+
+def correct_missing_relationship(pkg_dict, pkg_relationships_from_model):
+    '''
+    This function corrects missing relationship in show package.
+    Note this fix is only good with one or non relationship. 
+    This error is well known but was not fixed. https://github.com/ckan/ckan/issues/3114
+    The error causes the deletation of relationships, because package_show is
+    used in resource_create to get the package. 
+    '''
+    if pkg_relationships_from_model:
+        relationship_from_model = pkg_relationships_from_model[0]
+        relationship_list_from_dict = pkg_dict.get('relationships_as_subject')
+        type_pkg = pkg_dict.get('type')
+        needs_update = type_pkg == 'dataset' and not relationship_list_from_dict
+        if needs_update:
+            relationship_for_package = {
+                '__extras': {
+                    'object_package_id': relationship_from_model.object_package_id,
+                    'revision_id': relationship_from_model.revision_id,
+                    'subject_package_id': relationship_from_model.subject_package_id,
+                },
+                'comment': relationship_from_model.subject_package_id,
+                'id': relationship_from_model.id,
+                'type': relationship_from_model.type,
+            }
+            pkg_dict['relationships_as_subject'].append(relationship_for_package) 
+    return pkg_dict
+
+def get_pkg_relationships_from_model(pkg_dict):
+    pkg_id = pkg_dict.get('id')
+    return model.Package.get(pkg_id).get_relationships()
+
+def load_language_mapping():
+    with open(config.get('ckanext.odsh.language_mapping')) as language_mapping_json:
+        LANGUAGE_MAPPING = json.loads(language_mapping_json.read())
+    return LANGUAGE_MAPPING
+
+def load_json_to_ordered_dict(json_str):
+    return json.loads(json_str, object_pairs_hook=OrderedDict)
+
+def load_subject_mapping():
+    with open(config.get('ckanext.odsh.subject_mapping')) as subject_mapping_json:
+        SUBJECT_MAPPING = load_json_to_ordered_dict(subject_mapping_json.read())
+    return SUBJECT_MAPPING
+
+def get_language_of_package(pkg_dict):
+    LANGUAGE_MAPPING = load_language_mapping()
+    language_id = _get_language_id(pkg_dict)
+    if not language_id:
+        return None
+    language = LANGUAGE_MAPPING.get(language_id)
+    return language
+
+def get_language_icon(pkg_dict):
+    ICONS = {
+        "http://publications.europa.eu/resource/authority/language/DAN": '/base/images/icon_lang_danish.png',
+        "http://publications.europa.eu/resource/authority/language/ENG": '/base/images/icon_lang_english.png',
+    }
+    language_id = _get_language_id(pkg_dict)
+    if not language_id:
+        return None
+    return ICONS.get(language_id) 
+
+def _get_language_id(pkg_dict):
+    language_id = odsh_helpers.odsh_extract_value_from_extras(pkg_dict.get('extras'), 'language')
+    language_id = pkg_dict.get('language')
+    if not language_id:
+        language_id = odsh_helpers.odsh_extract_value_from_extras(
+            pkg_dict.get('extras'), 'language'
+        )
+    if not language_id:
+        return None
+    language_id_cleaned = re.sub('[\[\]\"]', '', language_id)
+    return language_id_cleaned
+
+def get_spatial_for_selection():
+    mapping_path = config.get('ckanext.odsh.spatial.mapping')
+    try:
+        mapping_file = urllib2.urlopen(mapping_path)
+    except urllib2.URLError:
+        log.error('Could not load spatial mapping file')
+        raise
+    cr = csv.reader(mapping_file, delimiter="\t")
+    spatial_mapping = list()
+    for row in cr:
+        key  = row[0].decode('UTF-8')
+        value = row[1].decode('UTF-8')
+        spatial_mapping.append({'key':key, 'value':value}) 
+    spatial_mapping.append({'key':'', 'value':''})   
+    return spatial_mapping
+
+def get_subject_for_selection():
+    SUBJECT_MAPPING = load_subject_mapping()
+    dict_for_select_box = [{'key': 'empty', 'value':' '}, ]
+    dict_for_select_box.extend(
+        [{'key': key, 'value': SUBJECT_MAPPING[key]} for key in SUBJECT_MAPPING]
+    )
+    return dict_for_select_box
+
+def get_language_for_selection():
+    LANGUAGE_MAPPING = load_language_mapping()
+    dict_for_select_box = [{'key': key, 'value': LANGUAGE_MAPPING[key]} for key in LANGUAGE_MAPPING]
+    return dict_for_select_box
+
+def get_package_dict(name):
+    return model.Package.get(name).as_dict()
+
+def size_of_fmt(num, suffix='B'):
+    for unit in ['',' k',' M',' G',' T',' P',' E',' Z']:
+        if abs(num) < 1000.0:
+            return "%3.1f%s%s" % (num, unit, suffix)
+        num /= 1000.0
+    return "%.1f%s%s" % (num, 'Y', suffix)
+
+def get_resource_size(resource):
+    resource_size = resource.get('size')
+    if resource_size:
+        return size_of_fmt(resource_size)    
+
+
+def get_address_org(organization):
+    list_extras = organization.get('extras')
+    address = dict()
+    if not list_extras:
+        return address
+    for extra in list_extras:
+            address.update({extra.get('key'):extra.get('value')})
+    web = address.get('web')
+    if web and not web.startswith('http'):
+         web = 'http://' + web
+         address.update({'web':web})    
+    return address
+
+
+def get_body_mail(organization, package):
+    package_name = package.get('name')
+    url = helpers.url_for(controller='package', action='read', id=package_name, qualified = True)
+    title = package.get('title')
+    anrede = "Sehr geehrte Damen und Herren," + "%0D%0A" +  "%0D%0A" + "zu folgendem Eintrag habe ich eine Anmerkung/Frage:" + "%0D%0A" + "%0D%0A" 
+    mail_titel = "Titel: " + title + "%0D%0A"    
+    mail_document = "Dokument-ID: " +  package_name + "%0D%0A"
+    mail_url = "URL: " +  url + "%0D%0A"  +  "%0D%0A" 
+    message =  mail_titel + mail_document  +  mail_url + "Mein Kommentar:" +  "%0D%0A"    +  "%0D%0A"  +  "%0D%0A"  +  "%0D%0A" 
+    return anrede + message
\ No newline at end of file
diff --git a/ckanext/odsh/i18n/ckanext-odsh.pot b/ckanext/odsh/i18n/ckanext-odsh.pot
index 1885142a..32e57994 100644
--- a/ckanext/odsh/i18n/ckanext-odsh.pot
+++ b/ckanext/odsh/i18n/ckanext-odsh.pot
@@ -1,14 +1,14 @@
 # Translations template for ckanext-odsh.
-# Copyright (C) 2018 ORGANIZATION
+# Copyright (C) 2019 ORGANIZATION
 # This file is distributed under the same license as the ckanext-odsh project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
 #
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: ckanext-odsh 0.0.1\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2018-09-28 13:50+0000\n"
+"POT-Creation-Date: 2019-10-08 12:09+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,151 +17,1154 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 2.3.4\n"
 
-#: ckanext/odsh/plugin.py:52
-msgid "Groups"
+#: ckanext/odsh/plugin.py:158 ckanext/odsh/plugin.py:165 ckanext/odsh/plugin.py:171
+msgid "Herausgeber"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:43
-msgid "Search Datasets"
+#: ckanext/odsh/plugin.py:159 ckanext/odsh/plugin.py:168 ckanext/odsh/plugin.py:174
+msgid "Kategorie"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:46
-msgid "Search"
+#: ckanext/odsh/plugin.py:160
+msgid "Informationsgegenstand"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:65
+#: ckanext/odsh/plugin.py:161
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:223
+msgid "Tags"
+msgstr ""
+
+#: ckanext/odsh/plugin.py:166 ckanext/odsh/plugin.py:172
+msgid "Dateiformat"
+msgstr ""
+
+#: ckanext/odsh/plugin.py:167 ckanext/odsh/plugin.py:173
+msgid "Lizenz"
+msgstr ""
+
+#: ckanext/odsh/validation.py:261
+#, python-format
+msgid "Tag \"%s\" must be alphanumeric characters or symbols: -_.:()"
+msgstr ""
+
+#: ckanext/odsh/validation.py:312
+msgid "Subject must be a known URI."
+msgstr ""
+
+#: ckanext/odsh/validation.py:334
+msgid "Subject must not be empty."
+msgstr ""
+
+#: ckanext/odsh/fanstatic/moment.js:6
+msgid "Weeks"
+msgstr ""
+
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:63
+msgid "Link"
+msgstr ""
+
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:64
+msgid "Link to a URL on the internet (you can also link to an API)"
+msgstr ""
+
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:71
+#: ckanext/odsh/templates/header.html:56
+msgid "Upload"
+msgstr ""
+
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:75
+#: ckanext/odsh/templates/macros/form.html:342
+msgid "Remove"
+msgstr ""
+
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:83
+#: ckanext/odsh/templates/macros/form.html:528
+msgid "Image"
+msgstr ""
+
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:90
+msgid "Upload a file on your computer"
+msgstr ""
+
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:115
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:186
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:18
+#: ckanext/odsh/templates/package/snippets/resource_form.html:33
+msgid "URL"
+msgstr ""
+
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:125
+#: ckanext/odsh/fanstatic/odsh_image-upload.js:221
+msgid "File"
+msgstr ""
+
+#: ckanext/odsh/templates/error_document_template.html:3
+#, python-format
+msgid "Error %(error_code)s"
+msgstr ""
+
+#: ckanext/odsh/templates/header.html:47 ckanext/odsh/templates/home/index.html:7
 msgid "Start"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:66
-msgid "Datasets"
+#: ckanext/odsh/templates/header.html:48
+msgid "Dokumente"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:67
-#: ckanext/odsh/templates/snippets/package_item.html:82
-msgid "Organizations"
+#: ckanext/odsh/templates/header.html:49
+msgid "Infos"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/base.html:12
+#: ckanext/odsh/templates/datarequests/close.html:6
+#: ckanext/odsh/templates/datarequests/edit.html:6
+#: ckanext/odsh/templates/datarequests/new.html:6
+msgid "Data Proposal"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/close.html:3
+#: ckanext/odsh/templates/datarequests/close.html:8
+#: ckanext/odsh/templates/datarequests/close.html:12
+msgid "Close Data Proposal"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:18
+#: ckanext/odsh/templates/datarequests/show.html:15
+#: ckanext/odsh/templates/organization/read_base.html:18
+#: ckanext/odsh/templates/package/resource_read.html:31
+msgid "Manage"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:22
+#: ckanext/odsh/templates/datarequests/show.html:19
+msgid "Close"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:37
+#: ckanext/odsh/templates/datarequests/snippets/comment_form.html:25
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_item.html:38
+msgid "Add New Comment"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:53
+msgid "Released"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:54
+msgid "Suggester"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:54
+msgid "None"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:56
+msgid "Status"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:60
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_item.html:13
+msgid "Done"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/comment.html:64
+#: ckanext/odsh/templates/datarequests/show.html:40
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_item.html:17
+msgid "Open"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/edit.html:3
+#: ckanext/odsh/templates/datarequests/edit.html:8
+#: ckanext/odsh/templates/datarequests/edit.html:12
+msgid "Edit Data Proposal"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/index.html:8
+msgid "Search Data Requests..."
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/index.html:12
+msgid "Add Request"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/new.html:3
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_form.html:33
+msgid "Create Data Request"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/new.html:7
+msgid "Create Data Proposal"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/new.html:11
+msgid "Create New Data Request"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/show.html:3
+#: ckanext/odsh/templates/datarequests/show.html:25
+msgid "Data Request"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/show.html:8
+msgid "Data Requests"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/show.html:35
+msgid "Closed"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/show.html:64
+#: ckanext/odsh/templates/datarequests/snippets/comments.html:11
+msgid "This data request has not been commented yet"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:68
-msgid "Info"
+#: ckanext/odsh/templates/datarequests/snippets/comment_form.html:17
+msgid "Add a new Comment"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:5
+#: ckanext/odsh/templates/datarequests/snippets/comment_form.html:22
+msgid "Cancel"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/snippets/comment_form.html:23
+msgid "Update Comment"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/snippets/comments.html:3
+msgid "Comments"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_form.html:17
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:9
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:13
 msgid "Title"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:17
-msgid "URL"
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_form.html:17
+msgid "eg. Data Request Name"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:23
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_form.html:21
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:20
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:27
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:32
 msgid "Description"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:33
-#: ckanext/odsh/templates/package/snippets/package_metadata_fields.html:18
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_form.html:21
+msgid "eg. Data Request description"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_form.html:29
+msgid "Are you sure you want to delete this data request?"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_form.html:30
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:60
+#: ckanext/odsh/templates/package/edit_view.html:19
+#: ckanext/odsh/templates/package/snippets/package_form.html:32
+#: ckanext/odsh/templates/package/snippets/resource_form.html:96
+msgid "Delete"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_list.html:11
+msgid "No Data Requests found with the given criteria"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/snippets/datarequest_list.html:13
+#: ckanext/odsh/templates/organization/index.html:50
+msgid "How about creating one?"
+msgstr ""
+
+#: ckanext/odsh/templates/datarequests/snippets/new_datarequest_form.html:7
+msgid "Suggest New Data Request"
+msgstr ""
+
+#: ckanext/odsh/templates/home/index.html:4
+msgid "Welcome"
+msgstr ""
+
+#: ckanext/odsh/templates/macros/form.html:374
+msgid "Custom"
+msgstr ""
+
+#: ckanext/odsh/templates/macros/form.html:374
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:59
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:94
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:249
 msgid "This field is required"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:34
-#: ckanext/odsh/templates/snippets/package_item.html:83
-msgid "License"
+#: ckanext/odsh/templates/macros/form.html:510
+msgid "Required field"
+msgstr ""
+
+#: ckanext/odsh/templates/macros/form.html:526
+msgid "http://example.com/my-image.jpg"
+msgstr ""
+
+#: ckanext/odsh/templates/macros/form.html:527
+msgid "Image URL"
+msgstr ""
+
+#: ckanext/odsh/templates/macros/form.html:544
+msgid "Clear Upload"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/index.html:3
+#: ckanext/odsh/templates/organization/index.html:6
+#: ckanext/odsh/templates/organization/index.html:33
+#: ckanext/odsh/templates/organization/read_base.html:3
+#: ckanext/odsh/templates/organization/read_base.html:6
+#: ckanext/odsh/templates/package/base.html:14
+msgid "Organizations"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/index.html:17
+msgid "Search organizations"
 msgstr ""
 
+#: ckanext/odsh/templates/organization/index.html:30
+msgid "Add Organization"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/index.html:37
+msgid "Search organizations..."
+msgstr ""
+
+#: ckanext/odsh/templates/organization/index.html:48
+msgid "There are currently no organizations for this site"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:5
+msgid "Add Dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:27
+#: ckanext/odsh/templates/snippets/search_form.html:11
+msgid "Relevance"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:28
+#: ckanext/odsh/templates/snippets/search_form.html:6
+#: ckanext/odsh/templates/snippets/search_form.html:12
+msgid "Name Ascending"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:29
+#: ckanext/odsh/templates/snippets/search_form.html:6
+#: ckanext/odsh/templates/snippets/search_form.html:13
+msgid "Name Descending"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:30
+#: ckanext/odsh/templates/snippets/search_form.html:14
+msgid "Issued Ascending"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:31
+#: ckanext/odsh/templates/snippets/search_form.html:15
+msgid "Issued Descending"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:32
+#: ckanext/odsh/templates/snippets/package_item.html:90
+#: ckanext/odsh/templates/snippets/search_form.html:20
+msgid "Popular"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:36
+#: ckanext/odsh/templates/snippets/search_form.html:3
+msgid "Search datasets..."
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read.html:37
+#: ckanext/odsh/templates/package/base.html:7
+#: ckanext/odsh/templates/package/base.html:17
+#: ckanext/odsh/templates/package/read.html:17
+#: ckanext/odsh/templates/package/read.html:22
+#: ckanext/odsh/templates/package/search.html:5
+#: ckanext/odsh/templates/snippets/organization.html:59
+msgid "Documents"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/read_base.html:29
+#: ckanext/odsh/templates/snippets/organization.html:47
+msgid "There is no description for this organization"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:10
+#: ckanext/odsh/templates/package/snippets/resource_form.html:39
+msgid "Name"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:10
+msgid "My Organization"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:18
+msgid "my-organization"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:20
+msgid "A little information about my organization..."
+msgstr ""
+
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:35
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:48
+msgid "Custom Field"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:60
+msgid ""
+"Are you sure you want to delete this Organization? This will delete all the "
+"public and private datasets belonging to this organization."
+msgstr ""
+
+#: ckanext/odsh/templates/organization/snippets/organization_form.html:63
+msgid "Save Organization"
+msgstr ""
+
+#: ckanext/odsh/templates/organization/snippets/organization_item.html:15
+#: ckanext/odsh/templates/snippets/package_item.html:75
+msgid "View {organization_name}"
+msgstr ""
+
+#: ckanext/odsh/templates/package/base.html:22
+msgid "Dokuments"
+msgstr ""
+
+#: ckanext/odsh/templates/package/base.html:23
+#: ckanext/odsh/templates/package/read.html:23
+msgid "Create Dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/edit_base.html:10
+#: ckanext/odsh/templates/package/resource_edit.html:3
+#: ckanext/odsh/templates/package/resource_edit_base.html:12
+msgid "Edit"
+msgstr ""
+
+#: ckanext/odsh/templates/package/edit_base.html:12
+#: ckanext/odsh/templates/package/new_package_form.html:8
+#: ckanext/odsh/templates/package/snippets/resource_form.html:14
+msgid "odsh Create Dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/edit_base.html:26
+#: ckanext/odsh/templates/package/resource_edit_base.html:28
+#: ckanext/odsh/templates/package/snippets/resource_form.html:86
+msgid "back"
+msgstr ""
+
+#: ckanext/odsh/templates/package/edit_view.html:3
+#: ckanext/odsh/templates/package/edit_view.html:4
+#: ckanext/odsh/templates/package/edit_view.html:8
+#: ckanext/odsh/templates/package/edit_view.html:12
+msgid "Edit view"
+msgstr ""
+
+#: ckanext/odsh/templates/package/edit_view.html:21
+#: ckanext/odsh/templates/package/new_view.html:31
+#: ckanext/odsh/templates/package/read.html:81
+msgid "Preview"
+msgstr ""
+
+#: ckanext/odsh/templates/package/edit_view.html:22
+msgid "Update"
+msgstr ""
+
+#: ckanext/odsh/templates/package/new_package_form.html:18
+msgid "next"
+msgstr ""
+
+#: ckanext/odsh/templates/package/new_package_form.html:20
+msgid "Update Dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/new_resource.html:5
+msgid "Add data to the dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/new_resource.html:11
+#: ckanext/odsh/templates/package/new_resource_not_draft.html:8
+msgid "Add New Resource"
+msgstr ""
+
+#: ckanext/odsh/templates/package/new_resource_not_draft.html:3
+#: ckanext/odsh/templates/package/new_resource_not_draft.html:4
+msgid "Add resource"
+msgstr ""
+
+#: ckanext/odsh/templates/package/new_view.html:3
+#: ckanext/odsh/templates/package/new_view.html:4
+#: ckanext/odsh/templates/package/new_view.html:8
+#: ckanext/odsh/templates/package/new_view.html:12
+msgid "Add view"
+msgstr ""
+
+#: ckanext/odsh/templates/package/new_view.html:19
+msgid ""
+" Data Explorer views may be slow and unreliable unless the DataStore "
+"extension is enabled. For more information, please see the <a "
+"href='http://docs.ckan.org/en/latest/maintaining/data-viewer.html#viewing-"
+"structured-data-the-data-explorer'         target='_blank'>Data Explorer "
+"documentation</a>. "
+msgstr ""
+
+#: ckanext/odsh/templates/package/new_view.html:32
+#: ckanext/odsh/templates/package/snippets/resource_form.html:111
+msgid "Add"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:35
+#: ckanext/odsh/templates/snippets/package_item.html:79
+msgid "Draft"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:38
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:279
+#: ckanext/odsh/templates/snippets/organization.html:25
+#: ckanext/odsh/templates/snippets/package_item.html:81
+msgid "Deleted"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:44
+msgid "Manage Dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:51
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:255
+#: ckanext/odsh/templates/snippets/package_item.html:70
+msgid "Private"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:62
+msgid "Publisher"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:101
+msgid "latest collection member"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:106
+#: ckanext/odsh/templates/package/read.html:111
+msgid "predecessor"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:116
+#: ckanext/odsh/templates/package/read.html:121
+msgid "successor"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_edit_base.html:32
+msgid "Edit resource"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:37
+msgid "View"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:39
+msgid "API Endpoint"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:41
+msgid "Go to resource"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:43
+msgid "Download"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:56
+#: ckanext/odsh/templates/package/resource_read.html:58
+msgid "URL:"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:66
+msgid "From the dataset abstract"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:68
+#, python-format
+msgid "Source: <a href=\"%(url)s\">%(dataset)s</a>"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:109
+msgid "There are no views created for this resource yet."
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:113
+msgid "Not seeing the views you were expecting?"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:115
+msgid "Click here for more information."
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:118
+msgid "Here are some reasons you may not be seeing expected views:"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:120
+msgid "No view has been created that is suitable for this resource"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:121
+msgid "The site administrators may not have enabled the relevant view plugins"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:122
+msgid ""
+"If a view requires the DataStore, the DataStore plugin may not be enabled, or"
+" the data may not have been pushed to the DataStore, or the DataStore hasn't "
+"finished processing the data yet"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:144
+msgid "Additional Information"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:148
+msgid "Field"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:149
+msgid "Value"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:154
+msgid "Data last updated"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:155
+#: ckanext/odsh/templates/package/resource_read.html:159
+#: ckanext/odsh/templates/package/resource_read.html:163
+#: ckanext/odsh/templates/package/resource_read.html:167
+msgid "unknown"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:158
+msgid "Metadata last updated"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:162
+msgid "Created"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:166
+#: ckanext/odsh/templates/package/snippets/resource_form.html:75
+#: ckanext/odsh/templates/package/snippets/resource_info.html:26
+msgid "Format"
+msgstr ""
+
+#: ckanext/odsh/templates/package/resource_read.html:170
+#: ckanext/odsh/templates/package/snippets/info.html:94
 #: ckanext/odsh/templates/package/snippets/package_basic_fields.html:93
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:99
+msgid "License"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:63
+#: ckanext/odsh/templates/package/snippets/info.html:72
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:142
+msgid "timerange"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:78
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:160
+#: ckanext/odsh/templates/snippets/search_form.html:117
+msgid "from"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:81
+msgid "date start"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:85
+#: ckanext/odsh/templates/package/search.html:100
+msgid "Date"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:89
+#: ckanext/odsh/templates/snippets/search_form.html:130
+msgid "wrong_start_date_for_search"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:93
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:174
+#: ckanext/odsh/templates/snippets/search_form.html:144
+msgid "to"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:96
+msgid "date end"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:104
+#: ckanext/odsh/templates/snippets/search_form.html:157
+msgid "wrong_end_date_for_search"
+msgstr ""
+
+#: ckanext/odsh/templates/package/search.html:107
+msgid "submit date search"
+msgstr ""
+
+#: ckanext/odsh/templates/package/view_edit_base.html:9
+msgid "All views"
+msgstr ""
+
+#: ckanext/odsh/templates/package/view_edit_base.html:12
+msgid "View view"
+msgstr ""
+
+#: ckanext/odsh/templates/package/view_edit_base.html:37
+msgid "View preview"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/info.html:27
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:85
+#: ckanext/odsh/templates/snippets/package_item.html:114
+msgid "subject"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/info.html:38
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:237
+msgid "language"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/info.html:50
+#: ckanext/odsh/templates/snippets/package_item.html:97
+msgid " category: "
+msgid_plural " categories: "
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/package/snippets/info.html:82
+#: ckanext/odsh/templates/snippets/package_item.html:115
+msgid "issued"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/info.html:87
+msgid "modified"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/info.html:110
+msgid "share this dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/info.html:125
+msgid "send an email"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:19
+msgid "Enter title"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:36
+msgid "Enter description"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:58
 msgid "Organization"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:97
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:66
 msgid "No organization"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:113
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:119
+#: ckanext/odsh/templates/user/snippets/login_form.html:23
+msgid "enter name"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:229
+msgid "odsh tags placeholder"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:243
+msgid "Spatial uri"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:248
+msgid "Visibility"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:255
+msgid "Public"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:269
 msgid "State"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:117
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:276
 msgid "Active"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:119
-#: ckanext/odsh/templates/snippets/package_item.html:49
-msgid "Deleted"
+#: ckanext/odsh/templates/package/snippets/package_form.html:31
+msgid "Are you sure you want to delete this dataset?"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_metadata_fields.html:47
-msgid "Visibility"
+#: ckanext/odsh/templates/package/snippets/package_form.html:38
+msgid "Next: Add Data"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_metadata_fields.html:50
-#: ckanext/odsh/templates/snippets/package_item.html:37
-msgid "Private"
+#: ckanext/odsh/templates/package/snippets/resource_form.html:30
+msgid "odsh_resource_upload_error_label"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_metadata_fields.html:50
-msgid "Public"
+#: ckanext/odsh/templates/package/snippets/resource_form.html:33
+msgid "Data-Upload"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:33
+msgid "http://example.com/external-data.csv"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:38
+msgid "odsh_resource_name_error_label"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:39
+msgid "Enter name of the dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:54
+msgid "Last Modified"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:54
+msgid "eg. 2012-06-05"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:57
+msgid "File Size"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:57
+msgid "eg. 1024"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:60
+#: ckanext/odsh/templates/package/snippets/resource_form.html:63
+msgid "MIME Type"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:60
+#: ckanext/odsh/templates/package/snippets/resource_form.html:63
+msgid "eg. application/json"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:73
+msgid "odsh_resource_format_error_label"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:75
+msgid "eg. CSV, XML or JSON"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:95
+msgid "Are you sure you want to delete this resource?"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_form.html:106
+msgid "Upload dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_info.html:14
+msgid "document"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_info.html:18
+msgid "Name Resource"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_info.html:22
+msgid "Resource count"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resource_item.html:24
+#: ckanext/odsh/templates/package/snippets/resource_item.html:41
+msgid "download file"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resources_list.html:13
+msgid "Dateien"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resources_list.html:26
+#, python-format
+msgid ""
+" <p class=\"empty\">This dataset has no data, <a href=\"%(url)s\">why not add"
+" some?</a></p> "
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/resources_list.html:30
+msgid "This dataset has no data"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/facet_list.html:26
-msgid "Show More {facet_type}"
+#: ckanext/odsh/templates/package/snippets/stages.html:23
+#: ckanext/odsh/templates/package/snippets/stages.html:25
+msgid "Enter data"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/facet_list.html:30
-msgid "Show Only Popular {facet_type}"
+#: ckanext/odsh/templates/package/snippets/stages.html:30
+#: ckanext/odsh/templates/package/snippets/stages.html:34
+#: ckanext/odsh/templates/package/snippets/stages.html:36
+msgid "Add dataset"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/facet_list.html:34
+#: ckanext/odsh/templates/snippets/custom_search_form.html:6
+msgid "{number} data request found for \"{query}\""
+msgid_plural "{number} data requests found for \"{query}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/snippets/custom_search_form.html:7
+msgid "No data requests found for \"{query}\""
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/custom_search_form.html:8
+msgid "{number} data proposal found"
+msgid_plural "{number} data proposals found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/snippets/custom_search_form.html:9
+msgid "No data proposal found"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/facet_list.html:65
+msgid "Show More"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/facet_list.html:69
+msgid "Show Less"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/facet_list.html:75
 msgid "There are no {facet_type} that match this search"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/language_selector.html:13
-#: ckanext/odsh/templates/snippets/search_form.html:34
-msgid "Go"
+#: ckanext/odsh/templates/snippets/follow_button.html:9
+msgid "Unfollow"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/package_item.html:47
-msgid "Draft"
+#: ckanext/odsh/templates/snippets/follow_button.html:14
+msgid "Follow"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/package_item.html:58
-msgid "Popular"
+#: ckanext/odsh/templates/snippets/home_breadcrumb_item.html:5
+msgid "Home"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/map.html:4
+msgid "map"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/organization.html:44
+msgid "read more"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/organization.html:55
+msgid "Followers"
 msgstr ""
 
 #: ckanext/odsh/templates/snippets/package_item.html:65
-msgid "This dataset has no description"
+msgid "NEW"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/search_form.html:3
-msgid "Search datasets..."
+#: ckanext/odsh/templates/snippets/search_box.html:5
+msgid "enter search query for datasets"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_box.html:11
+#: ckanext/odsh/templates/snippets/search_box.html:13
+msgid "Search dataset"
 msgstr ""
 
 #: ckanext/odsh/templates/snippets/search_form.html:4
 msgid "Order by"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/search_form.html:5
-msgid "Name Ascending"
+#: ckanext/odsh/templates/snippets/search_form.html:8
+msgid "Date Ascending"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/search_form.html:5
-msgid "Name Descending"
+#: ckanext/odsh/templates/snippets/search_form.html:8
+msgid "Date Descending"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/search_form.html:60
-msgid "Remove"
+#: ckanext/odsh/templates/snippets/search_form.html:16
+msgid "Start Date Descending"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_form.html:17
+msgid "Start Date Ascending"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/search_form.html:65
+#: ckanext/odsh/templates/snippets/search_form.html:18
+msgid "End Date Descending"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_form.html:19
+msgid "End Date Ascending"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_form.html:45
+msgid "rss feeds"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_form.html:67
+msgid "Go"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_form.html:93
+#: ckanext/odsh/templates/snippets/search_form.html:94
+#: ckanext/odsh/templates/snippets/search_form.html:121
+#: ckanext/odsh/templates/snippets/search_form.html:122
+#: ckanext/odsh/templates/snippets/search_form.html:134
+#: ckanext/odsh/templates/snippets/search_form.html:135
+#: ckanext/odsh/templates/snippets/search_form.html:148
+#: ckanext/odsh/templates/snippets/search_form.html:149
+#: ckanext/odsh/templates/snippets/search_form.html:161
+#: ckanext/odsh/templates/snippets/search_form.html:162
+#: ckanext/odsh/templates/snippets/search_form.html:182
+#: ckanext/odsh/templates/snippets/search_form.html:183
+msgid "Remove filters"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_form.html:102
 msgid "Filter Results"
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/search_form.html:72
+#: ckanext/odsh/templates/snippets/search_form.html:117
+#: ckanext/odsh/templates/snippets/search_form.html:130
+#: ckanext/odsh/templates/snippets/search_form.html:144
+#: ckanext/odsh/templates/snippets/search_form.html:157
+msgid "daterange"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_form.html:178
+msgid "map search active"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_form.html:196
 msgid " <p class=\"extra\">Please try another search.</p> "
 msgstr ""
 
-#: ckanext/odsh/templates/snippets/search_form.html:78
+#: ckanext/odsh/templates/snippets/search_form.html:202
 msgid ""
 " <p id=\"search-error\"><strong>There was an error while searching.</strong> "
 "Please try again.</p> "
 msgstr ""
 
+#: ckanext/odsh/templates/snippets/search_result_text.html:15
+msgid "{number} dataset found for \"{query}\""
+msgid_plural "{number} datasets found for \"{query}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:17
+msgid "No datasets found for \"{query}\""
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:18
+msgid "{number} dataset found"
+msgid_plural "{number} datasets found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:19
+msgid "No datasets found"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:22
+msgid "{number} group found for \"{query}\""
+msgid_plural "{number} groups found for \"{query}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:23
+msgid "No groups found for \"{query}\""
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:24
+msgid "{number} group found"
+msgid_plural "{number} groups found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:25
+msgid "No groups found"
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:28
+msgid "{number} organization found for \"{query}\""
+msgid_plural "{number} organizations found for \"{query}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:30
+msgid "No organizations found for \"{query}\""
+msgstr ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:31
+msgid "{number} organization found"
+msgid_plural "{number} organizations found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ckanext/odsh/templates/snippets/search_result_text.html:32
+msgid "No organizations found"
+msgstr ""
+
+#: ckanext/odsh/templates/user/login.html:3
+#: ckanext/odsh/templates/user/login.html:6
+#: ckanext/odsh/templates/user/login.html:12
+msgid "Login"
+msgstr ""
+
+#: ckanext/odsh/templates/user/login.html:25
+msgid "Forgotten your password?"
+msgstr ""
+
+#: ckanext/odsh/templates/user/login.html:28
+msgid "change password"
+msgstr ""
+
+#: ckanext/odsh/templates/user/logout.html:4
+msgid "Logout"
+msgstr ""
+
+#: ckanext/odsh/templates/user/logout.html:7
+#: ckanext/odsh/templates/user/logout.html:14
+msgid "Logged Out"
+msgstr ""
+
+#: ckanext/odsh/templates/user/logout.html:16
+msgid "You are now logged out."
+msgstr ""
+
+#: ckanext/odsh/templates/user/snippets/login_form.html:22
+msgid "Username"
+msgstr ""
+
+#: ckanext/odsh/templates/user/snippets/login_form.html:29
+msgid "Password"
+msgstr ""
+
+#: ckanext/odsh/templates/user/snippets/login_form.html:30
+msgid "enter password"
+msgstr ""
+
+#: ckanext/odsh/templates/user/snippets/login_form.html:34
+msgid "Remember me"
+msgstr ""
+
+#: ckanext/odsh/templates/user/snippets/login_form.html:40
+msgid "do Login"
+msgstr ""
+
diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-datarequest.po b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-datarequest.po
index fd21f876..bee83c54 100644
--- a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-datarequest.po
+++ b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-datarequest.po
@@ -4,4 +4,4 @@
 #: ckanext/datarequests/templates/datarequests/snippets/datarequest_form.html:47
 #: ckanext/datarequests/templates/datarequests/snippets/new_datarequest_form.html:7
 msgid "Create Data Request"
-msgstr "Datenanfrage "
+msgstr "Dokumentanfrage "
diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.1.po b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.1.po
index aa5b97f3..a749e5df 100644
--- a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.1.po
+++ b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.1.po
@@ -27,7 +27,7 @@ msgid "Start"
 msgstr "Start"
 
 msgid "Datasets"
-msgstr "Daten"
+msgstr "Dokumente"
 
 #: ckanext/odsh/templates/header.html:12
 msgid "Organizations"
diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo
index 8be79d9fd27fdd19815a279d577a8af7bd65b6ed..e5231b5c445d99ba368944a4870058a2d41ed820 100644
GIT binary patch
delta 4227
zcmez5Iy0dDo)F7a1_lO()eH;_G7Jn1C9EJG0-xbxV31^BU^vUgz`)GF!0;SOzlPH9
zxfmE&7#J8nL-{|r7#M^Y7#RL=F);8mFfj0QGca&7FfhnNX>D$ZJ?7jD46F<c^$a20
z3=F~y3=C1+3=HfH3=DbP3=AR+3=C!53=HB73=G}e3=F&s3=E5*25f}Vd$}1H_!t-%
zPI5ymy1~uBz{$YC@PZrSpifZo@7xdvvGYJ^DISP@x;zXFTnzOL430bu41x>{3_d&z
z3<?Yk3~@XVAJ;?0XMz<nFs$Z*_+%Ro*yRj|pa!1cVPIfmU|_h-198A39tH*p1_p*V
zP;pjX1_l8J1_mBph&{5r3=Con3=I0b3=Hh`3=9lzydak_F!=F8436Z57#PnB@nIS-
z1A{0714Ah<1A{6kM0g=lu@Nf2l@}5MM|dG2b%mFKL4|>V;Snz+B-!~G7-T`w%LlR8
ziVvbLkdJ|(9u#Epd=MXJ@-Z-QFfcGQ^Fb``fzq@2AP!pv<!|7F7`&ek;^Qk&`W_!7
zgkC`9zwkjE&dCpPpgcb$?)CW@7^FZU&d*Q}4yts1h(Qhf3=Gx`3=CaR1;_Xyaruy+
zfq{pCf#DfH#9^QL85ndK7#NrYAQl)1Kpf~M0P%p203-xM1t98UpyJsAkTg{y05P{m
zpdR9~iBN%sPz}ojAmUpEAc^uQ)PS>4`kDYF%I*t59R3O_{sn5zUntEa2(gG=5Tc$(
z5aJ+lK?VkS1_lPTdZ+?7DD4fU0|Xfu6d4#8LZSR}L5M?Y1R*|bfzrKD@o7+X^8_J2
zUn~fT<5hx?#JB@0e-Wzhnjj>q>hD7pycT3&&}Lv@U=e~ufq@XjfE*!6VyhB@q~1Cq
zhyx}FL3}n-2$G%V2|=P_lMp0`PY6MB(*q$$qGc3jV9;b>U{Du^@B@Xx^7Rbm!VC;@
z3=9l2AOZ~Ag(0c+hA<>ieiMcSm4FC@Zy*A3xt9pU0bwE#henG)@^>awyha3KZlee!
z1Qv)uLU1Qk-9Zsh)YUUET!Cu1Cj#-wW2naOA`l;miGp3qpd$*>z`)=u%D}+Hz`zhL
z3UNS`C?s*li$WZjBg()a&A`CWCd$BI#lXO@NR)v=kAZ>Vt|$Y87pNQ%V_>iV=@(;Q
zm{8Biz%W4!k}nk{AU?5>fFwRQ2}oiIgVL!I5TBPo)ip>!EbfzlWXIVO5T9<4fCTYL
zsJizOkdXKbRWBn6QLib<z)%m$hjx;XxQ&#ASez{hiQ{Uhc#9;Y1e+!a34!I3kVLjo
z5)wi?Bq90woFpU!UQ0q8!YT#vn4A<uov9Q9gBk+^gSQkUN{gfz>cM6EB&dP~QV<_+
zlY+$6Q7MSUXQdz(-jjl4qo-1kxc&g;GfOitXfQA^@JTZ;s53Aym`g)^94`&gR|lnA
zr6J`+50pPix*iheGo>LV(pqUqE;u0#N%dc(AyM)JO0&s894I0Ku|Qb{;&Ue%h>zl-
zbiE8Ds^&xK)iRJoy<G+p!dGP=_C5tE1XVsiWgyvxTNV;G%CZo?g)Afl0%Rc$NtA^|
zLB1>`kyXk<96nVR67(Bn85r~#7#L2;GB6l2Ffjarnx`WN(eEh7z!1W~z~C<j$&U3)
zpc3cgATGKi2Z^f>atsVc3=9lx@(`a{%0q%KQXb-fczH<BW<vP|@{rt6B@c<?dU*y0
zTLuP(W%3XYJ&}h*=}&n`T4PiId#s*8SOJpQR1_cv>q7bF3Xr&VfQoxV=}-ko$iyo^
zd|a*oF?gZ^#D_B#AQmiFU|>*YU|`s(0CDJD1xS=WQD9(D0<{wq7#MUw^*^^F#3Bnt
zh(nweArA3@(qT|KK@k!%S&EQ2Y*2($LK74j7|a<M81^YLFc>f}Fnm*lI7nRy>_Y~9
zC5VF@lptv)NC{FN6e=+=h=J<=1xk>h-40c_R|%53&nrP({zwU8;Y%e*D*veju~<nN
zVsU^n#NZBPh{4O1AwImO3`ul9l_6<CTm=#}o+=Ri1u6^-^`J6;o(e?4DHVth|ENGh
zL`W49ce1LGpfys3IK)8}VsL;e1A`W*$)*aatY)f0^80R8hzBmILd<!p3dtoOR3R4g
zszDrXt;SFfPNl_akV<E%8YBuHszKuFl^P@{->E?o;Wsr%Y8O+77-*;tDe3&w85qn!
zjaPLB24_%XRvnVM--8MRh2+GN)b#wKN-G5h7&|ky*h+!Hz~5)F11BSUa%paAUP<v}
zTP|&t6a|;Wl2ir9;^fr4l+3(z2G=~OkV`5|Y;!7C6{93ViC<!FssciK@=fj@&VbUS
zoXp~k)S}5LJZe0-`DLjJX_+}CsYS(;+j$al&@2fqNh~UX*o-iT0U}ybS&*5R{-|LY
zLvU$QR%&vILT+hsi9%AULZU);UVeF=LTHeu9;#$sK3G9&Zb3<<-sTTHNsNk##i=C>
zDTyT@x){VrRY=WCfiQ|e)=&21vzIMNEm9~>O)N^zP$(=-Evi&V%P&%Z>6+ZdH(5I`
zy)-dBl_4jwxI`g2BQX!mE=dLP@^f-hlS?x5^AvJZbCXhwCadvhb7$r$<Rz9V<fi78
zZtmm1$S7A(l$w&7oLXF*U&K(9nx4r}oSK)SkeH{CnwyxJGdWo>L=ogmhT_ts+{_Y?
z<*867F%*|3Lo`l4CfLMNQdy9yPz(u^&F(_mn8dsxF`b!e#Q<mKSxx>UlFFW+4UXi=
znWE8f_6bqdNT|3%S$<J*az;*KdTJhnUutP;v4RUWDVQK!IRi{YH?$xpKQRT)pX?!~
z!U>a1ot!Nu?*}yyu2&%`HL)luHM1l&50uPO5=%;RtrQNo<bZ-RRiUahwWzoRNe1k$
z5}3s1MPeL`mYC|pQi~36OG``5E6K@B&M3`GFNPY7s(tc)3DL>##MPytu0nPU%-NHT
zB;3WV6dV;EHB45BVgRLcD}^X9&v9~zL=ikBUrESM{wrZ6>;_Ka3Mr|H*(I4}nW;so
zd6Uf~4dLqYB|W{tsT%4ebiX3Yp*okrDYK*`RUsH0N9FlNB?_sTd6VZ#NJ-@>c;=<$
z7v&~`QeJU-YI<s3aY-U5NljiTA*O~?IyEy-4<1{aZ%ck)RD<~&E}RMveMn{mJA3je
z>3pf+Qc&VgD@sgHRY*I$rwE>0Qa9_%gfMCa7ZfEXXQVRtq?S~bq$(V4$xBHsD$PrW
zB(4&q^fh_EgzV%EvPNQliDjAT5MSteB$gJG<fi5w-ZS~3tO-2)Waa*G!fl$YF7L>l
zh)AfDOXSaSh2<BeA6}A|o?0~7Q9(@1Ro6E$Ge-fG#ZvR&-kO}CP;7!d)EJ^tGfR?E
zt4h-q67$Ma^HM<hAu%~4Ek7qcwP^EG1$IVx>^eaalAfBBnm75iVx|%-Ri&q<m4Xea
Q&MO6#3AG64S1MHk054_}#{d8T

delta 2927
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

diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
index 43b3fa34..63e6dee0 100644
--- a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
+++ b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
@@ -24,8 +24,17 @@ msgid "Start typing…"
 msgstr "Bitte Schlagwort eingeben"
 
 
+
+msgid "datasets"
+msgstr "Datenästze"
+
+
+msgid "dataset"
+msgstr "Datensatz"
+
+
 msgid "Search dataset"
-msgstr "Nach Datensatz suchen"
+msgstr "Nach Datensätzen suchen"
 
 msgid "Search organizations"
 msgstr "Nach Herausgeber suchen"
@@ -115,7 +124,7 @@ msgid "to"
 msgstr "bis"
 
 msgid "Data-Upload"
-msgstr "Daten-Upload"
+msgstr "Datensatz-Upload"
 
 msgid "Enter name of the dataset"
 msgstr "Namen der Distribution eingeben"
@@ -339,10 +348,10 @@ msgid "Score"
 msgstr "Open-Data-Eigenschaften"
 
 msgid "Issued Ascending"
-msgstr "Veröffentlichungsdatum aufsteigend"
+msgstr "Veröffentlichungsdatum: Älteste zuerst"
 
 msgid "Issued Descending"
-msgstr "Veröffentlichungsdatum absteigend"
+msgstr "Veröffentlichungsdatum: Neueste zuerst"
 
 msgid "Name Resource"
 msgstr "Name Ressource"
@@ -407,7 +416,7 @@ msgid "tran"
 msgstr "Verkehr"
 
 msgid "Datarequest"
-msgstr "Datenvorschlag"
+msgstr "Datensatz"
 
 msgid "Add Request"
 msgstr "Datensatz vorschlagen"
@@ -461,3 +470,75 @@ msgstr "Datum absteigend"
 
 msgid "Date Ascending"
 msgstr "Datum aufsteigend"
+
+msgid "subject"
+msgstr "Informationsgegenstand"
+
+msgid "Subject must not be empty."
+msgstr "Bitte geben Sie einen Informationsgegenstand ein."
+
+msgid "type subject"
+msgstr "Informationsgegenstand eingeben"
+
+msgid "date start"
+msgstr "Startdatum"
+
+msgid "date end"
+msgstr "Enddatum"
+
+msgid "main nav menu"
+msgstr "Navigations-Hauptmenü"
+
+msgid "Start Date Descending"
+msgstr "Startdatum: Neueste zuerst"
+
+msgid "Start Date Ascending"
+msgstr "Startdatum: Älteste zuerst"
+
+msgid "End Date Descending"
+msgstr "Enddatum: Neueste zuerst"
+
+msgid "End Date Ascending"
+msgstr "Enddatum: Älteste zuerst"
+
+msgid "send an email"
+msgstr "E-Mail senden"
+
+msgid "enter search query for datasets"
+msgstr "Suchanfrage für Datensätze eingeben"
+
+msgid "Remove filters"
+msgstr "Filter deaktivieren"
+
+msgid "successor"
+msgstr "Nachfolger"
+
+msgid "predecessor"
+msgstr "Vorgänger"
+
+msgid "latest collection member"
+msgstr "Neuester Datensatz"
+
+msgid "language"
+msgstr "Sprache"
+
+
+msgid "Subject must be a known URI."
+msgstr "Bitte geben Sie einen Informationsgegenstand an"
+
+msgid "Documents"
+msgstr "Dokumente"
+
+msgid " category: "
+msgid_plural " categories: "
+msgstr[0] "Kategorie:"
+msgstr[1] "Kategorien:"
+
+msgid "Publisher"
+msgstr "Herausgeber"
+
+msgid "Name Ascending"
+msgstr "Name: A – Z"
+
+msgid "Name Descending"
+msgstr "Name: Z – A"
diff --git a/ckanext/odsh/lib/odsh_icap_client.cfg b/ckanext/odsh/lib/odsh_icap_client.cfg
deleted file mode 100644
index 654b57a8..00000000
--- a/ckanext/odsh/lib/odsh_icap_client.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-[DEFAULT]
-# the IP of the ICAP-Server
-host = 10.61.127.77
-
-# The port of the ICAP-Server
-port = 1344
-
-# the IP of the client-machine
-clientip = 127.0.0.1
diff --git a/ckanext/odsh/lib/odsh_icap_client.py b/ckanext/odsh/lib/odsh_icap_client.py
index fe8101eb..df3df673 100644
--- a/ckanext/odsh/lib/odsh_icap_client.py
+++ b/ckanext/odsh/lib/odsh_icap_client.py
@@ -1,37 +1,48 @@
 import socket
 import sys
 import time
-#from ckan.common import config
-#import logging
+import logging
+from ckan.common import config
+import ckan.plugins.toolkit as toolkit
 
-#log = logging.getLogger(__name__)
+log = logging.getLogger(__name__)
+
+def _read_from_config(key):
+    value = config.get(key, None)
+    if value is None:
+        _raise_KeyError_if_not_in_config(key)
+    return value
+
+def _raise_KeyError_if_not_in_config(key):
+    raise KeyError('key {} is not defined in ckan config file.'.format(key))
 
 
 class ODSHICAPRequest(object):
 
     def __init__(self, FILENAME, FILEBUFF):
-        config = []
-        self.HOST =  "10.61.127.77"  #'10.61.127.77'
-        self.PORT =  1344
-
-        self.CLIENTIP = '127.0.0.1'
+        try:
+            self.HOST = _read_from_config('ckanext.odsh.icap.host')
+            self.PORT = toolkit.asint(_read_from_config('ckanext.odsh.icap.port'))
+            self.CLIENTIP = _read_from_config('ckanext.odsh.icap.clientip')
+        except KeyError, e:
+            log.error(e)
         self.FILENAME = FILENAME
         self.FILEBUFF = FILEBUFF
-
+    
     def send(self):
-        #log.info("----- Starting ICAP-Request via RESPMOD -----")
+        print("----- Starting ICAP-Request via RESPMOD -----")
 
         # socket connect
         try:
             sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         except socket.error as msg:
-            #log.error(msg[1])
+            sys.stderr.write("[ERROR] %s\n" % msg[1])
             sys.exit(1)
 
         try:
             sock.connect((self.HOST, self.PORT))
         except socket.error as msg:
-            #log.error(msg[1])
+            sys.stderr.write("[ERROR] %s\n" % msg[1])
             sys.exit(2)
 
         # create and send header
@@ -46,7 +57,7 @@ class ODSHICAPRequest(object):
         data_response = self._recvall(sock)
         response_object = self._parse_response(data_response)
 
-        #log.info("----- Finished ICAP-Request via RESPMOD -----")
+        print("----- Finished ICAP-Request via RESPMOD -----")
 
         return response_object
 
@@ -74,36 +85,20 @@ class ODSHICAPRequest(object):
         return icapRequest
 
     def _sendfile(self, fileBuffer, sock):
-        #log.info('Start sending file.')
+        print('start sending file')
         PACK_SIZE = 1024 # in bytes
 
         l = fileBuffer.read(PACK_SIZE)
         while(l):
-            #log.info('Sending {} bytes of data...'.format(len(l)))
+            print('sending %d bytes of data...' % len(l))
             sock.send('{:02X}'.format(len(l)).encode())
             sock.send("\r\n".encode())
             sock.send(l)
             sock.send("\r\n".encode())
             l = fileBuffer.read(PACK_SIZE)
-
-    def _sendfile_old(self, fileName, sock):
-        #log.info('OLD: Start sending file.')
-        PACK_SIZE = 1024 # in bytes
-    
-        with open(fileName) as f:
-            l = f.read(PACK_SIZE)
-            while(l):
-                #log.info('Sending {} bytes of data...'.format(len(l)))
-                sock.send('{:02X}'.format(len(l)).encode())
-                sock.send("\r\n".encode())
-                sock.send(l)
-                sock.send("\r\n".encode())
-                l = f.read(PACK_SIZE)
-        #log.info('Done sending.')
-
     
     def _recvall(self, sock):
-        #log.info('Receiving response from icap server...')
+        print('receiving response from icap server')
         BUFF_SIZE = 4096 # 4 KiB
         data = b''
         while True:
@@ -115,7 +110,7 @@ class ODSHICAPRequest(object):
         return data
 
     def _parse_response(self, data_response):
-        #log.info('Parsing response...')
+        print('parsing response')
         lines = data_response.split('\r\n')
         http_status_code = self._parse_response_http_statuscode(lines)
         http_block = self._parse_block(lines, 'HTTP/1.1')
@@ -164,9 +159,7 @@ class ODSHParsedICAPResponse(object):
 
     def virus_found(self):
         if (self.http_status_code != 200) and (self.http_status_code != 403):
-            msg = 'Received an unknown http response code: {}'.format(self.http_status_code)
-            #log.warning(msg)
-            raise UnknownResponseException(msg)
+            raise UnknownResponseException('Received an unknown http response code: %d' % self.http_status_code)
         return self.http_status_code != 200
 
 
diff --git a/ckanext/odsh/lib/uploader.py b/ckanext/odsh/lib/uploader.py
index 93452f93..ab89260a 100644
--- a/ckanext/odsh/lib/uploader.py
+++ b/ckanext/odsh/lib/uploader.py
@@ -1,23 +1,77 @@
 import ckan.logic as logic
-from ckan.lib.uploader import ResourceUpload
+from ckan.lib.uploader import ResourceUpload, Upload
+import ckan.plugins.toolkit as toolkit
+from pylons import config
+
 from odsh_icap_client import ODSHICAPRequest
+import logging
+import hashlib
+
+log = logging.getLogger(__name__)
+
+
+def _icap_virus_found(filename, upload_file):
+    # the flag skip_icap_virus_check in can be used during development
+    skip_icap_virus_check = toolkit.asbool(
+        config.get('ckanext.odsh.skip_icap_virus_check', 'False')
+    )
+    if skip_icap_virus_check:
+        log.debug("WARNING: icap virus check skipped, remove parameter ckanext.odsh.skip_icap_virus_check from ckan's ini file")
+        return False
+    if filename and upload_file:
+        response_object = ODSHICAPRequest(filename, upload_file).send()
+        return response_object.virus_found()
+
 
-#import logging
+def _raise_validation_error_if_virus_found(filename, upload_file):
+    if _icap_virus_found(filename, upload_file):
+        raise logic.ValidationError({'upload': ['Virus gefunden']})
 
-#log = logging.getLogger(__name__)
 
+def calculate_hash(upload_file):
+    upload_file.seek(0)
+    hash_md5 = hashlib.md5()
+    for chunk in iter(lambda: upload_file.read(4096), b""):
+            hash_md5.update(chunk)
+    return hash_md5.hexdigest()
+    #return hashlib.md5(upload_file.read()).hexdigest() 
+
+
+def _raise_validation_error_if_hash_values_differ(upload_file, resource):
+    hash_from_resource = resource.get('hash') 
+    if hash_from_resource:
+        hash_from_calculation = calculate_hash(upload_file)
+        if not hash_from_calculation == hash_from_resource:
+            log.debug('hash from calculation: {}'.format(hash_from_calculation))
+            log.debug('hash from resource: {}'.format(hash_from_resource))
+            raise logic.ValidationError({'upload': ['Berechneter Hash und mitgelieferter Hash sind unterschiedlich']})
+            
 
 class ODSHResourceUpload(ResourceUpload):
 
     def __init__(self, resource):
-        #log.info("Resource({}) uploaded.".format(resource))
+        log.debug("Resource({}) uploaded.".format(resource))
         super(ODSHResourceUpload, self).__init__(resource)
-        if self._icap_virus_found():
-            #log.info("Found Virus!")
-            raise logic.ValidationError({'upload': ['Virus gefunden']})
-        
-    def _icap_virus_found(self):
-        if self.filename and self.upload_file:
-            response_object = ODSHICAPRequest(self.filename, self.upload_file).send()
-            return response_object.virus_found()
-        
+        if hasattr(self, 'filename') and hasattr(self, 'upload_file'):
+            _raise_validation_error_if_virus_found(self.filename, self.upload_file)
+            _raise_validation_error_if_hash_values_differ(self.upload_file, resource)
+
+
+class ODSHUpload(Upload):
+    '''
+    custom uploader to upload resources and group images
+    see https://docs.ckan.org/en/ckan-2.7.3/extensions/plugin-interfaces.html?highlight=iuploader#ckan.plugins.interfaces.IUploader
+    this uploader object hooks into the upload method in order to 
+    scan for viruses within the uploaded content
+    '''
+
+    def __init__(self, upload_to, old_filename=None):
+        super(ODSHUpload, self).__init__(upload_to, old_filename)
+    
+    def update_data_dict(self, data_dict, url_field, file_field, clear_field):
+        super(ODSHUpload, self).update_data_dict(data_dict, url_field, file_field, clear_field)
+    
+    def upload(self, max_size=2):
+        if hasattr(self, 'filename') and hasattr(self, 'upload_file'):
+            _raise_validation_error_if_virus_found(self.filename, self.upload_file)
+        super(ODSHUpload, self).upload(max_size)
\ No newline at end of file
diff --git a/ckanext/odsh/logic/action.py b/ckanext/odsh/logic/action.py
index 6b952764..481a72ac 100644
--- a/ckanext/odsh/logic/action.py
+++ b/ckanext/odsh/logic/action.py
@@ -1,7 +1,10 @@
 import logging
+import ckan.logic as logic
+from ckan.logic.action.update import user_update
 from ckan.logic.action.create import package_create, user_create, group_member_create
 import ckan.model as model
 import ckan.lib.dictization.model_dictize as model_dictize
+from ckan.lib.munge import munge_title_to_name
 import ckan.plugins.toolkit as toolkit
 from ckan.lib.search.common import (
     make_connection, SearchError, SearchQueryError
@@ -13,8 +16,11 @@ log = logging.getLogger(__name__)
 
 
 def odsh_package_create(context, data_dict):
+    pkg_type = data_dict.get('type', None)
+    if pkg_type == 'collection':
+        return package_create(context, data_dict)
     munge_increment_name(data_dict)
-    if data_dict.get('type', None) != 'dataset':
+    if pkg_type != 'dataset':
         return package_create(context, data_dict)
     issued = False
     for extra in data_dict.get('extras'):
@@ -27,26 +33,51 @@ def odsh_package_create(context, data_dict):
 
 
 def munge_increment_name(data_dict):
-    from ckan.lib.munge import munge_title_to_name
-
-    name_base = name = munge_title_to_name(data_dict['title'])
-    pkg = model.Package.get(name)
-    i = 0
-    while pkg:
-        i += 1
-        name = name_base + str(i)
+    title_from_dict = data_dict.get('title')
+    if title_from_dict:
+        name_base = name = munge_title_to_name(title_from_dict)
         pkg = model.Package.get(name)
-    log.debug('name: %s' % name)
-    data_dict['name'] = name
+        i = 0
+        while pkg:
+            i += 1
+            name = name_base + str(i)
+            pkg = model.Package.get(name)
+        log.debug('name: %s' % name)
+        data_dict['name'] = name
+
 
+def check_password(password):
+    return (len(password) >= 8 and
+            any(c.islower() for c in password) and
+            any(c.isupper() for c in password) and
+            any((c.isalpha()==False) for c in password)) #Number or Special character
+
+PASSWORD_ERROR_MESSAGE =  {'security': ['Passwort muss mindestens acht Zeichen, einen Gross-, einen Kleinbuchstaben und entweder eine Zahl oder ein Sondernzeichen enthalten!']}       
 
 def odsh_user_create(context, data_dict):
     model = context['model']
-    user = user_create(context, data_dict)
-    groups = toolkit.get_action('group_list')(data_dict={'all_fields': False})
-    for group in groups:
-        group_member_create(context, {'id': group, 'username': user.get('name'), 'role': 'member'})
-    return model_dictize.user_dictize(model.User.get(user.get('name')), context)
+    password = data_dict.get('password')
+    if not password:
+        password = data_dict.get('password1')
+    if check_password(password):
+        user = user_create(context, data_dict)
+        groups = toolkit.get_action('group_list')(data_dict={'all_fields': False})
+    
+        for group in groups:
+            group_member_create(context, {'id': group, 'username': user.get('name'), 'role': 'member'})
+        return model_dictize.user_dictize(model.User.get(user.get('name')), context)
+    else:
+        raise logic.ValidationError(PASSWORD_ERROR_MESSAGE)          
+  
+def tpsh_user_update(context, data_dict):
+      password = data_dict.get('password')
+      if not password:
+        password = data_dict.get('password1')
+      if password and not check_password(password):
+          raise logic.ValidationError(PASSWORD_ERROR_MESSAGE)      
+      return user_update(context, data_dict)
+
+
 
 
 @toolkit.side_effect_free
diff --git a/ckanext/odsh/matomo.py b/ckanext/odsh/matomo.py
index a3fd6fc1..15ac1b5c 100644
--- a/ckanext/odsh/matomo.py
+++ b/ckanext/odsh/matomo.py
@@ -4,7 +4,16 @@ from ckan.common import c, request
 from pylons import config
 import logging
 from ckan.plugins.toolkit import enqueue_job
+import ckanext.odsh.helpers_tpsh as helpers_tpsh
 
+def do_if_use_matomo(func):
+    def wrapper(*args, **kwargs):
+        use_matomo = helpers_tpsh.use_matomo()
+        if use_matomo:
+            return func(*args, **kwargs)
+    return wrapper
+
+@do_if_use_matomo
 def create_matomo_request(userId=None):
     headers = {
         'HTTP_USER_AGENT': request.headers.get('User-Agent'),
diff --git a/ckanext/odsh/odsh_logger.py b/ckanext/odsh/odsh_logger.py
new file mode 100644
index 00000000..54eea1b0
--- /dev/null
+++ b/ckanext/odsh/odsh_logger.py
@@ -0,0 +1,53 @@
+from multiline_formatter.formatter import MultilineMessagesFormatter
+import ckan.plugins as plugins
+import ckan.plugins.toolkit as toolkit
+
+
+class OdshLogger(MultilineMessagesFormatter):
+    multiline_marker = '...'
+    multiline_fmt = multiline_marker + ' : %(message)s'
+
+    def format(self, record):
+        """
+        This is mostly the same as logging.Formatter.format except for the splitlines() thing.
+        This is done so (copied the code) to not make logging a bottleneck. It's not lots of code
+        after all, and it's pretty straightforward.
+        """
+        endl_marker = '\n... : ";'
+        record.message = record.getMessage()
+        if self.usesTime():
+            record.asctime = self.formatTime(record, self.datefmt)
+        if '\n' in record.message:
+            splitted = record.message.splitlines()
+            output = self._fmt % dict(record.__dict__, message=splitted.pop(0))
+            output += ' ' + self.multiline_marker % record.__dict__ + '\n'
+            output += '\n'.join(
+                self.multiline_fmt % dict(record.__dict__, message=line)
+                for line in splitted
+            )
+            output = output.replace('"', '\\"')
+            output += endl_marker
+        else:
+            output = self._fmt % record.__dict__
+
+        if record.exc_info:
+            # Cache the traceback text to avoid converting it multiple times
+            # (it's constant anyway)
+            if not record.exc_text:
+                record.exc_text = self.formatException(record.exc_info)
+        if record.exc_text:
+            output += ' ' + self.multiline_marker % record.__dict__ + '\n'
+            try:
+                output += '\n'.join(
+                    self.multiline_fmt % dict(record.__dict__, message=line)
+                    for index, line in enumerate(record.exc_text.splitlines())
+                )
+                output = output.replace('"', '\\"')
+                output += endl_marker
+            except UnicodeError:
+                output += '\n'.join(
+                    self.multiline_fmt % dict(record.__dict__, message=line)
+                    for index, line
+                    in enumerate(record.exc_text.decode(sys.getfilesystemencoding(), 'replace').splitlines())
+                )
+        return output
\ No newline at end of file
diff --git a/ckanext/odsh/pdf_to_thumbnail/__init__.py b/ckanext/odsh/pdf_to_thumbnail/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/ckanext/odsh/pdf_to_thumbnail/action.py b/ckanext/odsh/pdf_to_thumbnail/action.py
new file mode 100644
index 00000000..bd5d7130
--- /dev/null
+++ b/ckanext/odsh/pdf_to_thumbnail/action.py
@@ -0,0 +1,30 @@
+# ckan
+import ckan.plugins.toolkit as toolkit
+import ckan.lib.helpers as helpers
+from ckan.logic.action.update import package_update
+from ckan.logic.action.delete import package_delete
+
+#from thumbnail
+import thumbnail as thumbnail
+
+
+def before_package_delete(context, package_id_dict):
+    pkg_dict = toolkit.get_action('package_show')(context, package_id_dict)
+    if helpers.check_access('package_delete', pkg_dict):
+        thumbnail.remove_thumbnail(context)
+    return package_delete(context, package_id_dict)
+    
+def before_package_update(context, pkg_dict):
+    if helpers.check_access('package_update', pkg_dict):
+        package_id =pkg_dict.get('id') 
+        package = toolkit.get_action('package_show')(context, {'id': package_id})
+        old_private = package.get('private')
+        new_private = pkg_dict.get('private')
+        old_filename = package.get('thumbnail')
+        if old_filename:
+            if str(old_private) != str(new_private):
+                new_filename = thumbnail.change_filepath(old_filename)
+                pkg_dict['extras'].append({'key': 'thumbnail', 'value': new_filename})
+            elif not pkg_dict.get('thumbnail'): 
+                pkg_dict['extras'].append({'key': 'thumbnail', 'value': old_filename})
+    return package_update(context, pkg_dict)
\ No newline at end of file
diff --git a/ckanext/odsh/pdf_to_thumbnail/helpers.py b/ckanext/odsh/pdf_to_thumbnail/helpers.py
new file mode 100644
index 00000000..faddfaa0
--- /dev/null
+++ b/ckanext/odsh/pdf_to_thumbnail/helpers.py
@@ -0,0 +1,27 @@
+
+from ckan.lib.helpers import is_url, url_for
+
+def thumbnail_namespace(filename):
+    return "/" + filename
+
+def get_download_link_for_thumbnail(package):
+    resources = package.get('resources')
+    for resource in resources[::-1]:
+        url_type =resource.get('url_type')
+        mimetype = resource.get('mimetype')
+        if url_type == 'upload' and mimetype == 'application/pdf':
+            package_id = resource.get('package_id')
+            resource_id = resource.get('id')
+            pre_resource_url = resource.get('url')
+            if is_url(pre_resource_url):
+                url_resource = pre_resource_url
+            else:
+                url_resource = url_for(controller='package',
+                                    action='resource_download',
+                                    id=package_id,
+                                    resource_id=resource_id,
+                                    filename=pre_resource_url,
+                                    qualified = True)
+            
+            
+            return url_resource
diff --git a/ckanext/odsh/pdf_to_thumbnail/plugin.py b/ckanext/odsh/pdf_to_thumbnail/plugin.py
new file mode 100644
index 00000000..71523599
--- /dev/null
+++ b/ckanext/odsh/pdf_to_thumbnail/plugin.py
@@ -0,0 +1,58 @@
+import os 
+
+
+#from ckan
+import ckan.plugins as plugins
+
+#pdf_to_thumbnail 
+import thumbnail 
+import action as thumbnail_action
+import helpers as thumbnail_helpers
+
+import logging
+log = logging.getLogger(__name__)
+
+
+class ThumbnailPlugin(plugins.SingletonPlugin):
+    plugins.implements(plugins.IResourceController, inherit=True)
+    plugins.implements(plugins.IConfigurer, inherit=True)
+    plugins.implements(plugins.IActions, inherit=True)
+    plugins.implements(plugins.ITemplateHelpers)
+
+
+#IResourceController
+    def after_create(self, context, resource):        
+        _, filename = thumbnail.create_thumbnail(context, resource)
+        thumbnail.write_thumbnail_into_package(context, resource, filename)
+        
+    def after_update(self, context, resource):
+        thumbnail.check_and_create_thumbnail_after_update(context, resource)
+                
+    def after_delete(self, context, resources):
+        thumbnail.create_thumbnail_for_last_resource(context, resources)
+            
+#IConfigurer 
+
+    def update_config(self, config_):
+        storage_path = config_.get('ckan.storage_path')
+        public_dir = os.path.join(storage_path, 'thumbnail')
+        if config_.get('extra_public_paths'):
+            config_['extra_public_paths'] += ',' + public_dir
+        else:
+            config_['extra_public_paths'] = public_dir
+
+#IActions
+
+    def get_actions(self):
+        return {'package_delete': thumbnail_action.before_package_delete,
+                'package_update': thumbnail_action.before_package_update 
+                }
+
+#ITemplateHelpers
+
+    def get_helpers(self):
+        
+        return {
+                'thumbnail_namespace':thumbnail_helpers.thumbnail_namespace,
+                'thumbail_get_download_link':thumbnail_helpers.get_download_link_for_thumbnail
+                }
diff --git a/ckanext/odsh/pdf_to_thumbnail/thumbnail.py b/ckanext/odsh/pdf_to_thumbnail/thumbnail.py
new file mode 100644
index 00000000..768cfdbf
--- /dev/null
+++ b/ckanext/odsh/pdf_to_thumbnail/thumbnail.py
@@ -0,0 +1,170 @@
+import os
+import tempfile
+import magic
+from pdf2image import convert_from_bytes
+import logging
+from ckan.common import config 
+import urllib2
+import requests
+
+import binascii
+import ckan.plugins.toolkit as toolkit
+import ckan.logic as logic
+#from extension
+#from ckanext.odsh.lib.uploader import raise_validation_error_if_virus_found
+
+log = logging.getLogger(__name__)
+ 
+
+def get_filename_from_context(context):
+    package = context.get('package')
+    package_id = package.id
+    package= toolkit.get_action('package_show')(context, {'id': package_id})
+    thumbnail = package.get('thumbnail') 
+    return  thumbnail
+
+def get_filepath_for_thumbnail(filename):
+    if filename:
+        return config.get('ckan.storage_path') + "/thumbnail/" + filename
+    return config.get('ckan.storage_path') + "/thumbnail/"
+
+def concatenate_filename(filename):
+    return filename + ".jpg"
+
+def get_filepath_to_resource(resource):
+    resource_id = resource.get('id')
+    directory = config.get('ckan.storage_path') + '/resources/'
+    #looked up how resources are saved, by locating the keyword resources in the OS 
+    path = directory + resource_id[0:3] + '/' + resource_id[3:6] + '/' +  resource_id[6:]
+    return path
+
+def random_filename():
+    number = binascii.b2a_hex(os.urandom(15))
+    filename = 'thumbnail_picture_' + str(number)    
+    full_filename = concatenate_filename(filename)
+    filepath = get_filepath_for_thumbnail(full_filename)
+    if os.path.exists(filepath):
+        filename = random_filename()
+    return filename
+
+def change_filepath(old_filename):    
+    old_filepath = get_filepath_for_thumbnail(old_filename)
+    new_filename = concatenate_filename(random_filename())
+    new_filepath = get_filepath_for_thumbnail(new_filename)
+    try:
+        os.renames(old_filepath, new_filepath)
+        return new_filename
+    except OSError:
+        log.warning('The file path "{}"  of package was not found.'.format(old_filepath))
+     
+
+def create_thumbnail_from_file(file, old_filename):
+    width = config.get('ckan.thumbnail.size.width', 410)
+    filename = random_filename()
+    file.seek(0)
+    file_read = file.read()
+    directory = get_filepath_for_thumbnail('')
+    if old_filename:
+        old_filepath = get_filepath_for_thumbnail(concatenate_filename(old_filename))
+        if os.path.exists(old_filepath):
+            os.remove(old_filepath)
+    convert_from_bytes(file_read,
+                       size=(width, None),
+                       output_folder=directory,
+                       output_file=filename,
+                       single_file=True,
+                       first_page=0,
+                       last_page=0,
+                       fmt='jpg'
+                       )
+    return concatenate_filename(filename)
+
+
+def create_thumbnail_from_url(resource, old_filename):
+    resource_url = resource.get('url')
+    request = urllib2.Request(resource_url)
+    response = urllib2.urlopen(request, timeout = 100000) 
+    
+    
+    if response.code == 200:
+        filetowrite = response.read()
+        # function is set to private in ckanext.odsh.lib.uploader
+        # raise_validation_error_if_virus_found(filetowrite, response.read())
+        file_type = magic.from_buffer(response.read(), mime = True)
+        header = response.headers
+        resource_size = header.get('Content-Length')
+        
+            
+        max_available_memory = config.get('ckan.max_available_memory', 250000000)  #In Bytes ca. 250 MB
+        with tempfile.SpooledTemporaryFile(max_size=max_available_memory) as file:
+            file.write(filetowrite)
+            
+            new_filename = create_thumbnail_from_file(file, old_filename)        
+            return True, new_filename
+
+def create_thumbnail_from_memory(resource, old_filename):
+    path = get_filepath_to_resource(resource)
+    file_type = magic.from_file(path, mime = True)
+    if file_type == 'application/pdf':
+        with open(path, 'rb') as file:
+            new_filename = create_thumbnail_from_file(file, old_filename)
+        is_PDF = True
+        return is_PDF, new_filename
+    else:
+        is_PDF = False
+        return is_PDF,  None
+
+def remove_thumbnail(context):
+    old_filename = get_filename_from_context(context)
+    if old_filename:
+        old_filepath = get_filepath_for_thumbnail(old_filename)
+        if os.path.exists(old_filepath):
+            os.remove(old_filepath)
+
+def create_thumbnail(context, resource):
+    log.debug('create_thumbnail')
+    old_filename = get_filename_from_context(context)
+    url_type = resource.get('url_type')
+    if url_type == 'upload':
+        is_PDF,  filename = create_thumbnail_from_memory(resource, old_filename)
+    else:
+        is_PDF,  filename = create_thumbnail_from_url(resource, old_filename)
+    return is_PDF,  filename   
+
+def check_and_create_thumbnail_after_update(context, resource):
+    log.debug('check_and_create_thumbnail_after_update')
+    package_id = resource.get('package_id')
+    package = toolkit.get_action('package_show')(context, {'id': package_id})
+    resources = package.get('resources')
+    if len(resources) > 0:
+        last_resource = resources.pop()
+        last_resource_id = last_resource.get('id')
+        resource_id = resource.get('id')
+    if last_resource_id == resource_id and resource.get('url_type') != 'upload':
+        is_PDF,  filename = create_thumbnail(context, resource)
+        if is_PDF:
+            write_thumbnail_into_package(context, resource, filename)  
+        
+
+def create_thumbnail_for_last_resource(context, resources):
+    if len(resources) > 0:
+        last_resource = resources.pop()
+        is_PDF, filename = create_thumbnail(context, last_resource)
+        if not is_PDF:
+            create_thumbnail_for_last_resource(context, resources)
+        else:
+            write_thumbnail_into_package(context, last_resource, filename)
+    else:
+        remove_thumbnail(context)
+        package = context.get('package')
+        package_id = package.id
+        package= toolkit.get_action('package_show')(context, {'id': package_id})
+        package.update({'thumbnail': None})
+        toolkit.get_action('package_update')(context, package)
+
+def write_thumbnail_into_package(context, resource, filename):
+        package_id = resource.get('package_id')
+        package = toolkit.get_action('package_show')(context, {'id': package_id})
+        if filename:
+            package.update({'thumbnail': filename})
+        toolkit.get_action('package_update')(context, package)
diff --git a/ckanext/odsh/plugin.py b/ckanext/odsh/plugin.py
index add7226b..ea003f69 100644
--- a/ckanext/odsh/plugin.py
+++ b/ckanext/odsh/plugin.py
@@ -1,341 +1,266 @@
-from multiline_formatter.formatter import MultilineMessagesFormatter
-import datetime
-import json
-import ckan.plugins as plugins
-import ckan.plugins.toolkit as toolkit
-from ckan.lib.plugins import DefaultTranslation
-from ckan.lib.plugins import DefaultDatasetForm
-from ckan.logic.validators import tag_string_convert
-from ckan.logic.schema import default_extras_schema
-from ckan.common import OrderedDict
-from ckanext.odsh.lib.uploader import ODSHResourceUpload
-import ckan.lib.helpers as helpers
-import helpers as odsh_helpers
-import ckanext.odsh.logic.action as action
-from ckanext.dcat.interfaces import IDCATRDFHarvester
-from ckanext.dcatde.extras import Extras
-
-from routes.mapper import SubMapper
-from pylons import config
+# import from third parties
 from dateutil.parser import parse
-from ckan import model
-
-import ckan.plugins as p
-
+import json
 import logging
-import validation
-import precondition
-
+from multiline_formatter.formatter import MultilineMessagesFormatter
+import os
+from pylons import config
+from routes.mapper import SubMapper
 import sys
 
-log = logging.getLogger(__name__)
-
-# from functools import wraps
-# from flask import Flask, redirect, jsonify
-# app = Flask(__name__)
-
-# def get_http_exception_handler(app):
-#     """Overrides the default http exception handler to return JSON."""
-#     handle_http_exception = app.handle_http_exception
-#     @wraps(handle_http_exception)
-#     def ret_val(exception):
-#         print("HEHREHR")
-#         exc = handle_http_exception(exception)
-#         return jsonify({'code':exc.code, 'message':exc.description}), exc.code
-#     return ret_val
+# imports from ckan
+from ckan.common import OrderedDict
+import ckan.lib.helpers as helpers
+from ckan.lib.plugins import DefaultTranslation, DefaultDatasetForm
+from ckan.logic.validators import tag_string_convert
+import ckan.plugins as plugins
+import ckan.plugins.toolkit as toolkit
+import ckan.model as model
 
-# # Override the HTTP exception handler.
-# app.handle_http_exception = get_http_exception_handler(app)
+# imports from this extension
+import ckanext.odsh.helpers as odsh_helpers
+import ckanext.odsh.helpers_tpsh as helpers_tpsh
+import ckanext.odsh.helper_pkg_dict as helper_pkg_dict
+from helper_pkg_dict import HelperPgkDict
+import ckanext.odsh.logic.action as action
+import ckanext.odsh.validation as validation
+import ckanext.odsh.search as search
+from ckanext.odsh.odsh_logger import OdshLogger
+import ckanext.odsh.tools as tools
 
 
-# def my_except_hook(exctype, value, traceback):
-#     print('GOT excepton')
-#     log.exception(value)
-#     sys.__excepthook__(exctype, value, traceback)
-# print('INSTALL EX')
-# sys.excepthook = my_except_hook
+log = logging.getLogger(__name__)
 
 _ = toolkit._
 
-
-class OdshLogger(MultilineMessagesFormatter):
-    multiline_marker = '...'
-    multiline_fmt = multiline_marker + ' : %(message)s'
-
-    def format(self, record):
-        """
-        This is mostly the same as logging.Formatter.format except for the splitlines() thing.
-        This is done so (copied the code) to not make logging a bottleneck. It's not lots of code
-        after all, and it's pretty straightforward.
-        """
-        endl_marker = '\n... : ";'
-        record.message = record.getMessage()
-        if self.usesTime():
-            record.asctime = self.formatTime(record, self.datefmt)
-        if '\n' in record.message:
-            splitted = record.message.splitlines()
-            output = self._fmt % dict(record.__dict__, message=splitted.pop(0))
-            output += ' ' + self.multiline_marker % record.__dict__ + '\n'
-            output += '\n'.join(
-                self.multiline_fmt % dict(record.__dict__, message=line)
-                for line in splitted
-            )
-            output = output.replace('"', '\\"')
-            output += endl_marker
-        else:
-            output = self._fmt % record.__dict__
-
-        if record.exc_info:
-            # Cache the traceback text to avoid converting it multiple times
-            # (it's constant anyway)
-            if not record.exc_text:
-                record.exc_text = self.formatException(record.exc_info)
-        if record.exc_text:
-            output += ' ' + self.multiline_marker % record.__dict__ + '\n'
-            try:
-                output += '\n'.join(
-                    self.multiline_fmt % dict(record.__dict__, message=line)
-                    for index, line in enumerate(record.exc_text.splitlines())
-                )
-                output = output.replace('"', '\\"')
-                output += endl_marker
-            except UnicodeError:
-                output += '\n'.join(
-                    self.multiline_fmt % dict(record.__dict__, message=line)
-                    for index, line
-                    in enumerate(record.exc_text.decode(sys.getfilesystemencoding(), 'replace').splitlines())
-                )
-        return output
-
-
-def odsh_get_facet_items_dict(name, limit=None):
-    '''
-    Gets all facets like 'get_facet_items_dict' but sorted alphabetically
-    instead by count.
-    '''
-    facets = helpers.get_facet_items_dict(name, limit)
-    facets.sort(key=lambda it: (it['display_name'].lower(), -it['count']))
-    return facets
-
-
-def odsh_main_groups():
-    '''Return a list of the groups to be shown on the start page.'''
-
-    # Get a list of all the site's groups from CKAN, sorted by number of
-    # datasets.
-    groups = toolkit.get_action('group_list')(
-        data_dict={'all_fields': True})
-
-    return groups
-
-
-def odsh_now():
-    return helpers.render_datetime(datetime.datetime.now(), "%Y-%m-%d")
-
-
-def odsh_group_id_selected(selected, group_id):
-    if type(selected) is not list:
-        selected = [selected]
-    for g in selected:
-        if (isinstance(g, basestring) and group_id == g) or (type(g) is dict and group_id == g['id']):
-            return True
-
-    return False
-
-
-def remove_route(map, routename):
-    route = None
-    for i, r in enumerate(map.matchlist):
-
-        if r.name == routename:
-            route = r
-            break
-    if route is not None:
-        map.matchlist.remove(route)
-        for key in map.maxkeys:
-            if key == route.maxkeys:
-                map.maxkeys.pop(key)
-                map._routenames.pop(route.name)
-                break
-
-
-class OdshIcapPlugin(plugins.SingletonPlugin):
-    plugins.implements(plugins.IUploader, inherit=True)
-
-    def get_resource_uploader(self, data_dict):
-        return ODSHResourceUpload(data_dict)
-
-
-class OdshAutocompletePlugin(plugins.SingletonPlugin):
+class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm):
     plugins.implements(plugins.IActions)
+    plugins.implements(plugins.IConfigurer)
+    plugins.implements(plugins.IDatasetForm)
+    plugins.implements(plugins.IFacets)
+    plugins.implements(plugins.IPackageController, inherit=True)
+    plugins.implements(plugins.IRoutes, inherit=True)
+    plugins.implements(plugins.ITemplateHelpers)
+    plugins.implements(plugins.ITranslation)
+    plugins.implements(plugins.IValidators)
+    plugins.implements(plugins.IResourceController, inherit=True)
 
-    def get_actions(self):
-        return {'autocomplete': action.autocomplete}
+    
+    # IActions
 
+    def get_actions(self):
+        return {'package_create': action.odsh_package_create,
+                'user_update':action.tpsh_user_update,
+                'user_create': action.odsh_user_create}
 
-class OdshHarvestPlugin(plugins.SingletonPlugin):
-    plugins.implements(plugins.IRoutes, inherit=True)
-    plugins.implements(plugins.IConfigurer)
+    
+    # IConfigurer
 
     def update_config(self, config_):
-        toolkit.add_template_directory(config_, 'harvest_templates')
-    plugins.implements(plugins.IRoutes, inherit=True)
+        toolkit.add_template_directory(config_, 'templates')
+        toolkit.add_public_directory(config_, 'public')
+        toolkit.add_resource('fanstatic', 'odsh')
 
-    def before_map(self, map):
-        DATASET_TYPE_NAME = 'harvest'
-        controller = 'ckanext.odsh.controller:OdshHarvestController'
-
-        map.connect('{0}_delete'.format(DATASET_TYPE_NAME), '/' +
-                    DATASET_TYPE_NAME + '/delete/:id', controller=controller, action='delete')
-        map.connect('{0}_refresh'.format(DATASET_TYPE_NAME), '/' + DATASET_TYPE_NAME + '/refresh/:id', controller=controller,
-                    action='refresh')
-        map.connect('{0}_admin'.format(DATASET_TYPE_NAME), '/' +
-                    DATASET_TYPE_NAME + '/admin/:id', controller=controller, action='admin')
-        map.connect('{0}_about'.format(DATASET_TYPE_NAME), '/' +
-                    DATASET_TYPE_NAME + '/about/:id', controller=controller, action='about')
-        map.connect('{0}_clear'.format(DATASET_TYPE_NAME), '/' +
-                    DATASET_TYPE_NAME + '/clear/:id', controller=controller, action='clear')
-
-        map.connect('harvest_job_list', '/' + DATASET_TYPE_NAME +
-                    '/{source}/job', controller=controller, action='list_jobs')
-        map.connect('harvest_job_show_last', '/' + DATASET_TYPE_NAME +
-                    '/{source}/job/last', controller=controller, action='show_last_job')
-        map.connect('harvest_job_show', '/' + DATASET_TYPE_NAME +
-                    '/{source}/job/{id}', controller=controller, action='show_job')
-        map.connect('harvest_job_abort', '/' + DATASET_TYPE_NAME +
-                    '/{source}/job/{id}/abort', controller=controller, action='abort_job')
-
-        map.connect('harvest_object_show', '/' + DATASET_TYPE_NAME +
-                    '/object/:id', controller=controller, action='show_object')
-        map.connect('harvest_object_for_dataset_show', '/dataset/harvest_object/:id',
-                    controller=controller, action='show_object', ref_type='dataset')
-
-        org_controller = 'ckanext.harvest.controllers.organization:OrganizationController'
-        map.connect('{0}_org_list'.format(DATASET_TYPE_NAME), '/organization/' +
-                    DATASET_TYPE_NAME + '/' + '{id}', controller=org_controller, action='source_list')
-        return map
 
-    def after_map(self, map):
-        return map
+    # IDatasetForm
 
+    def package_types(self):
+        # This plugin doesn't handle any special package types, it just
+        # registers itself as the default (above).
+        return []
 
-class OdshDCATHarvestPlugin(plugins.SingletonPlugin):
-    plugins.implements(IDCATRDFHarvester, inherit=True)
+    def is_fallback(self):
+        # Return True to register this plugin as the default handler for
+        # package types not handled by any other IDatasetForm plugin.
+        return True
+    
+    def create_package_schema(self):
+        schema = super(OdshPlugin, self).create_package_schema()
+        self._update_schema(schema)
+        self._tpsh_update_create_or_update_package_schema(schema)
+        return schema
 
-    def before_update(self, harvest_object, dataset_dict, temp_dict):
+    def update_package_schema(self):
+        schema = super(OdshPlugin, self).update_package_schema()
+        self._update_schema(schema)
+        self._tpsh_update_create_or_update_package_schema(schema)
+        return schema
 
-        existing_package_dict = self._get_existing_dataset(harvest_object.guid)
-        new_dataset_extras = Extras(dataset_dict['extras'])
-        if new_dataset_extras.key('modified') and \
-                new_dataset_extras.value('modified') < existing_package_dict.get('metadata_modified'):
-            log.info("Modified date of new dataset is not newer than "
-                     + "the already exisiting dataset, ignoring new one.")
-            dataset_dict.clear()
+    def show_package_schema(self):
+        schema = super(OdshPlugin, self).show_package_schema()
+        self._tpsh_update_show_package_schema(schema)
+        return schema
 
-    def _get_existing_dataset(self, guid):
-        '''
-        Checks if a dataset with a certain guid extra already exists
+    def _update_schema(self, schema):
+        for field in ['title', 'license_id']:
+            schema.update({field: [toolkit.get_converter('not_empty')]})
+        
+        for i, item in enumerate(schema['tags']['name']):
+            if item == toolkit.get_validator('tag_name_validator'):
+                schema['tags']['name'][i] = toolkit.get_validator(
+                    'odsh_tag_name_validator')
+        for i, item in enumerate(schema['tag_string']):
+            if item == tag_string_convert:
+                schema['tag_string'][i] = validation.tag_string_convert
 
-        Returns a dict as the ones returned by package_show
-        '''
+        schema['resources'].update({
+            'url': [toolkit.get_converter('not_empty')],
+            'format': [toolkit.get_converter('not_empty')],
+        })
 
-        datasets = model.Session.query(model.Package.id) \
-                                .join(model.PackageExtra) \
-                                .filter(model.PackageExtra.key == 'guid') \
-                                .filter(model.PackageExtra.value == guid) \
-                                .filter(model.Package.state == 'active') \
-                                .all()
+        schema['extras'].update({
+            'key': [
+                toolkit.get_converter('known_spatial_uri'),
+                toolkit.get_converter('validate_licenseAttributionByText'),
+            ]
+        })
+        schema.update(
+            {'__extras':  [toolkit.get_converter('odsh_validate_extras')]})
 
-        if not datasets:
-            return None
-        elif len(datasets) > 1:
-            log.error('Found more than one dataset with the same guid: {0}'
-                      .format(guid))
+    def _tpsh_update_create_or_update_package_schema(self, schema):
+        schema.update({
+            'language': [
+                toolkit.get_validator('ignore_missing'),
+                toolkit.get_converter('convert_to_extras')
+            ],
+            'thumbnail': [
+                toolkit.get_validator('ignore_missing'),
+                toolkit.get_converter('convert_to_extras')
+            ],
 
-        return p.toolkit.get_action('package_show')({}, {'id': datasets[0][0]})
+        })
+        return schema
+    
+    def _tpsh_update_show_package_schema(self, schema):
+        schema.update({
+            'language': [
+                toolkit.get_converter('convert_from_extras'),
+                toolkit.get_validator('ignore_missing')
+            ],
+            'thumbnail': [
+                toolkit.get_converter('convert_from_extras'),
+                toolkit.get_validator('ignore_missing')
+            ],
+        })
+        return schema
 
 
-class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm):
-    plugins.implements(plugins.IConfigurer)
-    plugins.implements(plugins.ITemplateHelpers)
-    plugins.implements(plugins.IRoutes, inherit=True)
-    plugins.implements(plugins.ITranslation)
-    plugins.implements(plugins.IFacets)
-    plugins.implements(plugins.IDatasetForm)
-    plugins.implements(plugins.IValidators)
-    plugins.implements(plugins.IPackageController, inherit=True)
-    plugins.implements(plugins.IActions)
+    # IFacets
+    
+    def dataset_facets(self, facets_dict, package_type):
+        return OrderedDict({'organization': _('Herausgeber'),
+                            'groups': _('Kategorie'),
+                            'res_format': _('Dateiformat'),
+                            'license_title': _('Lizenz'),
+                            'tags': _('Tags'),
+                            'openness': _('Open-Data-Eigenschaften')
+                            })
 
-    # IActions
+    def group_facets(self, facets_dict, group_type, package_type):
+        return OrderedDict({'organization': _('Herausgeber'),
+                            'res_format': _('Dateiformat'),
+                            'license_title': _('Lizenz'),
+                            'groups': _('Kategorie')})
 
-    def get_actions(self):
-        return {'package_create': action.odsh_package_create,
-                'user_create': action.odsh_user_create}
+    def organization_facets(self, facets_dict, organization_type, package_type):
+        return OrderedDict({'organization': _('Herausgeber'),
+                            'res_format': _('Dateiformat'),
+                            'license_title': _('Lizenz'),
+                            'groups': _('Kategorie')})
+    
 
-    # IConfigurer
+    # IPackageController
 
-    def update_config(self, config_):
-        toolkit.add_template_directory(config_, 'templates')
-        toolkit.add_public_directory(config_, 'public')
-        toolkit.add_resource('fanstatic', 'odsh')
+    def after_show(self, context, pkg_dict):
+        '''
+        corrects missing relationships in pkg dict
+        adds the following key-value-pairs to pkg_dict:
+        # key: 'is_new', value: True if the dataset has been created within the last month
+        '''
+        pkg_dict = helpers_tpsh.correct_missing_relationship(
+            pkg_dict,
+            helpers_tpsh.get_pkg_relationships_from_model(pkg_dict)
+        )
+        self._update_is_new_in_pkg_dict(pkg_dict)
+        
+        return pkg_dict
 
-    def get_helpers(self):
-        # Template helper function names should begin with the name of the
-        # extension they belong to, to avoid clashing with functions from
-        # other extensions.
-        return {'odsh_main_groups': odsh_main_groups,
-                'odsh_now': odsh_now,
-                'odsh_group_id_selected': odsh_group_id_selected,
-                'odsh_get_facet_items_dict': odsh_get_facet_items_dict,
-                'odsh_openness_score_dataset_html': odsh_helpers.odsh_openness_score_dataset_html,
-                'odsh_get_resource_details': odsh_helpers.odsh_get_resource_details,
-                'odsh_get_resource_views': odsh_helpers.odsh_get_resource_views,
-                'odsh_get_bounding_box': odsh_helpers.odsh_get_bounding_box,
-                'odsh_get_spatial_text': odsh_helpers.odsh_get_spatial_text,
-                'odsh_render_datetime': odsh_helpers.odsh_render_datetime,
-                'odsh_upload_known_formats': odsh_helpers.odsh_upload_known_formats,
-                'odsh_encodeurl': odsh_helpers.odsh_encodeurl,
-                'odsh_extract_error': odsh_helpers.odsh_extract_error,
-                'odsh_extract_error_new': odsh_helpers.odsh_extract_error_new,
-                'odsh_extract_value_from_extras': odsh_helpers.odsh_extract_value_from_extras,
-                'odsh_create_checksum': odsh_helpers.odsh_create_checksum,
-                'presorted_license_options': odsh_helpers.presorted_license_options,
-                'odsh_tracking_id': odsh_helpers.odsh_tracking_id,
-                'odsh_tracking_url': odsh_helpers.odsh_tracking_url,
-                'odsh_has_more_facets': odsh_helpers.odsh_has_more_facets,
-                'odsh_public_url': odsh_helpers.odsh_public_url,
-                'odsh_spatial_extends_available': odsh_helpers.spatial_extends_available,
-                'odsh_public_resource_url': odsh_helpers.odsh_public_resource_url,
-                'odsh_get_version_id': odsh_helpers.odsh_get_version_id,
-                'odsh_show_testbanner': odsh_helpers.odsh_show_testbanner,
-                'odsh_is_slave': odsh_helpers.odsh_is_slave
-                }
+    def before_view(self, pkg_dict):
+        '''
+        adds the following key-value-pairs to pkg_dict:
+        # key: 'is_new', value: True if the dataset has been created within the last month
+        '''
+        self._update_is_new_in_pkg_dict(pkg_dict)
+        return pkg_dict
+    
+    def after_create(self, context, resource):
+        if resource.get('package_id'):
+            tools.add_attributes_resources(context, resource)
 
-    def after_map(self, map):
-        return map
+    def after_update(self, context, resource):
+        if resource.get('package_id'):
+            tools.add_attributes_resources(context, resource)
 
-    def before_map(self, map):
-        map.connect('info_page', '/info_page',
-                    controller='ckanext.odsh.controller:OdshRouteController', action='info_page')
-        map.connect('home', '/',
-                    controller='ckanext.odsh.controller:OdshRouteController', action='start')
+    @staticmethod
+    def _update_is_new_in_pkg_dict(pkg_dict):
+        is_new = HelperPgkDict(pkg_dict).is_package_new()
+        pkg_dict.update({'is_new': is_new})
+
+    
+    def before_index(self, dict_pkg):
+        # make special date fields solr conform
+        fields = ["issued", "temporal_start", "temporal_end"]
+        for field in fields:
+            field = 'extras_' + field
+            if field in dict_pkg and dict_pkg[field]:
+                d = parse(dict_pkg[field])
+                dict_pkg[field] = '{0.year:04d}-{0.month:02d}-{0.day:02d}T00:00:00Z'.format(
+                    d)
 
-        map.redirect('/dataset/{id}/resource/{resource_id}', '/dataset/{id}')
+        self.map_qa_score(dict_pkg)
 
-        if p.toolkit.asbool(config.get('ckanext.dcat.enable_rdf_endpoints', True)):
-            remove_route(map, 'dcat_catalog')
-            map.connect('dcat_catalog',
-                        config.get('ckanext.dcat.catalog_endpoint',
-                                   '/catalog.{_format}'),
-                        controller='ckanext.odsh.controller:OdshDCATController', action='read_catalog',
-                        requirements={'_format': 'xml|rdf|n3|ttl|jsonld'})
+        return dict_pkg
+    
 
-        # with SubMapper(map, controller='ckanext.odsh.controller:OdshApiController') as m:
-        #     m.connect('/catalog2', action='read_catalog')
+    # IRoutes
+    
+    def before_map(self, map):
+        map.connect(
+            'info_page', 
+            '/info_page',
+            controller='ckanext.odsh.controller:OdshRouteController', 
+            action='info_page'
+        )
+        map.connect(
+            'home', 
+            '/',
+            controller='ckanext.odsh.controller:OdshRouteController', 
+            action='start'
+        )
+
+        map.redirect('/dataset/{id}/resource/{resource_id}', '/dataset/{id}')         
+
+        if plugins.toolkit.asbool(config.get('ckanext.dcat.enable_rdf_endpoints', True)):
+            odsh_helpers.odsh_remove_route(map, 'dcat_catalog')
+            map.connect(
+                'dcat_catalog',
+                config.get(
+                    'ckanext.dcat.catalog_endpoint',
+                    '/catalog.{_format}'
+                ),
+                controller='ckanext.odsh.controller:OdshDCATController', 
+                action='read_catalog',
+                requirements={'_format': 'xml|rdf|n3|ttl|jsonld'}
+            )
 
         # /api ver 3 or none with matomo
         GET_POST = dict(method=['GET', 'POST'])
-        with SubMapper(map, controller='ckanext.odsh.controller:OdshApiController', path_prefix='/api{ver:/3|}', ver='/3') as m:
+        with SubMapper(
+            map, 
+            controller='ckanext.odsh.controller:OdshApiController', 
+            path_prefix='/api{ver:/3|}', 
+            ver='/3'
+        ) as m:
             m.connect('/action/{logic_function}',
                       action='action', conditions=GET_POST)
 
@@ -364,89 +289,79 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm
             m.connect('/user/logged_in', action='logged_in')
             m.connect('/user/logged_out', action='logged_out')
             m.connect('/user/logged_out_redirect', action='logged_out_page')
-            m.connect('user_datasets', '/user/{id:.*}', action='read',
+            m.connect('user_datasets', '/user/{id:(?!(generate_key|activity)).*}', action='read',
                       ckan_icon='sitemap')
 
-        map.connect('comment_datarequest', '/datarequest/new',
-                    controller='ckanext.datarequests.controllers.ui_controller:DataRequestsUI',
-                    action='new', conditions=dict(method=['GET', 'POST']), ckan_icon='comment')
-        map.connect('comment_datarequest', '/datarequest/{id}',
-                    controller='ckanext.datarequests.controllers.ui_controller:DataRequestsUI',
-                    action='comment', conditions=dict(method=['GET', 'POST']), ckan_icon='comment')
+        map.connect(
+            'comment_datarequest', 
+            '/datarequest/new',
+            controller='ckanext.datarequests.controllers.ui_controller:DataRequestsUI',
+            action='new', 
+            conditions=dict(method=['GET', 'POST']), 
+            ckan_icon='comment'
+        )
+        map.connect(
+            'comment_datarequest', 
+            '/datarequest/{id}',
+            controller='ckanext.datarequests.controllers.ui_controller:DataRequestsUI',
+            action='comment', 
+            conditions=dict(method=['GET', 'POST']), 
+            ckan_icon='comment'
+        )
+        return map
+    
+    def after_map(self, map):
         return map
 
-    def dataset_facets(self, facets_dict, package_type):
-        return OrderedDict({'organization': _('Herausgeber'),
-                            'res_format': _('Dateiformat'),
-                            'license_title': _('Lizenz'),
-                            'groups': _('Kategorie'),
-                            'openness': _('Open-Data-Eigenschaften')})
-
-    def organization_facets(self, facets_dict, organization_type, package_type):
-        return OrderedDict({'organization': _('Herausgeber'),
-                            'res_format': _('Dateiformat'),
-                            'license_title': _('Lizenz'),
-                            'groups': _('Kategorie')})
-
-    def group_facets(self, facets_dict, group_type, package_type):
-        return OrderedDict({'organization': _('Herausgeber'),
-                            'res_format': _('Dateiformat'),
-                            'license_title': _('Lizenz'),
-                            'groups': _('Kategorie')})
-
-    def _update_schema(self, schema):
-        for field in ['title', 'notes', 'license_id']:
-            schema.update({field: [toolkit.get_converter('not_empty')]})
-
-        for i, item in enumerate(schema['tags']['name']):
-            if item == toolkit.get_validator('tag_name_validator'):
-                schema['tags']['name'][i] = toolkit.get_validator(
-                    'odsh_tag_name_validator')
-        for i, item in enumerate(schema['tag_string']):
-            if item == tag_string_convert:
-                schema['tag_string'][i] = validation.tag_string_convert
-
-        schema['resources'].update({
-            'url': [toolkit.get_converter('not_empty')],
-            'format': [toolkit.get_converter('not_empty')],
-        })
-
-        schema['extras'].update({
-            'key': [
-                toolkit.get_converter('known_spatial_uri'),
-                toolkit.get_converter('validate_licenseAttributionByText'),
-            ]
-        })
-        schema.update(
-            {'__extras':  [toolkit.get_converter('odsh_validate_extras')]})
-
-        # only to make sure the spatial field is there for validation
-        # schema.update({'spatial':  [toolkit.get_converter('convert_from_extras')]})
-
-    def create_package_schema(self):
-        schema = super(OdshPlugin, self).create_package_schema()
-        self._update_schema(schema)
-        return schema
-
-    def update_package_schema(self):
-        schema = super(OdshPlugin, self).update_package_schema()
-        self._update_schema(schema)
-        return schema
-
-    def show_package_schema(self):
-        schema = super(OdshPlugin, self).show_package_schema()
-        return schema
 
-    def is_fallback(self):
-        # Return True to register this plugin as the default handler for
-        # package types not handled by any other IDatasetForm plugin.
-        return True
-
-    def package_types(self):
-        # This plugin doesn't handle any special package types, it just
-        # registers itself as the default (above).
-        return []
+    # ITemplateHelpers
+    
+    def get_helpers(self):
+        # Template helper function names should begin with the name of the
+        # extension they belong to, to avoid clashing with functions from
+        # other extensions.
+        return {'odsh_main_groups': odsh_helpers.odsh_main_groups,
+                'odsh_now': odsh_helpers.odsh_now,
+                'odsh_group_id_selected': odsh_helpers.odsh_group_id_selected,
+                'odsh_get_facet_items_dict': odsh_helpers.odsh_get_facet_items_dict,
+                'odsh_openness_score_dataset_html': odsh_helpers.odsh_openness_score_dataset_html,
+                'odsh_get_resource_details': odsh_helpers.odsh_get_resource_details,
+                'odsh_get_resource_views': odsh_helpers.odsh_get_resource_views,
+                'odsh_get_bounding_box': odsh_helpers.odsh_get_bounding_box,
+                'odsh_get_spatial_text': odsh_helpers.odsh_get_spatial_text,
+                'odsh_render_datetime': odsh_helpers.odsh_render_datetime,
+                'odsh_upload_known_formats': odsh_helpers.odsh_upload_known_formats,
+                'odsh_encodeurl': odsh_helpers.odsh_encodeurl,
+                'odsh_extract_error': odsh_helpers.odsh_extract_error,
+                'odsh_extract_error_new': odsh_helpers.odsh_extract_error_new,
+                'odsh_extract_value_from_extras': odsh_helpers.odsh_extract_value_from_extras,
+                'odsh_create_checksum': odsh_helpers.odsh_create_checksum,
+                'presorted_license_options': odsh_helpers.presorted_license_options,
+                'odsh_tracking_id': odsh_helpers.odsh_tracking_id,
+                'odsh_tracking_url': odsh_helpers.odsh_tracking_url,
+                'odsh_has_more_facets': odsh_helpers.odsh_has_more_facets,
+                'odsh_public_url': odsh_helpers.odsh_public_url,
+                'odsh_spatial_extends_available': odsh_helpers.spatial_extends_available,
+                'odsh_public_resource_url': odsh_helpers.odsh_public_resource_url,
+                'odsh_get_version_id': odsh_helpers.odsh_get_version_id,
+                'odsh_show_testbanner': odsh_helpers.odsh_show_testbanner,
+                'odsh_is_slave': odsh_helpers.odsh_is_slave,
+                'odsh_use_matomo': helpers_tpsh.use_matomo,
+                'tpsh_get_daterange_prettified': helper_pkg_dict.get_daterange_prettified,
+                'tpsh_get_language_of_package': helpers_tpsh.get_language_of_package,
+                'get_language_icon': helpers_tpsh.get_language_icon,
+                'short_name_for_category': odsh_helpers.short_name_for_category,
+                'get_spatial_for_selection': helpers_tpsh.get_spatial_for_selection,
+                'get_subject_for_selection': helpers_tpsh.get_subject_for_selection,
+                'get_language_for_selection': helpers_tpsh.get_language_for_selection,
+                'tpsh_get_resource_size': helpers_tpsh.get_resource_size,
+                'tpsh_get_address_org':helpers_tpsh.get_address_org,
+                'tpsh_get_body_mail':helpers_tpsh.get_body_mail,
+                }
 
+    
+    # IValidators
+    
     def get_validators(self):
         return validation.get_validators()
 
@@ -454,67 +369,7 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm
     # use several daterange queries agains temporal_start and temporal_end field
     # TODO: use field of type date_range in solr index instead
     def before_search(self, search_params):
-        search_params['facet.mincount'] = 0
-        extras = search_params.get('extras')
-        print(search_params)
-        if not extras:
-            # There are no extras in the search params, so do nothing.
-            return search_params
-
-        fq = search_params['fq']
-
-        start_date = None
-        end_date = None
-        try:
-            start_date = odsh_helpers.extend_search_convert_local_to_utc_timestamp(
-                extras.get('ext_startdate'))
-            end_date = odsh_helpers.extend_search_convert_local_to_utc_timestamp(
-                extras.get('ext_enddate'))
-        except:
-            return search_params
-
-        empty_range = start_date and end_date and start_date > end_date
-
-        if not start_date and not end_date:
-            return search_params
-
-        do_enclosing_query = True
-        if not start_date:
-            do_enclosing_query = False
-            start_date = '*'
-        if not end_date:
-            do_enclosing_query = False
-            end_date = '*'
-
-        start_query = '+extras_temporal_start:[{start_date} TO {end_date}]'.format(
-            start_date=start_date, end_date=end_date)
-
-        end_query = '+extras_temporal_end:[{start_date} TO {end_date}]'.format(
-            start_date=start_date, end_date=end_date)
-
-        enclosing_query = ''
-        if do_enclosing_query and not empty_range:
-            enclosing_query_start = 'extras_temporal_start:[* TO {start_date}]'.format(
-                start_date=start_date)
-
-            enclosing_query_end = 'extras_temporal_end:[{end_date} TO *]'.format(
-                end_date=end_date)
-
-            enclosing_query = ' OR ({enclosing_query_start} AND {enclosing_query_end})'.format(
-                enclosing_query_start=enclosing_query_start, enclosing_query_end=enclosing_query_end)
-
-        if end_date is '*':
-            open_end_query = '(*:* NOT extras_temporal_end:[* TO *])'
-        else:
-            open_end_query = '((*:* NOT extras_temporal_end:[* TO *]) AND extras_temporal_start:[* TO {end_date}])'.format(
-                end_date=end_date)
-
-        fq = u'{fq} ({start_query} OR {end_query} {enclosing_query} OR {open_end_query})'.format(
-            fq=fq, start_query=start_query, end_query=end_query, enclosing_query=enclosing_query, open_end_query=open_end_query)
-
-        search_params['fq'] = fq
-
-        return search_params
+        return search.before_search(search_params)
 
     scores = [['0OL'], ['0OL', '1RE'], ['0OL', '1RE', '2OF'], [
         '0OL', '1RE', '2OF', '3URI'], ['0OL', '1RE', '2OF', '3URI', '4LD']]
@@ -532,64 +387,6 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm
             if score > 0:
                 dict_pkg['openness'] = OdshPlugin.scores[score-1]
 
-    # @precondition.not_on_slave
 
-    def before_index(self, dict_pkg):
-        # make special date fields solr conform
-        fields = ["issued", "temporal_start", "temporal_end"]
-        for field in fields:
-            field = 'extras_' + field
-            if field in dict_pkg and dict_pkg[field]:
-                d = parse(dict_pkg[field])
-                dict_pkg[field] = '{0.year:04d}-{0.month:02d}-{0.day:02d}T00:00:00Z'.format(
-                    d)
-        # if 'res_format' in dict_pkg:
-        #     dict_pkg['res_format']=[e.lower() for e in dict_pkg['res_format']]
-
-        self.map_qa_score(dict_pkg)
-
-        return dict_pkg
-    
-
-    # IPackageController
 
-    def before_view(self, pkg_dict):
-        '''
-        add a key 'is_new' to pkg_dict
-        the value for this key is True if the dataset has been created within the last month
-        the value is used in the snippet package_item.html
-        '''
-        is_new = self._is_package_new(pkg_dict)
-        pkg_dict.update({'is_new':is_new})
-        return pkg_dict
-    
-    def _is_package_new(self, pkg_dict):
-        date_package_created_as_str = self._get_date_of_package_creation_from_pkg_dict(pkg_dict)
-        if date_package_created_as_str == None:
-            is_new = False
-        else:
-            date_package_created = self._get_date_from_string(date_package_created_as_str)
-            if date_package_created == None:
-                is_new = False
-            else:
-                is_new = odsh_helpers.is_within_last_month(date_package_created)
-        return is_new
-    
-    def _get_date_of_package_creation_from_pkg_dict(self, pkg_dict):
-        if 'extras' in pkg_dict:
-            extras = pkg_dict['extras']
-            issued = odsh_helpers.odsh_extract_value_from_extras(extras=extras, key='issued') # is None if issued not in extras
-            return issued
-        else:
-            return None
-    
-    def _get_date_from_string(self, date_time_str):
-        date_time_format = '%Y-%m-%dT%H:%M:%S' #e.g. u'2019-06-12T11:56:25'
-        try:
-            date_time = datetime.datetime.strptime(date_time_str, date_time_format)
-            date = date_time.date()
-        except ValueError:
-            # if date cannot be converted from string return None
-            date = None
-        return date
 
diff --git a/ckanext/odsh/plugin_odsh_autocomplete.py b/ckanext/odsh/plugin_odsh_autocomplete.py
new file mode 100644
index 00000000..e34d7f0e
--- /dev/null
+++ b/ckanext/odsh/plugin_odsh_autocomplete.py
@@ -0,0 +1,8 @@
+import ckan.plugins as plugins
+import ckanext.odsh.logic.action as action
+
+class OdshAutocompletePlugin(plugins.SingletonPlugin):
+    plugins.implements(plugins.IActions)
+
+    def get_actions(self):
+        return {'autocomplete': action.autocomplete}
\ No newline at end of file
diff --git a/ckanext/odsh/plugin_odsh_dcat_harvest.py b/ckanext/odsh/plugin_odsh_dcat_harvest.py
new file mode 100644
index 00000000..3b03b6e7
--- /dev/null
+++ b/ckanext/odsh/plugin_odsh_dcat_harvest.py
@@ -0,0 +1,65 @@
+import ckan.plugins as plugins
+import ckan.plugins.toolkit as toolkit
+from ckanext.dcat.interfaces import IDCATRDFHarvester
+from ckanext.dcatde.extras import Extras
+
+from ckanext.odsh.helper_pkg_dict import HelperPgkDict
+
+from ckan import model
+
+import ckan.plugins as p
+
+_ = toolkit._
+
+import logging
+log = logging.getLogger(__name__)
+
+
+class OdshDCATHarvestPlugin(plugins.SingletonPlugin):
+    plugins.implements(IDCATRDFHarvester, inherit=True)
+    
+    def before_update(self, harvest_object, dataset_dict, temp_dict):
+        existing_package_dict = self._get_existing_dataset(harvest_object.guid)
+        new_dataset_extras = Extras(dataset_dict['extras'])
+        if new_dataset_extras.key('modified') and \
+                new_dataset_extras.value('modified') < existing_package_dict.get('metadata_modified'):
+            log.info("Modified date of new dataset is not newer than "
+                     + "the already exisiting dataset, ignoring new one.")
+            dataset_dict.clear()
+
+    def _get_existing_dataset(self, guid):
+        '''
+        Checks if a dataset with a certain guid extra already exists
+        Returns a dict as the ones returned by package_show
+        '''
+        datasets = model.Session.query(model.Package.id) \
+                                .join(model.PackageExtra) \
+                                .filter(model.PackageExtra.key == 'guid') \
+                                .filter(model.PackageExtra.value == guid) \
+                                .filter(model.Package.state == 'active') \
+                                .all()
+
+        if not datasets:
+            return None
+        elif len(datasets) > 1:
+            log.error('Found more than one dataset with the same guid: {0}'
+                      .format(guid))
+        return p.toolkit.get_action('package_show')({}, {'id': datasets[0][0]})
+
+
+    def after_create(self, harvest_object, dataset_dict, temp_dict):
+        '''
+        Called just after a successful ``package_create`` action has been
+        performed.
+
+        This method sets relationships between packages and collections.
+        '''
+        dd = HelperPgkDict(dataset_dict)
+        if dd.is_collection():
+            dd.update_relations_to_collection_members()
+            dd.add_uri_to_store()
+        if dd.shall_be_part_of_collection():
+            dd.update_relation_to_collection()
+            dd.add_uri_to_store()
+    
+    
diff --git a/ckanext/odsh/plugin_odsh_harvest.py b/ckanext/odsh/plugin_odsh_harvest.py
new file mode 100644
index 00000000..6c7d326d
--- /dev/null
+++ b/ckanext/odsh/plugin_odsh_harvest.py
@@ -0,0 +1,48 @@
+import ckan.plugins as plugins
+import ckan.plugins.toolkit as toolkit
+import ckanext.odsh.logic.action as action
+
+
+class OdshHarvestPlugin(plugins.SingletonPlugin):
+    plugins.implements(plugins.IRoutes, inherit=True)
+    plugins.implements(plugins.IConfigurer)
+
+    def update_config(self, config_):
+        toolkit.add_template_directory(config_, 'harvest_templates')
+
+    def before_map(self, map):
+        DATASET_TYPE_NAME = 'harvest'
+        controller = 'ckanext.odsh.controller:OdshHarvestController'
+        
+        map.connect('{0}_delete'.format(DATASET_TYPE_NAME), '/' +
+                    DATASET_TYPE_NAME + '/delete/:id', controller=controller, action='delete')
+        map.connect('{0}_refresh'.format(DATASET_TYPE_NAME), '/' + DATASET_TYPE_NAME + '/refresh/:id', controller=controller,
+                    action='refresh')
+        map.connect('{0}_admin'.format(DATASET_TYPE_NAME), '/' +
+                    DATASET_TYPE_NAME + '/admin/:id', controller=controller, action='admin')
+        map.connect('{0}_about'.format(DATASET_TYPE_NAME), '/' +
+                    DATASET_TYPE_NAME + '/about/:id', controller=controller, action='about')
+        map.connect('{0}_clear'.format(DATASET_TYPE_NAME), '/' +
+                    DATASET_TYPE_NAME + '/clear/:id', controller=controller, action='clear')
+
+        map.connect('harvest_job_list', '/' + DATASET_TYPE_NAME +
+                    '/{source}/job', controller=controller, action='list_jobs')
+        map.connect('harvest_job_show_last', '/' + DATASET_TYPE_NAME +
+                    '/{source}/job/last', controller=controller, action='show_last_job')
+        map.connect('harvest_job_show', '/' + DATASET_TYPE_NAME +
+                    '/{source}/job/{id}', controller=controller, action='show_job')
+        map.connect('harvest_job_abort', '/' + DATASET_TYPE_NAME +
+                    '/{source}/job/{id}/abort', controller=controller, action='abort_job')
+
+        map.connect('harvest_object_show', '/' + DATASET_TYPE_NAME +
+                    '/object/:id', controller=controller, action='show_object')
+        map.connect('harvest_object_for_dataset_show', '/dataset/harvest_object/:id',
+                    controller=controller, action='show_object', ref_type='dataset')
+
+        org_controller = 'ckanext.harvest.controllers.organization:OrganizationController'
+        map.connect('{0}_org_list'.format(DATASET_TYPE_NAME), '/organization/' +
+                    DATASET_TYPE_NAME + '/' + '{id}', controller=org_controller, action='source_list')
+        return map
+
+    def after_map(self, map):
+        return map
\ No newline at end of file
diff --git a/ckanext/odsh/plugin_odsh_icap.py b/ckanext/odsh/plugin_odsh_icap.py
new file mode 100644
index 00000000..d6462db4
--- /dev/null
+++ b/ckanext/odsh/plugin_odsh_icap.py
@@ -0,0 +1,11 @@
+import ckan.plugins as plugins
+from ckanext.odsh.lib.uploader import ODSHResourceUpload, ODSHUpload
+
+class OdshIcapPlugin(plugins.SingletonPlugin):
+    plugins.implements(plugins.IUploader, inherit=True)
+
+    def get_resource_uploader(self, data_dict):
+        return ODSHResourceUpload(data_dict)
+    
+    def get_uploader(self, upload_to, old_filename):
+        return ODSHUpload(upload_to, old_filename)
\ No newline at end of file
diff --git a/ckanext/odsh/pretty_daterange/README.md b/ckanext/odsh/pretty_daterange/README.md
new file mode 100644
index 00000000..6fc2eaac
--- /dev/null
+++ b/ckanext/odsh/pretty_daterange/README.md
@@ -0,0 +1,62 @@
+# pretty_daterange package
+Dieses Package erlaubt die "hübsche" Darstellung von Datumsbereichen. 
+
+## Beispiel
+```
+from datetime import date
+from pretty_daterange.date_range_formatter import DateRangeFormatter
+
+drf = DateRangeFormatter(
+    date_start = date(2019, 1, 1),
+    date_end = date(2019, 3, 31)
+)
+print(drf.get_formatted_str())
+```
+prints
+```
+1. Quartal 2019
+```
+
+# Spezifikation
+Viele Datumsangaben lassen sich eleganter als TT.MM.JJJJ-TT.MM.JJJJ darstellen. Bei der Anzeige auf der Suchergebnisseite und der Datensatzdetailsseite sollen Datumsangaben nach den folgenden Regeln umgeformt werden.
+
+## Regel zum Kürzen von Datumsangaben
+### Jahr ist gleich
+Startdatum = a.b.n und Enddatum = a.b.n -> a.b.n
+
+Starddatum = 01.01.n und Enddatum = 31.12.n -> n
+
+Startdatum = 01.01.n und Enddatum = 31.01.n -> Januar n
+
+Startdatum = 01.02.n und ( Enddatum = 28.02.n oder Enddatum = 28.02.n ) -> Februar n
+
+Startdatum = 01.03.n und Enddatum = 31.03.n -> März n
+
+[...]
+
+Startdatum = 01.12.n und Enddatum = 31.12.n -> Dezember n
+
+Startdatum = 01.01.n und Enddatum = 31.03.n -> 1. Quartal n
+
+Startdatum = 01.04.n und Enddatum = 30.06.n -> 2. Quartal n
+
+Startdatum = 01.07.n und Enddatum = 30.09.n -> 3. Quartal n
+
+Startdatum = 01.10.n und Enddatum = 31.12.n -> 4. Quartal n
+
+Startdatum = 01.01.n und Enddatum = 30.06.n -> 1. Halbjahr n
+
+Startdatum = 01.07.n und Enddatum = 31.12.n -> 2. Halbjahr n
+
+Startdatum = 01.01.n und ( Enddatum = 28.02.n oder Enddatum = 28.02.n ) -> Januar bis Februar n
+
+Startdatum = 01.01.n und Enddatum = 31.03.n -> Januar bis März n
+
+[...]
+
+Startdatum = 01.01.n und Enddatum = 30.11.n -> Januar bis November n
+
+### Jahr ist unterschiedlich
+Startdatum = 01.01.n und Enddatum = 31.12.m -> n-m
+
+Stardatum = 01.a.n und Enddatum ist letzer des Monats b im Jahr m -> [Text für a] n bis [Text für b] m
diff --git a/ckanext/odsh/pretty_daterange/__init__.py b/ckanext/odsh/pretty_daterange/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/ckanext/odsh/pretty_daterange/date_range.py b/ckanext/odsh/pretty_daterange/date_range.py
new file mode 100644
index 00000000..d43d7e28
--- /dev/null
+++ b/ckanext/odsh/pretty_daterange/date_range.py
@@ -0,0 +1,181 @@
+ # -*- coding: utf-8 -*-
+
+import datetime
+
+class DateRange(object):
+    def __init__(self, date_start, date_end):
+        if date_end < date_start:
+            raise ValueError('date_end may not be before date_start')
+        self.date_start = date_start
+        self.date_end = date_end
+    
+    
+    def is_one_year(self):
+        is_one_year = (
+            self._are_start_and_end_in_same_year() and 
+            self._is_first_of_year(self.date_start) and 
+            self._is_last_of_year(self.date_end)
+        )
+        return is_one_year
+
+    
+    def _are_start_and_end_in_same_year(self):
+        in_same_year = self.date_start.year==self.date_end.year
+        return in_same_year
+    
+    
+    @staticmethod
+    def _is_first_of_year(date):
+        return date.day==1 and date.month==1
+    
+    
+    @staticmethod
+    def _is_last_of_year(date):
+        return date.day==31 and date.month==12
+
+    
+    def is_range_of_multiple_years(self):
+        is_range_of_multiple_years = (
+            not self._are_start_and_end_in_same_year() and 
+            self._is_first_of_year(self.date_start) and 
+            self._is_last_of_year(self.date_end)
+        )
+        return is_range_of_multiple_years
+    
+    def is_one_half_of_year(self):
+        is_one_half_year = (
+            self._are_start_and_end_in_same_half_year() and
+            self._is_first_of_half_year(self.date_start) and
+            self._is_last_of_half_year(self.date_end)
+        )
+        return is_one_half_year
+    
+    
+    def _are_start_and_end_in_same_half_year(self):
+        in_same_half_year = (
+            self._are_start_and_end_in_same_year() and
+            self.get_half_year(self.date_start) == self.get_half_year(self.date_end)
+        )
+        return in_same_half_year
+    
+    
+    @staticmethod
+    def get_half_year(date):
+        year = date.year
+        if date < datetime.date(year, 7, 1):
+            return 1
+        return 2
+    
+    
+    @staticmethod
+    def _is_first_of_half_year(date):
+        year = date.year
+        return date in (
+            datetime.date(year, 1, 1),
+            datetime.date(year, 7, 1),
+        )
+    
+    
+    @staticmethod
+    def _is_last_of_half_year(date):
+        year = date.year
+        return date in (
+            datetime.date(year, 6, 30),
+            datetime.date(year, 12, 31),
+        )
+    
+    
+    def is_one_quarter_of_year(self):
+        is_one_quarter_of_year = (
+            self._are_start_and_end_in_same_quarter() and
+            self._is_first_of_quarter(self.date_start) and
+            self._is_last_of_quarter(self.date_end)
+        )
+        return is_one_quarter_of_year
+    
+    
+    def _are_start_and_end_in_same_quarter(self):
+        in_same_quarter = (
+            self._are_start_and_end_in_same_year() and
+            self.get_quarter(self.date_start) == self.get_quarter(self.date_end)
+        )
+        return in_same_quarter
+
+    
+    @staticmethod
+    def get_quarter(date):
+        year = date.year
+        if date < datetime.date(year, 4, 1):
+            return 1
+        if date < datetime.date(year, 7, 1):
+            return 2
+        if date < datetime.date(year, 10, 1):
+            return 3
+        return 4
+    
+    
+    @staticmethod
+    def _is_first_of_quarter(date):
+        year = date.year
+        return date in (
+            datetime.date(year, 1, 1),
+            datetime.date(year, 4, 1),
+            datetime.date(year, 7, 1),
+            datetime.date(year, 10, 1),
+        )
+    
+    
+    @staticmethod
+    def _is_last_of_quarter(date):
+        year = date.year
+        return date in (
+            datetime.date(year, 3, 31),
+            datetime.date(year, 6, 30),
+            datetime.date(year, 9, 30),
+            datetime.date(year, 12, 31),
+        )
+    
+    
+    def is_one_month(self):
+        is_one_month = (
+            self._are_start_and_end_in_same_year() and
+            self._are_start_and_end_in_same_month() and
+            self._is_first_of_month(self.date_start) and 
+            self._is_last_of_month(self.date_end)
+        )
+        return is_one_month
+    
+    
+    def _are_start_and_end_in_same_month(self):
+        is_in_same_month = self.date_start.month == self.date_end.month
+        return is_in_same_month
+
+    
+    @staticmethod
+    def _is_first_of_month(date):
+        return date.day==1
+    
+    
+    @staticmethod
+    def _is_last_of_month(date):
+        day_after_date = date + datetime.timedelta(days=1)
+        is_last_of_month = day_after_date.day==1
+        return is_last_of_month
+    
+    def is_range_of_multiple_months(self):
+        is_range_of_multiple_months = (
+            self._is_first_of_month(self.date_start) and 
+            self._is_last_of_month(self.date_end) and
+            not self._are_start_and_end_in_same_month()
+        )
+        return is_range_of_multiple_months
+    
+    def is_range_of_multiple_months_in_same_year(self):
+        is_range_of_multiple_months_in_same_year = (
+            self._is_first_of_month(self.date_start) and 
+            self._is_last_of_month(self.date_end) and
+            not self._are_start_and_end_in_same_month() and
+            self._are_start_and_end_in_same_year()
+        )
+        return is_range_of_multiple_months_in_same_year
+    
diff --git a/ckanext/odsh/pretty_daterange/date_range_formatter.py b/ckanext/odsh/pretty_daterange/date_range_formatter.py
new file mode 100644
index 00000000..dcd513f3
--- /dev/null
+++ b/ckanext/odsh/pretty_daterange/date_range_formatter.py
@@ -0,0 +1,99 @@
+ # -*- coding: utf-8 -*-
+
+import datetime
+from babel.dates import format_date
+
+from .date_range import DateRange
+
+class DateRangeFormatter(object):
+    def __init__(self, date_start, date_end):
+        if all((date_start, date_end)):
+            self._date_range = DateRange(date_start, date_end)
+        self.locale_for_date_strings = 'de_DE.UTF-8'
+        self.date_start = date_start
+        self.date_end = date_end
+        self._format_full_date = 'dd.MM.yyyy'
+        self._format_only_year = 'yyyy'
+        self._format_month_year = 'MMMM yyyy'
+        self._format_only_month = 'MMMM'
+    
+    
+    def get_formatted_str(self):
+        if not any((self.date_start, self.date_end, )):
+            return self._construct_empty_date_string()
+        
+        if not self.date_end:
+            return self._construct_open_end_date_string()
+        
+        if not self.date_start:
+            return self._construct_open_start_date_string()
+        
+        if self.date_start == self.date_end:
+            return self._construct_single_date_string(self.date_start, self._format_full_date)
+        
+        if self._date_range.is_range_of_multiple_years():
+            return self._construct_date_range_string(self._format_only_year, self._format_only_year)
+        
+        if self._date_range.is_one_year():
+            return self._construct_single_date_string(self.date_start, self._format_only_year)
+        
+        if self._date_range.is_one_half_of_year():
+            return self._construct_half_of_year_date_string()
+        
+        if self._date_range.is_one_quarter_of_year():
+            return self._construct_quarter_of_year_date_string()
+
+        if self._date_range.is_range_of_multiple_months_in_same_year():
+            return self._construct_date_range_string(self._format_only_month, self._format_month_year)
+        
+        if self._date_range.is_range_of_multiple_months():
+            return self._construct_date_range_string(self._format_month_year, self._format_month_year)
+
+        if self._date_range.is_one_month():
+            return self._construct_single_date_string(self.date_start, self._format_month_year)
+        
+        format_date_start = self._format_full_date
+        format_date_end = self._format_full_date
+        formatted_date_range = self._construct_date_range_string(format_date_start, format_date_end)
+        return formatted_date_range
+    
+    
+    @staticmethod
+    def _construct_empty_date_string():
+        return ""
+    
+    def _construct_open_end_date_string(self):
+        date_start_formatted = self._construct_single_date_string(self.date_start, self._format_full_date)
+        return "ab {}".format(date_start_formatted)
+    
+    def _construct_open_start_date_string(self):
+        date_end_formatted = self._construct_single_date_string(self.date_end, self._format_full_date)
+        return "bis {}".format(date_end_formatted)
+    
+    def _construct_single_date_string(self, date, format):
+        return format_date(date, format=format, locale=self.locale_for_date_strings)
+
+    @staticmethod
+    def _as_utf_8(s):
+        return u'' + s.decode('utf-8')
+    
+    
+    def _construct_half_of_year_date_string(self):
+        year = self.date_start.year
+        half = self._date_range.get_half_year(self.date_start)
+        half_of_year_date_string = u'{}. Halbjahr {}'.format(half, year)
+        return DateRangeFormatter._as_utf_8(half_of_year_date_string)
+    
+    
+    def _construct_quarter_of_year_date_string(self):
+        year = self.date_start.year
+        quarter = self._date_range.get_quarter(self.date_start)
+        quarter_of_year_date_string = u'{}. Quartal {}'.format(quarter, year)
+        return DateRangeFormatter._as_utf_8(quarter_of_year_date_string)
+
+    
+    def _construct_date_range_string(self, format_date_start, format_date_end):
+        formatted_date_range = u'{} - {}'.format(
+            self._construct_single_date_string(self.date_start, format_date_start), 
+            self._construct_single_date_string(self.date_end, format_date_end))
+        return formatted_date_range
diff --git a/ckanext/odsh/profiles/__init__.py b/ckanext/odsh/profiles/__init__.py
new file mode 100644
index 00000000..f87530b7
--- /dev/null
+++ b/ckanext/odsh/profiles/__init__.py
@@ -0,0 +1,2 @@
+from odsh_dcat_de_profile import ODSHDCATdeProfile
+from odsh_european_dcatap_profile import ODSHEuropeanDCATAPProfile
\ No newline at end of file
diff --git a/ckanext/odsh/profiles/odsh_dcat_de_profile.py b/ckanext/odsh/profiles/odsh_dcat_de_profile.py
new file mode 100644
index 00000000..c475ac6a
--- /dev/null
+++ b/ckanext/odsh/profiles/odsh_dcat_de_profile.py
@@ -0,0 +1,169 @@
+import rdflib
+
+from ckan.common import config
+import ckan.lib.helpers as helpers
+import ckan.model as model
+from ckanext.dcat.profiles import DCT
+from ckanext.dcat.utils import resource_uri
+import ckanext.dcatde.dataset_utils as ds_utils
+from ckanext.dcatde.profiles import DCATdeProfile, DCATDE, DCAT, DCATDE_1_0
+
+import ckanext.odsh.helpers_tpsh as helpers_tpsh
+import ckanext.odsh.collection.helpers as helpers_collection
+from ckanext.odsh.helper_pkg_dict import HelperPgkDict
+
+
+DCT = rdflib.namespace.Namespace("http://purl.org/dc/terms/")
+DCAT = rdflib.namespace.Namespace("http://www.w3.org/ns/dcat#")
+
+
+class ODSHDCATdeProfile(DCATdeProfile):
+
+    # from RDF
+
+    def parse_dataset(self, dataset_dict, dataset_ref):
+        dataset_dict = super(ODSHDCATdeProfile, self).parse_dataset(
+            dataset_dict, dataset_ref
+        )
+        self._parse_distributions(dataset_dict, dataset_ref)
+        self._parse_type(dataset_dict, dataset_ref)
+        if self._belongs_to_collection(dataset_dict, dataset_ref):
+            self._mark_for_adding_to_ckan_collection(dataset_dict, dataset_ref)
+        return dataset_dict
+    
+    def _parse_distributions(self, dataset_dict, dataset_ref):
+        for distribution in self.g.objects(dataset_ref, DCAT.distribution):
+            for resource_dict in dataset_dict.get('resources', []):
+                # Match distribution in graph and distribution in ckan-dict
+                if unicode(distribution) == resource_uri(resource_dict):
+                    for namespace in [DCATDE, DCATDE_1_0]:
+                        value = self._object_value(
+                            distribution, namespace.licenseAttributionByText)
+                        if value:
+                            ds_utils.insert_new_extras_field(
+                                dataset_dict, 'licenseAttributionByText', value)
+                            return
+    
+    def _parse_type(self, dataset_dict, dataset_ref):
+        dct_type = self._object(dataset_ref, DCT.type)
+        if dct_type:
+            ckan_type = helpers_tpsh.map_dct_type_to_ckan_type(str(dct_type))
+            dataset_dict.update({'type': ckan_type})
+    
+    def _belongs_to_collection(self, dataset_dict, dataset_ref):
+        dct_is_version_of = self._object(dataset_ref, DCT.isVersionOf)
+        belongs_to_collection = True if dct_is_version_of else False
+        return belongs_to_collection
+    
+    def _mark_for_adding_to_ckan_collection(self, dataset_dict, dataset_ref):
+        dataset_dict.update({'add_to_collection': True})
+
+    
+    # to RDF    
+    
+    def graph_from_dataset(self, dataset_dict, dataset_ref):
+        '''
+        this class inherits from ODSHDCATdeProfile
+        it has been extended to add information to
+        the rdf export
+
+        '''
+        super(ODSHDCATdeProfile, self).graph_from_dataset(
+            dataset_dict, dataset_ref)
+        self._add_contributor_id(dataset_dict, dataset_ref)
+        self._add_license_attribution_by_text(dataset_dict, dataset_ref)
+        self._add_type(dataset_dict, dataset_ref)
+        if self._is_dataset_collection(dataset_dict):
+            self._remove_predefined_collection_members()
+            self._add_collection_members(dataset_dict, dataset_ref)
+        if self._dataset_belongs_to_collection(dataset_dict):
+            self._add_collection(dataset_dict, dataset_ref)
+    
+    def _add_contributor_id(self, dataset_dict, dataset_ref):
+        contributorID = 'http://dcat-ap.de/def/contributors/schleswigHolstein'
+        self.g.add(
+            (dataset_ref, DCATDE.contributorID, 
+                rdflib.URIRef(contributorID)
+            )
+        )
+    
+    def _add_license_attribution_by_text(self, dataset_dict, dataset_ref):
+        licenseAttributionByText = self._get_dataset_value(dataset_dict, 'licenseAttributionByText')
+        if licenseAttributionByText:
+            self.g.set(
+                (dataset_ref, DCATDE.licenseAttributionByText, rdflib.Literal(licenseAttributionByText))
+            )
+            for distribution in self.g.objects(dataset_ref, DCAT.distribution):
+                self.g.set(
+                    (distribution, DCATDE.licenseAttributionByText, rdflib.Literal(licenseAttributionByText))
+                )
+    
+    def _add_type(self, dataset_dict, dataset_ref):
+        '''
+        adds the type if there is a known mapping from ckan type to
+        dct:type
+        '''
+        ckan_type = self._get_ckan_type(dataset_dict)
+        dct_type = helpers_tpsh.map_ckan_type_to_dct_type(ckan_type)
+        if dct_type:
+            self.g.set(
+                (dataset_ref, DCT.type, 
+                    rdflib.URIRef(dct_type)
+                )
+            )
+    
+    def _get_ckan_type(self, dataset_dict):
+        ckan_type = self._get_dataset_value(dataset_dict, 'type')
+        return ckan_type
+    
+    def _remove_predefined_collection_members(self):
+        for s, p, o in self.g:
+            if p==DCT.hasVersion:
+                self.g.remove((s, p, o))
+    
+    def _add_collection_members(self, dataset_dict, dataset_ref):
+        dataset_refs_belonging_to_collection = self._get_dataset_refs_belonging_to_collection(dataset_dict)
+        for ref in dataset_refs_belonging_to_collection:
+            self.g.add(
+                (dataset_ref, DCT.hasVersion, rdflib.URIRef(ref))
+            )
+    
+    def _is_dataset_collection(self, dataset_dict):
+        ckan_type = self._get_ckan_type(dataset_dict)
+        is_collection = ckan_type=='collection'
+        return is_collection
+    
+    def _get_dataset_refs_belonging_to_collection(self, dataset_dict):
+        dataset_names = helpers_collection.get_all_datasets_belonging_to_collection(
+            collection_name = dataset_dict.get('id')
+        )
+        dataset_dicts = [model.Package.get(name).as_dict() for name in dataset_names]
+        dataset_ids = [dataset_dict.get('id') for dataset_dict in dataset_dicts]
+        dataset_refs = [self._construct_refs(id) for id in dataset_ids]
+        return dataset_refs
+    
+    @staticmethod
+    def _construct_refs(id):
+        public_url = config.get('ckan.site_url')
+        url_to_id = helpers.url_for(controller='package', action ='read', id=id)
+        ref = public_url + url_to_id
+        return ref
+    
+    def _dataset_belongs_to_collection(self, dataset_dict):
+        '''
+        returns True if a containing collection is found
+        '''
+        if dataset_dict.get('type')=='collection':
+            return False
+        id_dataset = dataset_dict.get('id')
+        collection_name = helpers_collection.get_collection_name_by_dataset(id_dataset)
+        return collection_name is not None
+
+    def _add_collection(self, dataset_dict, dataset_ref):
+        collection_id = HelperPgkDict(dataset_dict).get_collection_id()
+        collection_uri = self._construct_refs(collection_id)
+        self.g.set(
+            (dataset_ref, DCT.isVersionOf, 
+                rdflib.URIRef(collection_uri)
+            )
+        )
diff --git a/ckanext/odsh/profiles.py b/ckanext/odsh/profiles/odsh_european_dcatap_profile.py
similarity index 70%
rename from ckanext/odsh/profiles.py
rename to ckanext/odsh/profiles/odsh_european_dcatap_profile.py
index d9532758..544323bd 100644
--- a/ckanext/odsh/profiles.py
+++ b/ckanext/odsh/profiles/odsh_european_dcatap_profile.py
@@ -1,20 +1,10 @@
-from ckanext.dcatde.profiles import DCATdeProfile, DCATDE, DCAT, VCARD, dcat_theme_prefix, DCATDE_1_0
-from ckanext.dcat.utils import resource_uri
-from ckanext.dcat.profiles import EuropeanDCATAPProfile, DCT, URIRefOrLiteral
-from ckan.model.license import LicenseRegister
-import rdflib
-import ckanext.dcatde.dataset_utils as ds_utils
 import logging
-from ckan.plugins import toolkit
-from ckan.common import config, json
-from ckanext.dcat.interfaces import IDCATRDFHarvester
-import pdb
+import rdflib
 
-import sys
-if sys.version_info[0] == 2:
-    import urllib2
-elif sys.version_info[0] == 3:  # >=Python3.1
-    import urllib
+from ckan.common import config, json
+from ckan.model.license import LicenseRegister
+from ckanext.dcat.profiles import EuropeanDCATAPProfile, DCT, URIRefOrLiteral
+from ckanext.dcatde.profiles import DCAT
 
 log = logging.getLogger(__name__)
 DCT = rdflib.namespace.Namespace("http://purl.org/dc/terms/")
@@ -75,51 +65,10 @@ class ODSHEuropeanDCATAPProfile(EuropeanDCATAPProfile):
             for dist in self.g.objects(dataset_ref, DCAT.distribution):
                 self.g.add((dist, DCT.license, rdflib.URIRef(license)))
 
-class ODSHDCATdeProfile(DCATdeProfile):
-    def parse_dataset(self, dataset_dict, dataset_ref):
-        dataset_dict = super(ODSHDCATdeProfile, self).parse_dataset(
-            dataset_dict, dataset_ref)
-        # Enhance Distributions
-        for distribution in self.g.objects(dataset_ref, DCAT.distribution):
-            for resource_dict in dataset_dict.get('resources', []):
-                # Match distribution in graph and distribution in ckan-dict
-                if unicode(distribution) == resource_uri(resource_dict):
-                    for namespace in [DCATDE, DCATDE_1_0]:
-                        value = self._object_value(
-                            distribution, namespace.licenseAttributionByText)
-                        if value:
-                            ds_utils.insert_new_extras_field(
-                                dataset_dict, 'licenseAttributionByText', value)
-                            return dataset_dict
-        return dataset_dict
-
-    def graph_from_dataset(self, dataset_dict, dataset_ref):
-        super(ODSHDCATdeProfile, self).graph_from_dataset(
-            dataset_dict, dataset_ref)
-        # Enhance Distributions
-        # <dcatde:contributorID rdf:resource="http://dcat-ap.de/def/contributors/schleswigHolstein"/>
-        self.g.add((dataset_ref, DCATDE.contributorID, rdflib.URIRef(
-            "http://dcat-ap.de/def/contributors/schleswigHolstein")))
-
-        extras = dataset_dict.get('extras', None)
-        if extras:
-            attr = None
-            for d in extras:
-                if d['key'] == 'licenseAttributionByText':
-                    attr = d['value']
-                    break
-            if attr:
-                self.g.set(
-                    (dataset_ref, DCATDE.licenseAttributionByText, rdflib.Literal(attr)))
-                for dist in self.g.objects(dataset_ref, DCAT.distribution):
-                    self.g.set(
-                        (dist, DCATDE.licenseAttributionByText, rdflib.Literal(attr)))
-
 
 _RESOURCE_FORMATS_IMPORT = None
 _RESOURCE_FORMATS_EXPORT = None
 
-
 def resource_formats():
     global _RESOURCE_FORMATS_IMPORT
     global _RESOURCE_FORMATS_EXPORT
@@ -142,14 +91,12 @@ def resource_formats():
             _RESOURCE_FORMATS_EXPORT[elem.split('/')[-1]] = elem
             _RESOURCE_FORMATS_IMPORT[elem] = elem.split('/')[-1]
 
-
 def resource_formats_export():
     global _RESOURCE_FORMATS_EXPORT
     if not _RESOURCE_FORMATS_EXPORT:
         resource_formats()
     return _RESOURCE_FORMATS_EXPORT
 
-
 def resource_formats_import():
     global _RESOURCE_FORMATS_IMPORT
     if not _RESOURCE_FORMATS_IMPORT:
@@ -159,7 +106,6 @@ def resource_formats_import():
 
 _LANGUAGES = None
 
-
 def get_language():
     ''' When datasets are exported in rdf-format, their language-tag
     should be given as
@@ -190,4 +136,4 @@ def get_language():
             for language_line in language_mapping_table:
                 _LANGUAGES[language_line[0]] = language_line[1]
 
-    return _LANGUAGES
+    return _LANGUAGES
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/icon_arrow_left.svg b/ckanext/odsh/public/base/images/icon_arrow_left.svg
new file mode 100644
index 00000000..b6444d84
--- /dev/null
+++ b/ckanext/odsh/public/base/images/icon_arrow_left.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="19.692" viewBox="0 0 16 19.692"><defs><style>.a{fill:#fff;}</style></defs><path class="a" d="M23,8.923v9.846H16.846v4.923L7,13.846,16.846,4V8.923Z" transform="translate(-7 -4)"/></svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/icon_arrow_right.svg b/ckanext/odsh/public/base/images/icon_arrow_right.svg
new file mode 100644
index 00000000..8100a084
--- /dev/null
+++ b/ckanext/odsh/public/base/images/icon_arrow_right.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="19.692" viewBox="0 0 16 19.692"><defs><style>.a{fill:#fff;}</style></defs><path class="a" d="M13.154,8.923V4L23,13.846l-9.846,9.846V18.769H7V8.923Z" transform="translate(-7 -4)"/></svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/icon_close.svg b/ckanext/odsh/public/base/images/icon_close.svg
new file mode 100644
index 00000000..37a57bf1
--- /dev/null
+++ b/ckanext/odsh/public/base/images/icon_close.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="18" height="17.999" viewBox="0 0 18 17.999"><defs><style>.a{fill:#444;}</style></defs><g transform="translate(-3910 -11)"><path class="a" d="M101.5,172.4l-.885-.885-3.553,3.552-3.706-3.706-.9.9,3.7,3.709L92.6,179.524l.447.449.438.436,3.558-3.556,3.549,3.551.9-.9-3.553-3.551Z" transform="translate(3821.947 -156.081)"/><path class="a" d="M96.6,167.766a7.877,7.877,0,1,0,7.877,7.876,7.888,7.888,0,0,0-7.877-7.876m0,16.875a9,9,0,1,1,9-9,9.009,9.009,0,0,1-9,9" transform="translate(3822.398 -155.642)"/></g></svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/icon_close_white.svg b/ckanext/odsh/public/base/images/icon_close_white.svg
new file mode 100644
index 00000000..aebfd442
--- /dev/null
+++ b/ckanext/odsh/public/base/images/icon_close_white.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="18" height="17.999" viewBox="0 0 18 17.999"><defs><style>.a{fill:#fff;}</style></defs><g transform="translate(-87.602 -166.642)"><path class="a" d="M101.5,172.4l-.885-.885-3.553,3.552-3.706-3.706-.9.9,3.7,3.709L92.6,179.524l.447.449.438.436,3.558-3.556,3.549,3.551.9-.9-3.553-3.551Z" transform="translate(-0.451 -0.439)"/><path class="a" d="M96.6,167.766a7.877,7.877,0,1,0,7.877,7.876,7.888,7.888,0,0,0-7.877-7.876m0,16.875a9,9,0,1,1,9-9,9.009,9.009,0,0,1-9,9" transform="translate(0 0)"/></g></svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/icon_funnel.svg b/ckanext/odsh/public/base/images/icon_funnel.svg
new file mode 100644
index 00000000..f5ae5fc4
--- /dev/null
+++ b/ckanext/odsh/public/base/images/icon_funnel.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="19.528" height="18" viewBox="0 0 19.528 18"><defs><style>.a{fill:#fff;}</style></defs><path class="a" d="M19.471,10.022a.592.592,0,0,0-.535-.339H.591a.592.592,0,0,0-.457.968L7.187,19.2v7.887a.592.592,0,0,0,.855.53L12,25.658a.592.592,0,0,0,.329-.53L12.34,19.2l7.052-8.553A.592.592,0,0,0,19.471,10.022Zm-8.179,8.593a.592.592,0,0,0-.135.376l-.008,5.769L8.37,26.137V18.992a.592.592,0,0,0-.135-.377L1.847,10.867H17.681Z" transform="translate(0 -9.683)"/></svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/icon_info.svg b/ckanext/odsh/public/base/images/icon_info.svg
new file mode 100644
index 00000000..61cfea80
--- /dev/null
+++ b/ckanext/odsh/public/base/images/icon_info.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><defs><style>.a{fill:#fff;}</style></defs><path class="a" d="M12,2A10,10,0,1,1,2,12,10.011,10.011,0,0,1,12,2Zm0-2A12,12,0,1,0,24,12,12,12,0,0,0,12,0Zm0,5.75A1.25,1.25,0,1,1,10.75,7,1.251,1.251,0,0,1,12,5.75ZM14,18H10V17c.484-.179,1-.2,1-.735V11.8c0-.534-.516-.618-1-.8V10h3v6.265c0,.535.517.558,1,.735Z"/></svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/icon_lang_danish.png b/ckanext/odsh/public/base/images/icon_lang_danish.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a6a9f60bfaa2ab1e7f448063810e93b6a427d1f
GIT binary patch
literal 209
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjT%
z9iA?ZAr`&K2@=~HK5pK%Q<?ejf14D?dD7~V5)u*;``C{e{n=aBy+F~Yho?AFLh}D<
zLjwc02U|KPPF&#l|G%+Jg3^jE4}%{(Nk9Joum4kj%F*s>%#lx_m*+G#GMc9CSU*1@
zA)&$L|9<K1ogc0x@Z`K|6=Y^U%+1Eu#ymyh(2)}#TCC1VPGMkhjfszN&$zsRfq{X+
M)78&qol`;+0BDI!)Bpeg

literal 0
HcmV?d00001

diff --git a/ckanext/odsh/public/base/images/icon_lang_english.png b/ckanext/odsh/public/base/images/icon_lang_english.png
new file mode 100644
index 0000000000000000000000000000000000000000..5999e319634f3a4c68006c44c828ddcc441bafb6
GIT binary patch
literal 676
zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4mJh`hOl#e;S3B6EX7WqAsieW95oy%9SjUi
z(Vi}jAr`%NC%xC7S}1YMzJK0igPyY{GtIJt>%KTI4brs_>o(^+y{fZdg=fyiO+Kj?
zT_*ZiZrqxbvRwYswJTYVe1-QKJaUyW<~jam&0)*)V&^Y&ms<4JANcxi-}=}4)>Yqs
z&zmiF==_Tp7tTtZeR^p6;X7AKq9?92ynQ0;oa00llaHY`885azGET1XSh@SivOjyG
zHeR&6@j4<cFT^c{V_&Ociv63Ul%z64*GS8|m(R|V={H<-Z0m|G`77Vg%@+P#C8N3R
zzJKm-h3YrEen!o5jQYx;E32$MtEFoF@+(WZ`yJv-4tCBtk>Q$ekj$K5a<+KY>A5+F
z43?~3*}rM==bN5pH`Z;I=vc&?uUGN$#t)|dlWxb%|DyP##<;3^%Z}Qti_=*g1?T;f
zE+`lC{AiM3Z{6&iBeP4nJwSzX`zEfOsjMw`e`{pFN{`8p`gbMLsXic}Nl8cYFaOH*
z{I1hBa&tuZHu0u(dI)tXtkDWekxY?vofLNUL|4;~7cr(xo0h(OmExT?NB+?ThD%pW
zf`3+OOgb_x|E|PrDZ|~nf{ovF9Ne-&q^%+1;)UeQBW=~e6JE62S<1!!kc>Jj?fL8U
z-KtM>JD3x5=KplO@|ub3@8yfz`lHt5FwBt&*`sam_p~pwt?2X4MO_avdgT^Z-V-uP
z|93XAl>4N7%ANO93#XsI!s_?v(F!JqHG8TiyomKX6MpykRekfWW8aOkzA9h4P<QF#
z&E?O}xtdN~Cbw;t{inDujyAsck3^)z-Tu5p%gc(bapzJ^#+Ik7-OKHa5}&;3HCw0p
mZpnf@64On-YGjMoGaTLYSgXtQW)lMg1B0ilpUXO@geCx9VnJsB

literal 0
HcmV?d00001

diff --git a/ckanext/odsh/public/base/images/icon_latest.svg b/ckanext/odsh/public/base/images/icon_latest.svg
new file mode 100644
index 00000000..a2741441
--- /dev/null
+++ b/ckanext/odsh/public/base/images/icon_latest.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="17.999" height="18" viewBox="0 0 17.999 18"><defs><style>.a{fill:#fff;}</style></defs><path class="a" d="M21,10.12H14.22L16.96,7.3a7.039,7.039,0,0,0-9.88-.1,6.875,6.875,0,0,0,0,9.79,7.02,7.02,0,0,0,9.88,0A6.513,6.513,0,0,0,19,12.1h2a9.341,9.341,0,0,1-2.64,6.29,9.054,9.054,0,0,1-12.72,0A8.84,8.84,0,0,1,5.62,5.81a8.987,8.987,0,0,1,12.65,0L21,3ZM12.5,8v4.25L16,14.33l-.72,1.21L11,13V8Z" transform="translate(-3.001 -3)"/></svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/icon_phone.svg b/ckanext/odsh/public/base/images/icon_phone.svg
new file mode 100644
index 00000000..3f8189d6
--- /dev/null
+++ b/ckanext/odsh/public/base/images/icon_phone.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 52.5 (67469) - http://www.bohemiancoding.com/sketch -->
+    <title>local_phone</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Rounded" transform="translate(-341.000000, -3213.000000)">
+            <g id="Maps" transform="translate(100.000000, 3068.000000)">
+                <g id="-Round-/-Maps-/-local_phone" transform="translate(238.000000, 142.000000)">
+                    <g>
+                        <polygon id="Path" points="0 0 24 0 24 24 0 24"></polygon>
+                        <path d="M19.23,15.26 L16.69,14.97 C16.08,14.9 15.48,15.11 15.05,15.54 L13.21,17.38 C10.38,15.94 8.06,13.63 6.62,10.79 L8.47,8.94 C8.9,8.51 9.11,7.91 9.04,7.3 L8.75,4.78 C8.63,3.77 7.78,3.01 6.76,3.01 L5.03,3.01 C3.9,3.01 2.96,3.95 3.03,5.08 C3.56,13.62 10.39,20.44 18.92,20.97 C20.05,21.04 20.99,20.1 20.99,18.97 L20.99,17.24 C21,16.23 20.24,15.38 19.23,15.26 Z" id="🔹-Icon-Color" fill="#003064"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/base/images/logo-quer.png b/ckanext/odsh/public/base/images/logo-quer.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3baa7b1f60ef757a92924772fe7bd160c68dcc2
GIT binary patch
literal 15695
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
aanrp&7q=!#C^0ZFFnGH9xvX<aXaWGPE37*J

literal 0
HcmV?d00001

diff --git a/ckanext/odsh/public/base/images/logo-quer@2x.png b/ckanext/odsh/public/base/images/logo-quer@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a77936ab8710e3a940e9f93d859a3992525d719
GIT binary patch
literal 52446
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

literal 0
HcmV?d00001

diff --git a/ckanext/odsh/public/base/images/platzhalter.svg b/ckanext/odsh/public/base/images/platzhalter.svg
new file mode 100644
index 00000000..746fb202
--- /dev/null
+++ b/ckanext/odsh/public/base/images/platzhalter.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg10"
+   xml:space="preserve"
+   width="793.70074"
+   height="1122.5197"
+   viewBox="0 0 793.70074 1122.5197"
+   sodipodi:docname="platzhalter.svg"
+   inkscape:version="0.92.4 (unknown)"><metadata
+     id="metadata16"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs14" /><sodipodi:namedview
+     pagecolor="#f1f1f1;"
+     bordercolor="#f1f1f1;"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1855"
+     inkscape:window-height="1056"
+     id="namedview12"
+     showgrid="false"
+     inkscape:zoom="0.81423964"
+     inkscape:cx="205.87465"
+     inkscape:cy="561.25983"
+     inkscape:window-x="65"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g18" /><g
+     id="g18"
+     inkscape:groupmode="layer"
+     inkscape:label="plazthalter"
+     transform="matrix(1.3333333,0,0,-1.3333333,0,1122.5197)"><g
+       id="g20"><g
+         id="g22"
+         transform="matrix(1,0,0,-1,0,841.88977)"><path
+           d="M 2.145,1.891 H 597.856 V 844.032 H 2.145 Z"
+           style="fill:#f1f1f1;fill-opacity:1;fill-rule:nonzero;stroke:#c8b7b7;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           id="path24"
+           inkscape:connector-curvature="0" /></g></g></g></svg>
\ No newline at end of file
diff --git a/ckanext/odsh/public/odsh.css b/ckanext/odsh/public/odsh.css
index de9f959d..cb3f12fa 100644
--- a/ckanext/odsh/public/odsh.css
+++ b/ckanext/odsh/public/odsh.css
@@ -1,11 +1,5 @@
 /* FONTS */
 
-@media (max-width: 767px){
-.span9 {
-    width: 100%;
-}
-}
-
 @font-face{
     font-family:"MuseoSans";
     src:url("/base/fonts/Fonts/905300/fd479df2-01b0-4e3a-a411-915c477f1352.eot?#iefix");
@@ -29,6 +23,17 @@ html,body {
     height: 100%;
 }
 
+@media (max-width: 767px) {
+    body {
+        padding-left: 0px;
+        padding-right: 0px;
+    } 
+
+    .hide-on-mobile {
+        display: none;
+    }
+}
+
 /* FROM: https://stackoverflow.com/questions/2610497/change-an-html5-inputs-placeholder-color-with-css */
 /* do not group these rules */
 *::-webkit-input-placeholder {
@@ -64,7 +69,8 @@ input, button, select, textarea {
 
 h1{
     color:#003064;
-    font-weight: normal ;
+    font-size: 38px;
+    font-weight: 500;
 }
 
 h3{
@@ -73,6 +79,18 @@ h3{
     font-size:20px;
 }
 
+.skip-link {
+    position: fixed;
+    top: -200px;
+    text-decoration: none;
+    padding: 10px;
+    display: inline-block;
+  }
+
+.skip-link:focus {
+    top: 0;
+}
+
 .secondary h1.heading {
     color:black;
     font-weight: normal ;
@@ -83,19 +101,74 @@ h3{
 
 /* same width as schleswig-holstein.de */
 .container {
-    width: 960px;
+    max-width: 960px;
 }
-@media (max-width: 767px){
-.container {
-    width: 100%;
+
+
+@media (max-width: 1023px){
+    .container,
+    .masthead .container
+    {
+        padding-right: 80px;
+        padding-left: 80px;
+        box-sizing: border-box;
+        max-width: 100%;
+        width: auto;
+    }
 }
+
+@media (max-width: 767px) {
+    .container
+    {
+        padding-right: 15px;
+        padding-left: 15px;
+    }
+    .masthead .container
+    {
+        padding-right: 0;
+        padding-left: 0;
+    }
 }
 
 .search-form, .odsh-dataset-heading {
+    display: flex;
+    align-items: center;
+    flex-wrap: wrap;
     border-bottom: 4px solid #dbdbdb;
-    padding-bottom: 5px;
+    padding-bottom: 26px;
+    margin-bottom: 0px;
 }
 
+@media (min-width: 1024px){
+    .search-form, .odsh-dataset-heading {
+        border-bottom: none;
+        margin-bottom: 0px;
+        margin-left: -15px;
+        margin-right: -15px;
+        padding-bottom: 0;
+    }
+
+    .search-form:after {
+        content: ""; 
+        display: block; 
+        margin: 0 auto; 
+        width: calc(100% - 30px); 
+        padding-top: 25px; 
+        border-bottom: 4px solid #dbdbdb; 
+        order: 100;
+    }
+
+    .search-form h2 {
+        margin-left: 15px;
+    }
+    
+    .form-select.control-group.control-order-by {
+        margin-left: 15px;
+        margin-right: 15px;
+    }
+}
+
+
 
 .organizaion-full-description{
     padding-bottom: 50px;
@@ -112,6 +185,9 @@ h3{
     margin-bottom: 10px;
 }
 
+.control-order-by {
+    margin: 0;
+}
 
 .search-form .control-order-by select {
     width: 225px;
@@ -121,14 +197,109 @@ h3{
     color: #003064;
 }
 
-.search-form h2, 
+.search-form h2,
 .odsh-dataset-heading h2,
 .odsh-dataset-heading .title 
  {
     margin-top: 0px;
-    font-size: 25px;
+    margin-bottom: 10px;
+    margin-right: 22px;
+    font-size: 24px;
+    letter-spacing: 0.01em;
     color: #003064;
     font-weight: 300;
+    line-height: 28px;
+}
+
+
+.odsh-dataset-heading > h2 {
+    margin: 0px;
+}
+
+.resources h3 {
+    font-size: 18px;
+    letter-spacing: 0.01em;
+    color: #000000;
+}
+
+section#dataset-preview {
+    margin-top: 26px;
+}
+
+@media (max-width: 767px) {
+    section#dataset-preview {
+        display: none;
+    }
+}
+
+section#dataset-preview p {
+    color: black;
+    font-size: 14px;
+    letter-spacing: 0.01em;
+}
+
+.container-preview-large {
+    padding-top: 10px;
+    padding-bottom: 10px;
+    height: 287px;
+    background-color: #F2F2F2;
+    display: flex;
+}
+
+.container-preview-large a {
+    margin-left: auto;
+}
+
+.container-preview-large img {
+    height: 100%;
+    margin-left: auto;
+    margin-right: auto;
+    border: 1px solid #666666;
+}
+
+section#dataset-collection {
+    padding-top: 17px;
+    border-top: 5px solid #DBDBDB;
+    margin-top: 38px;
+    color: black;
+}
+
+section#dataset-collection .button-container {
+    margin-top: 20px;
+    display: flex;
+}
+
+section#dataset-collection .button-container a {
+    margin-right: 24px;
+    padding-left: 12px;
+    padding-right: 12px;
+}
+
+section#dataset-collection .button-container a:nth-child(2) {
+    /* second a */
+    margin-left: auto;
+}
+
+section#dataset-collection .button-container a:last-child {
+    /* second a */
+    margin-right: 0;
+}
+
+section#dataset-collection .button-container img {
+    width: 18px;
+    height: auto;
+    margin-right: 5px;
+    margin-left: 5px;
+}
+
+@media (max-width: 767px) {
+    .search-form h2, 
+    .odsh-dataset-heading h2,
+    .odsh-dataset-heading .title 
+    {
+        width: 100%;
+        margin-bottom: 8px;
+    }
 }
 
 .odsh-dataset-heading .title
@@ -145,11 +316,50 @@ h3{
     padding: 0;
 }
 
+#section-org.module-content {
+    padding-bottom: 87px;
+    border-bottom: solid 3px #DBDBDB;
+}
+
+.information-organisation {
+    margin-top: 20px;
+    font-size: 12px;
+    text-align: left;
+    letter-spacing: 0.12px;
+    color: #000000;
+}
+
+.information-organisation p {
+    margin-bottom: 0;
+}
+
+.information-organisation a {
+    color: inherit;
+}
+
+.information-organisation .phone::before{
+    content: "";
+    display: inline-block;
+    background-image: url(/base/images/icon_phone.svg);
+    background-repeat: no-repeat;
+    background-size: .7rem .7rem;
+    background-position: 50% 50%;
+    width: 0.8rem;
+    height: 0.8rem;
+    vertical-align: middle;
+}
+
+
 .module-narrow .module-footer {
     padding: 0;
     border: none;
     font-size: 12px;
 }
+@media (max-width: 767px) {
+    .js [role="main"] .secondary .filters > div .module-footer {
+        display: block;
+    }
+}
 
 .module .read-more{
     font-weight: normal;
@@ -186,10 +396,11 @@ input[type=radio], input[type=checkbox] {
     background-color: #f2f2f2;
 }
 
-.is-table-row .secondary.span3 {
-    width: 191px;
-    max-width: 1970px;
-    padding: 20px 16px 0px;
+.secondary.span3 {
+    box-sizing: border-box;
+    min-width: 300px;
+    max-width: 300px;
+    padding: 40.66px 16px 0px;
 }
 .secondary .module-narrow .module-content{
     padding-left: 0px;
@@ -197,16 +408,15 @@ input[type=radio], input[type=checkbox] {
 }
 
 .primary {
-    padding-left: 20px;
+    padding-left: 31px;
 }
 
 .primary.organization {
     padding-left: 0px;
 }
 
-.is-table-row .primary.span9 {
-    width: 717px;
-    float: right;
+.primary.span9 {
+    max-width: 640px;
 }
 
 .primary.logout {
@@ -214,8 +424,8 @@ input[type=radio], input[type=checkbox] {
     padding-left: 0px;
 }
 
-@media (max-width: 767px){
-.is-table-row .primary.span9 {
+@media (max-width: 1023px){
+.primary{
     padding-left: 0px;
     width: 100%;
     margin-left: 0;
@@ -223,9 +433,6 @@ input[type=radio], input[type=checkbox] {
 .primary.span9{
     width: 100%;
 }
-.primary{
-    padding: 0px;
-}
 }
 
 .wrapper {
@@ -235,6 +442,12 @@ input[type=radio], input[type=checkbox] {
     border: none;
 }
 
+@media (max-width: 1023px){
+    .wrapper {
+        width: 100%;
+    }
+}
+
 .karte_inner {
     background-color: lightgrey;
     height: 220px;
@@ -243,20 +456,25 @@ input[type=radio], input[type=checkbox] {
 
 .filter-reset {
     padding: 0px 0px 10px 0px;
+    margin-top: 18px;
 }
 
 .filter-reset-label {
     float: left;
+    font-size: 14px;
+    letter-spacing: 0.14px;
+    color: black;
 }
 
 .filter-reset-box {
     float: right;
     background-color: white;
-    padding: 0px 10px 0px 10px;
+    padding: 1px 10px 4px 10px;
 }
 
 .filter-reset-box a {
     font-size: 12px;
+    color: #003064;
 }
 
 .filters section nav {
@@ -271,28 +489,74 @@ input[type=radio], input[type=checkbox] {
 
 .nav-simple>li {
     border-bottom: 0px;
-    padding: 15px 0px 0px 0px;
-    width: 193px;
+    padding: 10px 0px 0px 0px;
+    width: 100%;
     white-space: nowrap;
     display: flex;
     justify-content: space-between;
+    align-items: center;
 }
 
 .nav-item .facet_label {
-    flex:1;
     white-space: nowrap;
     overflow: hidden;
     text-overflow: ellipsis;
+    max-width: 240px;
 }
 
-.nav-item .facet_label a{
+.nav-item .facet_label label.odsh-visible-label{
+    display: inline;
+    font-size: inherit;
+}
+
+.nav-item .facet_label label a{
     color: black;
+    display: inline;
 }
 
 .nav-item .facet_count {
     display: inline-block;
     background-color: white;
-    padding: 0px 2px 0px 2px;
+    padding: 1px 2px;
+}
+
+.package-info-category {
+    margin: 0;
+}
+
+.category-with-icon {
+    display: inline-block;
+    /* padding-bottom: 0.5rem; */
+    vertical-align: middle;
+}
+
+.group-icon-container {
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    margin-right: 8px;
+    margin-left: 3px;
+}
+
+.group-icon-container img {
+    vertical-align: top;
+}
+
+.category-header {
+    display: inline-block;
+    padding-right: 6px;
+    vertical-align: top;
+}
+
+.category-icon-container {
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    margin-right: 3px;
+}
+
+.category-name {
+    padding-right: 15px;
 }
 
 
@@ -304,7 +568,7 @@ input[type=radio], input[type=checkbox] {
 
 label.label-score,
 label.rangesearch,
-input[type=checkbox] + label.mylabel {
+input[type=checkbox] + span.mylabel {
     background: #fff;
     border: 1px solid black;
     height: 8px;
@@ -317,7 +581,7 @@ input[type=checkbox] + label.mylabel {
 
 input[type=checkbox]:checked + label.label-score,
 label.rangesearch.checked,
-input[type=checkbox]:checked + label.mylabel {
+input[type=checkbox]:checked + span.mylabel {
     background: url(/base/images/checked.png);
     background-color: #fff;
     background-size: 8px 8px;
@@ -330,28 +594,6 @@ input[type=checkbox]:checked + label.mylabel {
     margin-bottom: 0px;
 }
 
-
-@media (max-width: 768px)
-{
-input[type=checkbox] + label.mylabel,
-input[type=checkbox]:checked + label.mylabel {
-    height: 20px;
-    width: 20px;
-    background-size: 20px 20px;
-    vertical-align: text-bottom;
-}
-.facet_label {
-    font-size: 18px;
-    vertical-align: text-bottom;
-}
-.nav-simple>li{
-    width: 100%;
-}
-.js [role=main] .secondary .filters {
-    background-color: white;
-}
-}
-
 .checklabel input[type="checkbox"]
 {
     float: inherit;
@@ -359,7 +601,7 @@ input[type=checkbox]:checked + label.mylabel {
 
 label.label-score,
 label.rangesearch,
-label.mylabel  {
+span.mylabel  {
     margin-right: 3px;
     margin-bottom: 0px;
     -webkit-user-select: none; /* Safari */        
@@ -369,7 +611,7 @@ label.mylabel  {
 }
 
 label.rangesearch::after,
-label.mylabel::after {
+span.mylabel::after {
     content: "";
 }
 
@@ -386,6 +628,10 @@ label.rangesearch.disabled {
     display: inline-block;
 }
 
+.controls.rangesearch label {
+    display: block;
+}
+
 .search-score
 {
     color:black;
@@ -399,13 +645,15 @@ label.rangesearch.disabled {
 
 .rangesearch a{
     color:black;
-    font-size:14px;
+    font-size:12px;
 }
 
 .controls input.rangesearch{
-    font-style: normal;
-    width:187px;
+    box-sizing: border-box;
+    width: 100%;
+    height: 1.5rem;
     padding: 2px;
+    font-style: normal;
     font-size: 12px;
     line-height: 1.16666667em;
 }
@@ -446,20 +694,45 @@ label.rangesearch.disabled {
     font-size: 10px;
     position: relative;
     top: -8px;
-    right: -8px;    
+    right: -8px;
+    margin-right: 0; 
 }
 .pill.error .remove .fa.fa-times{
     background-color: #d4004b;
 }
 
-.container-fluid.odsh-dataset-item {
-    padding: 20px 0px 20px 0px;
+.odsh-dataset-item {
+    display: flex;
+    padding: 27px 0px;
     border-bottom: 2px solid #DBDBDB;
-    display: table;
+    width: 100%;
 }
-.container-fluid.odsh-dataset-item:hover {
+.odsh-dataset-item:hover {
     background-color: rgb(246,247,249);
 }
+.odsh-dataset-item:last-child {
+    border-bottom: none;
+}
+
+.preview-image-container {
+    display: flex;
+    flex-direction: column;
+    margin-right: 25px;
+    width: auto;
+}
+
+@media (max-width: 767px) {
+    .preview-image-container {
+        display: none;
+    }
+}
+
+.preview-image-container img {
+    margin-top: auto;
+    height: auto;
+    max-width: 102px;
+    border: 1px solid #666666;
+}
 
 .organization-item{
     padding: 5px 0px 5px 0px;
@@ -490,29 +763,28 @@ a:hover.organization-item ,a:focus.organization-item
     width: 705px;
 }
 
-.dataset-content {
-    width: 470px;
-    display: table-cell;
-    position: relative;
-}
-
 .dataset-heading {
-    margin-right: 30px;
     font-weight: normal;
     font-size: 20px;
     word-wrap: break-word;
-    max-width: 310px;
+    width: 100%;
+    margin-bottom: 12px;
+}
+.dataset-content {
+    flex-grow: 1;
 }
 .dataset-content p{
     font-size: 12px;
-    margin: 0 0 5px; 
+    /* margin: 0 0 5px;  */
 }
 .dataset-heading a{
+    color: black;
     text-decoration: none;
+    padding-right: 30px;
+    letter-spacing: 0.18px;
 }
 
 .dataset-spacer{
-    display: table-cell;
     width: 25px;
 }
 
@@ -522,9 +794,14 @@ a:hover.organization-item ,a:focus.organization-item
 }
 
 .dataset-meta {
-    width: 225px;
-    height: 100%;
-    display: table-cell;
+    position: relative;
+}
+
+.package-info-pill img {
+    padding-right: 5px;
+    height: auto;
+    width: 18px;
+    bottom: 1.5px;
     position: relative;
 }
 
@@ -555,8 +832,6 @@ ul.dataset-resources {
 }
 
 
-element.style {
-}
 .dataformat-label:hover {
     background-color: #d4004b!important;
 }
@@ -564,13 +839,10 @@ element.style {
 
 
 .dataset-stars {
+    width: 190px;
     margin-bottom: 10px;
 }
 
-
-.popover-content{
-
-}
 .popover{
     width: unset;
     display:inline-table!important;
@@ -671,6 +943,11 @@ label:after {
     font-style: normal;
 } 
 
+input#field-username {
+    margin-bottom: 30px;
+    vertical-align: super;
+}
+
 .control-group.error input,
 .control-group.error select,
 .control-group.error .select2-choices,
@@ -965,15 +1242,10 @@ label:after {
 .footer a{
     color:white;
 }
-@media (max-width: 767px){
-.footer{
-    border-top:0px;
-    width: 100%;
-}
 body {
     background-color: white;
 }
-}
+
 .footer .container{
     width: 100%;
     max-width: 1000px;
@@ -1015,6 +1287,50 @@ body {
     margin-top: 10px;
 }
 
+@media (max-width: 1023px){
+    .footer{
+        border-top-width: 30px;
+        width: 100%;
+    }
+    .footer-line{
+        border-top: 1px solid white;
+    }
+}
+
+@media (max-width: 767px){
+    .footer{
+        border-top-width: 20px;
+    }
+    .footer .container {
+        padding-bottom: 0;
+    }
+    .footer-line{
+        border-top: none;
+        margin-top: 0;
+        margin-bottom: 0;
+    }
+    .footer-content{
+        box-sizing: border-box;
+        padding-bottom: 15px;
+        background-image: none;
+        height: 139px;
+        display: flex;
+        flex-direction: column-reverse;
+    }
+    .footer-first-row{
+        padding-top: 0;
+        height: 0;
+    }
+    .footer-right{
+        display: flex;
+        justify-content: space-between;
+        padding-bottom: 15px;
+    }
+    .footer-icon a{
+        padding: 15px 0;
+    }
+}
+
 .toolbar .breadcrumb li:after {
     background-image: url(/base/images/arrow-right.png);
     background-repeat: no-repeat;
@@ -1079,6 +1395,12 @@ body {
     border: none;
 }
 
+@media(maxwidth: 767px) {
+    .page-header .nav-tabs {
+        margin: 0;
+    }
+}
+
 .module .module-content {
     margin: 0px;
 }
@@ -1086,8 +1408,9 @@ body {
 .info-detail {
     margin-bottom: 20px;
     font-size: 12px;
+    letter-spacing: 0.01em;
     color: black;
-    max-width: 193px;
+    max-width: 100%;
     word-break: break-word;
 }
 .info-detail p{
@@ -1097,9 +1420,22 @@ body {
     margin-top: 5px;
     margin-bottom: 5px;
 }
+.info-detail img {
+    margin-right: 5px;
+}
+
+.info-detail.groups-detail > div {
+    margin-bottom: 5px;
+}
+
 .odsh-dataset-heading {
     word-wrap: break-word;
-    margin-bottom: 30px;
+    padding-bottom: 16px;
+    margin-bottom: 18px;
+}
+
+.odsh-dataset-edit-button {
+    margin-top: 10px;
 }
 
 .odsh-dataset-heading .dataset-stars {
@@ -1110,11 +1446,18 @@ body {
     margin-bottom: 30px;
 }
 
+.notes > p {
+    font-size: 16px;
+    letter-spacing: 0.01em;
+    color: #000000;
+}
+
 .resource-list {
     margin: 0px;
 }
 
 .resource-item {
+    display: flex;
     background: #f2f2f2;
     margin-top: 10px;
     padding: 15px 15px 15px 15px;
@@ -1135,14 +1478,10 @@ body {
     text-align: center;
 }
 
-element.style {
-}
 .dataformat-label:hover {
     background-color: #d4004b!important;
 }
 
-
-
 .resource-title {
     float: left;
     margin-left: 5px;
@@ -1153,18 +1492,34 @@ element.style {
     cursor: pointer;
     text-decoration: none;
     min-height: 1em;
+    color: black;
 }
 
 .resource-title a{
     color: black;
+    letter-spacing: 0.16px;
 }
 
 .resource-title a:hover{
     text-decoration: none
 }
 
+.resource-title p:first-of-type{
+    font-size: 12px;
+    letter-spacing: 0.12px;
+    padding-top: 12px;
+    margin-bottom: 0;
+}
+.resource-title p{
+    font-size: 12px;
+    letter-spacing: 0.12px;
+    padding-top: 0;
+}
+
 .resource-title-container{
     display: flex;
+    justify-content: space-between;
+    width: 100%;
 }
 .resource-title-container .dataformat-label:hover{
     background-color: #003064 !important;
@@ -1185,15 +1540,6 @@ element.style {
     float:left;
 }
 
-@media (max-width: 767px)
-{
-.is-table-row .resource-details-left {
-    /* padding-right: 0px; */
-    width: 100%;
-    /* float:none; */
-}
-}
-
 .resource-icons {
     font-size: 24px;
     margin-left: 5px;
@@ -1230,6 +1576,12 @@ element.style {
     vertical-align: 0px;
 }
 
+@media (max-width: 767px) {
+    .toolbar .breadcrumb .home {
+        display: inline-block;
+    }
+}
+
 
 .resource-icons a {
     color: #003064;
@@ -1246,19 +1598,31 @@ element.style {
 }
 
 .search-box-container{
-    width:100%;
-    max-width: 430px;
+    box-sizing: border-box;
+    width: auto;
+    height: 40px;
+    max-width: 470px;
     margin-bottom: 60px;
-    margin-left: 250px;
+    margin-left:330px;
+}
+
+.search-field {
+    display: flex;
+    align-items: center;
 }
 
 #field-sitewide-search {
-    font-size: 87%;
+    flex: 1;
+    font-size: 14px;
     font-weight: 300;
-    padding: 0px;
+    padding-top: 0px;
+    padding-bottom: 0px;
     padding-right: 35px;
-    padding-left: 5px;
-    width: 100%;
+    padding-left: 14.24px;
+    margin: 0px;
+    margin-left: 0px;
+    width: inherit;
+    min-width: 210px;
     line-height: 1.1;
     border: 1px solid #003064!important;
     color:#003064;
@@ -1266,30 +1630,57 @@ element.style {
     box-shadow: none !important;
     height: 40px;
     border-radius: 0px;
+    box-sizing: border-box;
 }
 
 .simple-input .field .btn-search {
-    height: 25px;
-    width: 25px;
+    height: 36px;
+    width: 36px;
     background: url(/base/images/Icon-Suche.png);
-    background-size: 25px 25px;
-    right: -28px;
-    top: -25px;
-    position: relative;
-    float: right;
+    background-size: 36px 36px;
+    top: 3px;
+    margin: 0px 5px;
+}
+
+.simple-input .field .btn-search:focus {
+    border-color: #003064;
+    border-width: 1px;
+    border-style: dotted;
 }
 
-.search-box-container .field{
+/* .search-box-container .field{
     width: 100%;
     max-width: 465px;
+} */
+
+@media (max-width: 1023px){
+    .search-box-container {
+        flex: 1;    
+        box-sizing: border-box;
+        margin-left: auto;
+        margin-bottom: 20px;
+        padding: 0px;
+        display: inline-block;
+        height: 40px;
+        width: 100%;
+        min-width: 210px;
+    }
+
+    .filter-search-row {
+        display: flex;
+        flex-wrap: wrap;
+    }
 }
 
 @media (max-width: 767px){
-.search-box-container{
-    margin-bottom: 20px;
-    padding: 0px;
-    margin-left: 0px;
-}
+    .search-box-container:focus-within {
+        position: absolute;
+        margin-right: auto;
+        margin-left: auto;
+        padding: 0;
+        width: 80%;
+        min-width: 95%;
+    }
 }
 
 
@@ -1501,22 +1892,6 @@ element.style {
     margin-bottom: 0px;
 }
 
-#dataset-map .module-heading [class^="icon-"],
-#dataset-map .module-heading [class*=" icon-"] {
-  font-size: 14px;
-  line-height: 1;
-  width: 14px;
-  text-align: left;
-  display: inherit;
-}
-@media (max-width: 767px){
-#dataset-map {
-display: none;
-}
-#dataset-map {
-display: none;
-}
-}
 
 @media (min-width: 768px){
 .span9 div.module-content {
@@ -1524,7 +1899,9 @@ display: none;
 }
 }
 
-.field-organization .select2-container .select2-choice {
+.field-organization .select2-container .select2-choice,
+.field-spatial_uri .select2-container .select2-choice 
+{
     background-color: #F6F7F9;
     background-image: none;
     background-image: none;
@@ -1537,36 +1914,110 @@ display: none;
 
 .logo{
     margin-left: -7px;
-    height: 70px; 
+    height: auto;
+    box-sizing: border-box;
+    width: 155px;
+    display: block;
 }
-.logo img{
-    height: 65px; 
-    width:auto;
-    padding: 6px;
+.img-logo-large {
+    display: initial;
+}
+.img-logo-small {
+    display: none;
 }
 
-.site-title{
-    color:black;
-    font-size: 2.5rem; 
-    margin-top: 30px; 
-    color: #333; 
-    text-align: center; 
+@media (max-width: 1023px){
+    .logo {
+        width: 121.1px;
+        height: auto;
+        display: block;
+    }
+}
+
+@media (max-width: 767px){
+    .logo {
+        display: initial;
+    }
+    .img-logo-large {
+        display: none;
+    }
+    .img-logo-small {
+        display: initial;
+    }
+}
+
+.topline {
+    margin-bottom: 25px;
+}
+@media (max-width: 767px){
+    .topline {
+        margin-bottom: 0px;
+    }
+}
+
+.site-title {
+    color:#003064;
+    font-size: 38px; 
+    position: absolute;
+    left: 340px;
+    text-align: left; 
     line-height: 1.47; 
-    font-weight: 100; 
+    font-weight: 500;
+    letter-spacing: 0.38px;
+    padding-top: 24px;
+}
+
+@media (max-width: 1023px){
+    .site-title{
+        font-size: 24px;
+        line-height: 1.0;
+        display: inline-block;
+        left: initial;
+        margin-left: 33px;
+    }
+}
+
+#dataset-search-box-form{
+    margin-bottom: 0;
 }
 
 @media (max-width: 767px){
-.logo img{
-    height: 25px; 
-    width:auto;
-    padding: 6px;
+    .site-title{
+        display: none;
+    }
+}
+
+#menu-button-and-title {
+    display: none;
+}
+@media (max-width: 767px){
+    #menu-button-and-title {
+        display: flex;
+        align-items: center;
+        padding-left: 15px;
+        padding-right: 15px;
+        background-color: #f2f2f2;
+    }
 }
-.site-title{
-    font-size: 1.5rem; 
-    margin-top: 15px; 
-    color: #333; 
-    line-height: 1.0; 
+#menu-button-and-title span {
+    display: inline-block;
+    color: #003064;
+    padding-right: 20px;
 }
+#menu-button-and-title h1 {
+    display: inline-block;
+}
+
+
+.site-title-mobile{
+    font-size: 18px;
+    line-height: 1.0;
+    position: relative;
+    margin-left: 0;
+}
+
+.search-form .filter-list {
+    width: 100%
 }
 
 .filter-list .filtered.pill,
@@ -1574,6 +2025,14 @@ display: none;
     background-color: #003064;
     color:white;
 }
+
+@media (min-width: 1024px){
+    .search-form .filter-list {
+        margin-left: 15px;
+        margin-right: 15px;
+    }
+}
+
 .filtered.pill.error{
     background-color: #d4004b;
 }
@@ -1582,6 +2041,7 @@ display: none;
 .share-links {
     display: flex;
     justify-content: space-between;
+    margin-top: 10px;
 }
 
 .share-links a{
@@ -1591,7 +2051,7 @@ display: none;
 }
 
 .share-links img {
-    width: 20px;
+    width: 23px;
 }
 
 .home-title{
@@ -1774,11 +2234,9 @@ a:hover.tooltips_cls span {
 #testsystem p { margin:0 }
 
 .tag-container {
-    border-top: 1px solid #DBDBDB;
     padding-top:10px;
     margin-top:20px;
     display: flex;
-    width: 720px;
     flex-wrap: wrap;
     flex-direction: row;
     justify-content: start;
@@ -1859,15 +2317,23 @@ span.clear {
 .package-info-pill
 {
     display: inline-block;
+    box-sizing: border-box;
+    height: 20px;
     padding: 3px 10px;
     background-color: #dbdbdb;
-    border-radius: 5px;
+    border-radius: 3px;
     font-size: 12px;
+    margin-right: 10px;
+    margin-bottom: 17.84px;
 }
 
-p.package-info-categorie 
+p.package-info-subject 
 {
-    margin-top: 15px;
+    margin-top: 12px;
+    margin-bottom: 0px;
+}
+
+p.package-info-issued {
     margin-bottom: 0px;
 }
 
@@ -2001,9 +2467,34 @@ p.package-info-categorie
     font-size: 20px;
     cursor: pointer;
 }
+
 .search-form a 
 {
     color: #003064;
+    margin-left: auto;
+    margin-right: 22px;
+}
+@media (max-width: 767px) {
+    .search-form a
+    {
+        order: 4;
+        margin-right: 0;
+    }
+
+    .search-form .filter-list {
+        order: 5;
+        break-before: always;
+    }
+
+    .search-form #datesearch-filter {
+        order: 6;
+    }
+}
+
+.search-form a:focus i {
+    border-color: #003064;
+    border-width: 1px;
+    border-style: dotted;
 }
 
 .error-title
@@ -2075,6 +2566,7 @@ p.package-info-categorie
     padding: 3px 3px 1px 3px;
     font-size: 14px;
     margin-right: 4px;
+    text-shadow: none;
 }
 
 .comments-heading{
@@ -2167,96 +2659,113 @@ p.package-info-categorie
     width: 715px;
 }
 
-@media (max-width: 767px)
-{
-[role=main] .secondary.span3 {
-    display: block;
-    width: 100%;
-    margin-left: 0;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-    padding: 0;
-    order: 2;
-}
-#testsystem 
-{
-    display: none;
-}
-.simple-input .field .btn-search
-{
-    display: none;
-}
-#field-sitewide-search {
-    padding: 0px;
-    width: 100%;
-    margin: 0px;
-}
-}
+@media (max-width: 1023px) {
+    [role=main] .secondary.span3 {
+        max-width: 300px;
+        margin-left: 0;
+        -webkit-box-sizing: border-box;
+        -moz-box-sizing: border-box;
+        box-sizing: border-box;
+        position: fixed;
+        top: 0;
+        left: 0;
+        display: none;
+        z-index: 3;
+        height: 100%;
+        overflow: scroll;
+        filter: blur(0) brightness(100%);
+    }
 
-@media (max-width: 767px)
-{
-    .masthead .container,
-    body {
-    padding-left: 0px;
-    padding-right: 0px;
-}
-#content
-{
-    margin-left: 0px;
-    padding-right: 0px;
-}
-.dataset-heading {
-    max-width: unset;
-    width: 100%;
-    margin: 0px;
-}
-/* .dataset-heading a {
-    max-width: unset;
-    width: 100%;
-    margin: 0px;
-} */
-.js body.filters-modal .secondary .filters .hide-filters i {
-    font-size: 32px;
-}
-.container-fluid.odsh-dataset-item {
-    width: 100%;
-    padding: 20px 15px 20px 15px;
-    box-sizing: border-box;
-}
-.row.wrapper.is-table-row
-{
-    width: 100%;
-    display: flex;
-    flex-direction: column;
-}
-.dataset-info.issued
-{
-    position: relative;
-}
-ul.dataset-resources
-{
-    margin: 5px 0px 5px 0px;
-}
-.stages li .highlight {
-     text-indent: unset; 
-}
-.tag-container
-{
-    width: 100%;
-}
-}
-.module-content.page-header
-{
-    background-color: unset;
+    [role=main] .secondary.span3 > .filters {
+        position: initial;
+        background-color: inherit;
+        padding: 0px;
+    }
+
+    .js [role=main] .secondary > .filters > div {
+        background-color: inherit;
+    }
+
+    div.hide-filters-style > a.hide-filters {
+        display: block;
+        position: absolute;
+        top: 18px;
+        right: 18px;
+    }
+    @media (max-width: 767px) {
+        .js body.filters-modal .secondary .filters > .hide-filters-style > a.hide-filters {
+            display: block;
+            position: absolute;
+            top: 18px;
+            right: 18px;
+            opacity: 1;
+        }
+    }
+
+    body.menu-modal {
+        overflow: hidden;
+    }
+    
+    body.filters-modal div.primary,
+    body.filters-modal header,
+    body.filters-modal .search-box-container,
+    body.filters-modal .toolbar,
+    body.menu-modal div.primary,
+    body.menu-modal .search-box-container,
+    body.menu-modal .toolbar
+    {
+        filter: blur(3px);
+        -webkit-backdrop-filter: blur(3px);
+    }
+
+    body.filters-modal div.blur-layer,
+    body.menu-modal div.blur-layer
+    {
+        position: absolute;
+        width: 100vw;
+        height: 100vh;
+        background-color: #000000;
+        opacity: 0.6;
+        z-index: 2;
+    }
+    body.filters-modal div.blur-layer
+    {
+        top: 0;
+    }
 }
 
-@media (max-width: 768px)
-{
-.wrapper {
-    margin: 0;
+body.filters-modal div.row > aside.secondary.span3 {
+    display: block;
 }
-.dataset-edit-form .span6 {
-    width: 100%;
+
+
+@media (max-width: 1023px)
+{
+    .js .show-filters.btn {
+        box-sizing: border-box;
+        display: inline-block;
+        background-image: url("/base/images/icon_funnel.svg");
+        background-size: 18px 18px;
+        background-repeat: no-repeat;
+        background-position: 15px center;
+        padding-left: 49px;
+        margin-right: 28px;
+        display: inline-block;
+        height: 40px;
+        background-color: #0089CA;
+        color: white;
+        font-size: 18px;
+        margin-bottom: 12px;
+    }
+
+    .js .module-content > .show-filters.btn {
+        background-image: none;
+        padding-left: 15px;
+    }
+
+    .js .module-content > .show-filters.btn > img {
+        width: 24px;
+        height: auto;
+        margin-right: 6px;
+    }
 }
-}
\ No newline at end of file
diff --git a/ckanext/odsh/public/odsh_header.css b/ckanext/odsh/public/odsh_header.css
index 13406da5..31822582 100644
--- a/ckanext/odsh/public/odsh_header.css
+++ b/ckanext/odsh/public/odsh_header.css
@@ -10,6 +10,13 @@
     max-width: 1280px;
 }
 
+@media (max-width: 767px) {
+    .navbar-static-top .container.navigation-container {
+        padding-left: 15px;
+        padding-right: 15px;
+    }
+}
+
 [class*="span"] {
     margin-left: 0px;
 }
@@ -31,9 +38,15 @@
     padding-right: 0;
     position: relative;
     top: 0;
+    left: 18px;
     padding: 1em 0;
 }
 
+/* @media (max-width: 767px){
+    .header-image {
+        display: block;
+    } */
+
 .language-switch {
     float: right;
     background-color: #f2f2f2;
@@ -100,6 +113,13 @@
     background: white;
 }
 
+@media (max-width: 1023px) {
+    .masthead {
+        margin-left: 0;
+        margin-right: 0;
+    }
+}
+
 
 .navigation-container {
     background: #f2f2f2;
@@ -107,8 +127,21 @@
     border-bottom: 15px solid #003064;
 }
 
+@media (max-width: 1023px) {
+    .navigation-container {
+        border-bottom: 10px solid #003064;
+    }
+}
+
+@media (max-width: 767px) {
+    .navigation-container {
+        border-bottom: 8px solid #003064;
+    }
+}
+
 .navigation-row {
     width: 960px;
+    max-width: 100%;
     padding-left: 0px;
     margin-left: auto;
     margin-right: auto;
@@ -128,6 +161,75 @@
     margin: 0px;
 }
 
+.header-menu-mobile {
+    display: none;
+}
+@media (max-width: 767px) {
+    .menu-modal .navbar.masthead .nav > li.header-menu-mobile,
+    .menu-modal .navbar.masthead .nav > li.header-menu-mobile:hover {
+        display: initial;
+        background-color: #003064;
+        border-top-width: 0;
+        position: relative;
+    }
+    .menu-modal .navbar.masthead .navigation ul.nav-pills > li.header-menu-mobile > a {
+        color: white;
+        font-size: 18px;
+    }
+    .menu-modal .navbar.masthead .navigation ul.nav-pills > li.header-menu-mobile > img {
+        display: inline-block;
+        position: absolute;
+        margin-top: -10px;
+        top: 50%;
+        right: 17px;
+    }
+}
+
+@media (max-width: 767px) {
+    .navbar .nav {
+        display: none;
+    }
+
+    .menu-modal .navbar nav {
+        max-width: 250px;
+        background-color: white;
+    }
+
+    .menu-modal .navbar .nav {
+        display: block;
+    }
+
+    .menu-modal .navbar.masthead .navigation {
+        position: absolute;
+        top: 8px;
+        left: 0;
+        z-index: 3;
+    }
+
+    .menu-modal .navbar.masthead .navigation ul.nav-pills > li {
+        box-sizing: border-box;
+        min-width: 100%;
+        padding-left: 21px;
+        margin-left: 0;
+    }
+    
+    .menu-modal .navbar.masthead .navigation ul.nav-pills > li.active {
+        border-top: 2px solid #f2f2f2;
+    }
+
+    .menu-modal .navbar.masthead .navigation .nav-pills > li > a,
+    .menu-modal .navbar.masthead .navigation .nav-pills > li.active > a {
+        color: #003064;
+        font-size: 14px;
+        font-weight: 500;
+    }
+    .menu-modal .navbar.masthead .navigation .nav-pills > li:hover > a {
+        color: #ffffff;
+        font-size: 14px;
+        font-weight: 500;
+    }
+}
+
 .navbar.masthead .navigation .nav-pills,
 .navbar.masthead .navigation  {
     width: 100%;
@@ -139,8 +241,10 @@
     background-color: #003064 !important;
 }
 
-.navbar.masthead .navigation .nav-pills li:not(:first-child) {
-    margin-left: 22px;
+@media (min-width: 768px) {
+    .navbar.masthead .navigation .nav-pills li:not(:first-child) {
+        margin-left: 22px;
+    }
 }
 
 /* Default border to align font vertically to active navigation tab */
@@ -251,34 +355,12 @@
     float: right;
 }
 
-@media (max-width: 767px)
-{
-.navbar.masthead .navigation .nav-pills li.dropdown
-{
-    float: none;
-}
-.nav-pills li a:hover, .nav-pills li:hover {
-    background-color: rgb(242, 242, 242)!important;
-}
-.dropdown-backdrop
-{
-    display: none;
-}
-.navigation-row {
-    width: 100%;
-    padding-left: 0px;
-    margin-left: auto;
-    margin-right: auto;
-}
-}
-
 .navbar.masthead .navigation .nav-pills li.dropdown > .dropdown-toggle
 {
     padding-bottom: 12px;
     padding-top: 12px;
 }
 
-
 .user-icon
 {
     fill:#003064;
@@ -308,19 +390,3 @@
 {
     fill:white;
 }
-
-@media (max-width: 767px)
-{
-.navbar-fixed-top, .navbar-fixed-bottom, .navbar-static-top {
-     margin-left: 0px; 
-     margin-right: 0px; 
-}
-
-.navbar.masthead .nav>li:hover a,
-.navbar.masthead .navigation .nav-pills li.open .user-icon, .navbar.masthead .navigation .nav-pills li a:hover .user-icon,
-.navbar.masthead .navigation .nav-pills li.dropdown.open > a.dropdown-toggle:hover, .navbar .nav li.dropdown.open > .dropdown-toggle 
-{
-    color: #003064;
-    fill: #003064;
-}
-}
\ No newline at end of file
diff --git a/ckanext/odsh/search.py b/ckanext/odsh/search.py
new file mode 100644
index 00000000..bc68443c
--- /dev/null
+++ b/ckanext/odsh/search.py
@@ -0,0 +1,80 @@
+import ckanext.odsh.helpers as odsh_helpers
+
+def before_search(search_params):
+    _update_facet_mincount(search_params)
+    _update_daterange_query(search_params)
+    return search_params
+
+def _update_facet_mincount(search_params):
+    search_params.update({'facet.mincount': 0})
+
+def _update_daterange_query(search_params):
+    start_date, end_date = _get_start_and_end_date(search_params)
+    is_no_range = not start_date and not end_date
+    if is_no_range:
+        return search_params
+    start_date_or_star = start_date or '*'
+    end_date_or_star = end_date or '*'
+    start_query, end_query = _get_start_and_end_query(start_date_or_star, end_date_or_star)
+    is_enclosing_range = start_date and end_date and start_date < end_date
+    if is_enclosing_range:
+        enclosing_query = _get_enclosing_query(start_date_or_star, end_date_or_star)
+    else:
+        enclosing_query = ''
+    open_end_query = _get_open_end_query(end_date_or_star)
+    fq_preset = search_params.get('fq')
+    fq = _combine_query(fq_preset, start_query, end_query, enclosing_query, open_end_query)
+    search_params.update({'fq': fq})
+
+def _get_start_and_end_date(search_params):
+    extras = search_params.get('extras')
+    start_date_local, end_date_local = (
+        extras.get(key)
+        for key in ('ext_startdate', 'ext_enddate')
+    )
+    try:
+        start_date, end_date = (
+            odsh_helpers.extend_search_convert_local_to_utc_timestamp(date)
+            for date in (start_date_local, end_date_local)
+        )
+    except ValueError:
+        start_date = end_date = None
+    return start_date, end_date
+
+def _get_start_and_end_query(start_date, end_date):
+    start_query, end_query = (
+        '+extras_temporal_{start_or_end}:[{start_date} TO {end_date}]'.format(
+            start_or_end=__,
+            start_date=start_date,
+            end_date=end_date
+        )
+        for __ in ('start', 'end')
+    )
+    return start_query, end_query
+
+def _get_open_end_query(end_date):
+    if end_date is '*':
+        open_end_query = '(*:* NOT extras_temporal_end:[* TO *])'
+    else:
+        open_end_query = '((*:* NOT extras_temporal_end:[* TO *]) AND extras_temporal_start:[* TO {end_date}])'.format(
+            end_date=end_date)
+    return open_end_query
+
+def _get_enclosing_query(start_date, end_date):
+    enclosing_query_start = 'extras_temporal_start:[* TO {start_date}]'.format(
+        start_date=start_date)
+    enclosing_query_end = 'extras_temporal_end:[{end_date} TO *]'.format(
+        end_date=end_date)
+    enclosing_query = ' OR ({enclosing_query_start} AND {enclosing_query_end})'.format(
+        enclosing_query_start=enclosing_query_start, enclosing_query_end=enclosing_query_end)
+    return enclosing_query
+
+def _combine_query(fq_preset, start_query, end_query, enclosing_query, open_end_query):
+    combined_query = u'{fq_preset} ({start_query} OR {end_query} {enclosing_query} OR {open_end_query})'.format(
+        fq_preset=fq_preset, 
+        start_query=start_query, 
+        end_query=end_query, 
+        enclosing_query=enclosing_query, 
+        open_end_query=open_end_query
+    )
+    return combined_query
\ No newline at end of file
diff --git a/ckanext/odsh/templates/base.html b/ckanext/odsh/templates/base.html
index debf3e34..8191f4ce 100644
--- a/ckanext/odsh/templates/base.html
+++ b/ckanext/odsh/templates/base.html
@@ -11,10 +11,13 @@
 
 {% block head_extras %}
 {{ super() }}
+{% if h.odsh_use_matomo() %}
 {% set matomo_url = h.odsh_tracking_url()%}
 {% set matomo_id = h.odsh_tracking_id()%}
+{% endif %}
 <meta data-name="type" content="{{h.odsh_is_slave()}}">
 
+{% if h.odsh_use_matomo() %}
 <!-- Matomo -->
 <script type="text/javascript">
   var _paq = _paq || [];
@@ -29,6 +32,7 @@
   })();
 </script>
 <!-- End Matomo Code -->
+{% endif %}
 {% endblock %}
 {% block bodytag %} data-site-root="{{ h.odsh_public_url() }}" data-locale-root="{{ h.odsh_public_url() }}" {% endblock %}
 {% block page %}
diff --git a/ckanext/odsh/templates/footer.html b/ckanext/odsh/templates/footer.html
index 5aad688f..03764a7c 100644
--- a/ckanext/odsh/templates/footer.html
+++ b/ckanext/odsh/templates/footer.html
@@ -1,4 +1,4 @@
-<div class="footer">
+<footer class="footer">
     <div class="container">
         <div class="footer-content">
             <div class='footer-first-row'>
@@ -8,12 +8,12 @@
             <div class='footer-line'></div>
             <div class="footer-left">
                 <div class="footer-icon">&copy; {{g.site_title}}</div>
-                <div class="footer-right">
-                    <div class='footer-icon'><a href='http://www.schleswig-holstein.de/odpkontakt'>Kontakt</a></div>
-                    <div class='footer-icon'><a href='http://www.schleswig-holstein.de/odpimpressum'>Impressum</a></div>
-                    <div class='footer-icon last'><a href='http://www.schleswig-holstein.de/odpdatenschutz'>Datenschutz</a></div>
-                </div>
+            </div>
+            <div class="footer-right">
+                <div class='footer-icon'><a href='http://www.schleswig-holstein.de/tpkontakt'>Kontakt</a></div>
+                <div class='footer-icon'><a href='http://www.schleswig-holstein.de/tpimpressum'>Impressum</a></div>
+                <div class='footer-icon last'><a href='http://www.schleswig-holstein.de/tpdatenschutz'>Datenschutz</a></div>
             </div>
         </div>
     </div>
-</div>
\ No newline at end of file
+</footer>
\ No newline at end of file
diff --git a/ckanext/odsh/templates/header.html b/ckanext/odsh/templates/header.html
index 1c06ef61..afc0250f 100644
--- a/ckanext/odsh/templates/header.html
+++ b/ckanext/odsh/templates/header.html
@@ -1,112 +1,117 @@
+{% resource 'odsh/tpsh_toggle_menu.js' %}
+
 {% block header_wrapper %}
 {% block header_account %}
 <header class="navbar navbar-static-top masthead">
-  {% block header_debug %}
-  {% if g.debug and not g.debug_supress_header %}
-  <div class="debug">Controller : {{ c.controller }}<br />Action : {{ c.action }}</div>
-  {% endif %}
-  {% endblock %}
-  <div class="container">
-    {# The .header-image class hides the main text and uses image replacement for the title #}
-    <div class='row'>
-
-      <div class='span3 span-navigation'>
-        <hgroup class="{{ g.header_class }} pull-left">
+    {% block header_debug %}
+    {% if g.debug and not g.debug_supress_header %}
+    <div class="debug">Controller : {{ c.controller }}<br />Action : {{ c.action }}</div>
+    {% endif %}
+    {% endblock %}
+    <div class="container">
+        {# The .header-image class hides the main text and uses image replacement for the title #}
+        <div class='row topline'>
 
-          {% block header_logo %}
-          <a class="logo" href="{{ h.url_for('home') }}"><img src="{{ h.url_for_static_or_external(g.site_logo) }}" alt="{{ g.site_title }}"
-              title="{{ g.site_title }}" /></a>
-          {% endblock %}
-        </hgroup>
-      </div>
-      <button data-target=".nav-collapse" data-toggle="collapse" class="btn btn-navbar" type="button">
-        <span class="fa fa-bars"></span>
-      </button>
+            <div class='span3 span-navigation'>
+                <hgroup class="{{ g.header_class }} pull-left">
 
-      <div class='site-title'> {{ g.site_title }} </div>
+                    {% block header_logo %}
+                    <a class="logo" href="{{ h.url_for('home') }}">
+                        <img class="img-logo-large" src="{{ h.url_for_static_or_external(g.site_logo) }}" alt="Logo Schleswig Holstein"
+                            title="{{ g.site_title }}" />
+                        <img class="img-logo-small" src="/base/images/logo-quer.png" alt="Logo Schleswig Holstein"
+                            title="{{ g.site_title }}" />
+                    </a>
+                    {% endblock %}
+                </hgroup>
+            </div>
+            <h1 class='site-title'> {{ g.site_title }} </h1>
+        </div>
+        <div id="menu-button-and-title" data-module="tpsh_toggle_menu">
+            <span class="fa fa-bars"></span>
+            <h1 class='site-title-mobile'> {{ g.site_title }} </h1>
+        </div>
     </div>
-  </div>
 
-  <div class="container navigation-container">
-    <div class='row navigation-row'>
-      <div class="nav-collapse collapse">
-        <nav class="section navigation">
-          <ul class="nav nav-pills">
-            {% block header_site_navigation_tabs %}
-            {{ h.build_nav_main(
-            ('home', _('Start')),
-            ('search', _('Daten')))}}
-            {% if c.userobj %}
-            <li >
-                    <a href="{{ h.url_for('/datarequest/') }}" >{{_('Datarequest')}}</a>
-            </li>
-            {% endif %}
-            {{ h.build_nav_main(
-            ('organizations_index', _('Herausgeber')),
-            ('info_page', _('Infos'))
-            ) }}
-            {% endblock %}
-            {% set clazz='active' if c.action=='login' else ''%}
-            {% if h.check_access('package_create') %}
-            <li class='{{clazz}}'>
-              {% link_for _('Upload'), controller='package', action='new', group=c.group_dict.id, class_='text' %}
-            </li>
-            {% endif %}
-            {% if c.userobj %}
-            <li class='{{clazz}} dropdown navbar-right'>
-              {% set name = c.userobj.fullname if c.userobj.fullname else c.userobj.email%}
-                <a class="dropdown-toggle" data-toggle="dropdown" href="#">
-                  <svg class='user-icon'  viewBox="0 0 54 54">
-                  <circle class='user-icon' cx="27" cy="17" r="7.5"/>
-                  <path class='user-icon' d="M42.5,44.5h-31v-6.4c0-4.7,3.9-8.6,8.6-8.6h13.9c4.7,0,8.6,3.9,8.6,8.6V44.5z"/>
-                  </svg>
-                 {{name}}</a>
-                <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                  <li>
-                  <svg class='user-icon-small'  viewBox="0 0 54 54">
-                  <circle  cx="27" cy="17" r="7.5"/>
-                  <path  d="M42.5,44.5h-31v-6.4c0-4.7,3.9-8.6,8.6-8.6h13.9c4.7,0,8.6,3.9,8.6,8.6V44.5z"/>
-                  </svg>
-                    <a href="{{ h.url_for('/user/') }}" title="logout">
-                      <span class="text">
-                       Mein Profil einsehen
-                      </span>
-                    </a>
-                  </li>
-                  <li>
-                    <a href="{{ h.url_for('/user/edit') }}" title="logout">
-                    <i class='fa fa-edit'></i>
-                      <span class="text">
-                        Mein Profil bearbeiten
-                      </span>
-                    </a>
-                  </li>
-                  <li>
-                    <a href="{{ h.url_for('/user/_logout') }}" title="logout">
-                    <i class='fa fa-sign-out'></i>
-                      <span class="text">Logout</span>
-                    </a>
-                  </li>
+    <div class="container navigation-container">
+        <div class='row navigation-row'>
+            <nav class="section navigation">
+                <ul class="nav nav-pills">
+                    <li class="header-menu-mobile" data-module="tpsh_toggle_menu">
+                        <a>Menü</a>
+                        <img src="/base/images/icon_close_white.svg" alt="Menü schließen" aria-label="Menü schließen">
+                    </li>
+                    {% block header_site_navigation_tabs %}
+                    {{ 
+                    h.build_nav_main(
+                        ('home', _('Start')),
+                        ('search', _('Datensätze')),
+                        ('organizations_index', _('Herausgeber')),
+                        ('info_page', _('Infos'))
+                    )
+                    }}
+                    {% endblock %}
+                    {% set clazz='active' if c.action=='login' else ''%}
+                    {% if h.check_access('package_create') %}
+                    <li class='{{clazz}}'>
+                        {% link_for _('Upload'), controller='package', action='new', group=c.group_dict.id, class_='text' %}
+                    </li>
+                    {% endif %}
+                    {% if c.userobj %}
+                    <li class='{{clazz}} dropdown navbar-right'>
+                        {% set name = c.userobj.fullname if c.userobj.fullname else c.userobj.email%}
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                            <svg class='user-icon' viewBox="0 0 54 54">
+                                <circle class='user-icon' cx="27" cy="17" r="7.5" />
+                                <path class='user-icon'
+                                    d="M42.5,44.5h-31v-6.4c0-4.7,3.9-8.6,8.6-8.6h13.9c4.7,0,8.6,3.9,8.6,8.6V44.5z" />
+                            </svg>
+                            {{name}}</a>
+                        <ul class="dropdown-menu" role="menu">
+                            <li>
+                                <svg class='user-icon-small' viewBox="0 0 54 54">
+                                    <circle cx="27" cy="17" r="7.5" />
+                                    <path
+                                        d="M42.5,44.5h-31v-6.4c0-4.7,3.9-8.6,8.6-8.6h13.9c4.7,0,8.6,3.9,8.6,8.6V44.5z" />
+                                </svg>
+                                <a href="{{ h.url_for('/user/') }}" title="logout" role="menuitem">
+                                    <span class="text">
+                                        Mein Profil einsehen
+                                    </span>
+                                </a>
+                            </li>
+                            <li>
+                                <a href="{{ h.url_for('/user/edit') }}" title="logout" role="menuitem">
+                                    <i class='fa fa-edit'></i>
+                                    <span class="text">
+                                        Mein Profil bearbeiten
+                                    </span>
+                                </a>
+                            </li>
+                            <li>
+                                <a href="{{ h.url_for('/user/_logout') }}" title="logout" role="menuitem">
+                                    <i class='fa fa-sign-out'></i>
+                                    <span class="text">Logout</span>
+                                </a>
+                            </li>
+                        </ul>
+                        </a>
+                    </li>
+                    {% else %}
+                    <li class='{{clazz}}'>
+                        <a href="{{ h.url_for('/user/login') }}" title="login">
+                            <span class="text">Login</span>
+                        </a>
+                    </li>
+                    {% endif %}
                 </ul>
-              </a>
-            </li>
-            {% else %}
-            <li class='{{clazz}}'>
-              <a href="{{ h.url_for('/user/login') }}" title="login">
-                <span class="text">Login</span>
-              </a>
-            </li>
-            {% endif %}
-          </ul>
-        </nav>
-        <nav class="section navigation">
-          <ul class="nav nav-pills">
-          </ul>
-        </nav>
-        {% endblock %}
-      </div>
+            </nav>
+            <nav class="section navigation">
+                <ul class="nav nav-pills">
+                </ul>
+            </nav>
+            {% endblock %}
+        </div>
     </div>
-  </div>
-  </div>
 </header>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/ckanext/odsh/templates/macros/form.html b/ckanext/odsh/templates/macros/form.html
index cc01867d..862c69ee 100644
--- a/ckanext/odsh/templates/macros/form.html
+++ b/ckanext/odsh/templates/macros/form.html
@@ -95,6 +95,21 @@ is_required=false) %}
 </div>
 {% endmacro %}
 
+
+{% macro select(name, id='', label='', options='', selected='', error='', classes=[], attrs={'class': 'form-control'}, is_required=false) %}
+{% set classes = (classes|list) %}
+{% do classes.append('control-select') %}
+
+{%- set extra_html = caller() if caller -%}
+{% call input_block(id or name, label or name, error, classes, extra_html=extra_html, is_required=is_required) %}
+<select id="{{ id or name }}" name="{{ name }}" {{ attributes(attrs) }}>
+  {% for option in options %}
+<option value="{{ option.value }}"{% if option.value == selected %} selected{% endif %}>{{ option.text or option.value }}</option>
+{% endfor %}
+</select>
+{% endcall %}
+{% endmacro %}
+
 {#
 Creates all the markup required for an select element. Handles matching labels to
 inputs and error messages.
@@ -107,401 +122,461 @@ name - The name of the form parameter.
 id - The id to use on the input and label. Convention is to prefix with 'field-'.
 label - The human readable label.
 options - A list/tuple of fields to be used as <options>.
-    selected - The value of the selected <option>.
-        error - A list of error strings for the field or just true to highlight the field.
-        classes - An array of classes to apply to the control-group.
-        is_required - Boolean of whether this input is requred for the form to validate
-
-        Examples:
-
-        {% import 'macros/form.html' as form %}
-        {{ form.select('year', label=_('Year'), options=[{'name':2010, 'value': 2010},{'name': 2011, 'value': 2011}],
-        selected=2011, error=errors.year) }}
-
-        #}
-        {% macro select(name, id='', label='', options='', selected='', error='', classes=[], attrs={},
-        is_required=false) %}
-        {% set classes = (classes|list) %}
-        {% do classes.append('control-select') %}
-
-        {%- set extra_html = caller() if caller -%}
-        {% call input_block(id or name, label or name, error, classes, extra_html=extra_html, is_required=is_required)
-        %}
+selected - The value of the selected <option>.
+error - A list of error strings for the field or just true to highlight the field.
+classes - An array of classes to apply to the control-group.
+is_required - Boolean of whether this input is requred for the form to validate
+
+Examples:
+
+{% import 'macros/form.html' as form %}
+{{ form.select('year', label=_('Year'), options=[{'name':2010, 'value': 2010},{'name': 2011, 'value': 2011}],
+selected=2011, error=errors.year) }}
+
+#}
+{% macro tpsh_select(name, id='', label='', options='', selected='', error='', classes=[], attrs={},
+is_required=false) %}
+{% set classes = (classes|list) %}
+{% do classes.append('control-select') %}
+
+{%- set extra_html = caller() if caller -%}
+{% call input_block(id or name, label or name, error, classes, extra_html=extra_html, is_required=is_required)
+%}
+<div class="row-fluid">
+    <div class="span6">
         <select id="{{ id or name }}" name="{{ name }}" {{ attributes(attrs) }}>
             {% for option in options %}
-            <option value="{{ option.value }}" {% if option.value==selected %} selected{% endif %}>{{ option.text or
+            <option value="{{ option.key }}" {% if option.key==selected %} selected{% endif %}>{{ option.text or
                 option.value }}</option>
             {% endfor %}
         </select>
-        {% endcall %}
-        {% endmacro %}
-
-        {#
-        Creates all the markup required for a Markdown textarea element. Handles
-        matching labels to inputs, selected item and error messages.
-
-        name - The name of the form parameter.
-        id - The id to use on the input and label. Convention is to prefix with 'field-'.
-        label - The human readable label.
-        value - The value of the input.
-        placeholder - Some placeholder text.
-        error - A list of error strings for the field or just true to highlight the field.
-        classes - An array of classes to apply to the control-group.
-        is_required - Boolean of whether this input is requred for the form to validate
-
-        Examples:
-
-        {% import 'macros/form.html' as form %}
-        {{ form.markdown('desc', id='field-description', label=_('Description'), value=data.desc, error=errors.desc) }}
-
-        #}
-        {% macro markdown(name, id='', label='', value='', placeholder='', error="", classes=[], attrs={},
-        is_required=false, cols=20, rows=5) %}
-        {% set classes = (classes|list) %}
-        {% do classes.append('control-full') %}
-        {% set markdown_tooltip = "
-        <pre><p>__Bold text__ or _italic text_</p><p># title<br>## secondary title<br>### etc</p><p>* list<br>* of<br>* items</p><p>http://auto.link.ed/</p></pre>
-        <p><b><a href='http://daringfireball.net/projects/markdown/syntax' target='_blank'>Full markdown syntax</a></b></p>
-        <p class='muted'><b>Please note:</b> HTML tags are stripped out for security reasons</p>" %}
-
-        {%- set extra_html = caller() if caller -%}
-        {% call input_block(id or name, label or name, error, classes, control_classes=["editor"],
-        extra_html=extra_html, is_required=is_required) %}
-        <div class="row-fluid">
-            <div class="span6">
-                <textarea id="{{ id or name }}" name="{{ name }}" cols="{{cols}}" rows="{{rows}}" placeholder="{{ placeholder }}"
-                    {{ attributes(attrs) }}>{{ value | empty_and_escape }}</textarea>
-            </div>
-            <div class="span6 inline-error">
-                {{error}}
-            </div>
-        </div>
-        {% endcall %}
-        {% endmacro %}
-
-        {#
-        Creates all the markup required for a plain textarea element. Handles
-        matching labels to inputs, selected item and error messages.
-
-        name - The name of the form parameter.
-        id - The id to use on the input and label. Convention is to prefix with 'field-'.
-        label - The human readable label.
-        value - The value of the input.
-        placeholder - Some placeholder text.
-        error - A list of error strings for the field or just true to highlight the field.
-        classes - An array of classes to apply to the control-group.
-        is_required - Boolean of whether this input is requred for the form to validate
-
-        Examples:
-
-        {% import 'macros/form.html' as form %}
-        {{ form.textarea('desc', id='field-description', label=_('Description'), value=data.desc, error=errors.desc) }}
-
-        #}
-        {% macro textarea(name, id='', label='', value='', placeholder='', error="", classes=[], attrs={},
-        is_required=false, rows=5, cols=20) %}
-        {% set classes = (classes|list) %}
-        {% do classes.append('control-full') %}
-
-        {%- set extra_html = caller() if caller -%}
-        {% call input_block(id or name, label or name, error, classes, extra_html=extra_html, is_required=is_required)
-        %}
-        <textarea id="{{ id or name }}" name="{{ name }}" cols="{{ cols }}" rows="{{ rows }}" placeholder="{{ placeholder }}"
-            {{ attributes(attrs) }}>{{ value | empty_and_escape }}</textarea>
-        {% endcall %}
-        {% endmacro %}
-
-        {#
-        Creates all the markup required for an input element with a prefixed segment.
-        These are useful for showing url slugs and other fields where the input
-        information forms only part of the saved data.
-
-        name - The name of the form parameter.
-        id - The id to use on the input and label. Convention is to prefix with 'field-'.
-        label - The human readable label.
-        prepend - The text that will be prepended before the input.
-        value - The value of the input.
-        which will use the name key as the value.
-        placeholder - Some placeholder text.
-        error - A list of error strings for the field or just true to highlight the field.
-        classes - An array of classes to apply to the control-group.
-        is_required - Boolean of whether this input is requred for the form to validate
-
-        Examples:
-
-        {% import 'macros/form.html' as form %}
-        {{ form.prepend('slug', id='field-slug', prepend='/dataset/', label=_('Slug'), value=data.slug,
-        error=errors.slug) }}
-
-        #}
-        {% macro prepend(name, id='', label='', prepend='', value='', placeholder='', type='text', error="",
-        classes=[], attrs={}, is_required=false) %}
-        {# We manually append the error here as it needs to be inside the .input-prepend block #}
-        {% set classes = (classes|list) %}
-        {% do classes.append('error') if error %}
-        {%- set extra_html = caller() if caller -%}
-        {% call input_block(id or name, label or name, error='', classes=classes, extra_html=extra_html,
-        is_required=is_required) %}
-        <div class="input-prepend">
-            {% if prepend %}<span class="add-on">{{ prepend }}</span>{%- endif -%}
-            <input id="{{ id or name }}" type="{{ type }}" name="{{ name }}" value="{{ value | empty_and_escape }}"
-                placeholder="{{ placeholder }}" {{ attributes(attrs) }} />
-        </div>
-        {% endcall %}
-        {% endmacro %}
-
-        {#
-        Creates all the markup required for an custom key/value input. These are usually
-        used to let the user provide custom meta data. Each "field" has three inputs
-        one for the key, one for the value and a checkbox to remove it. So the arguments
-        for this macro are nearly all tuples containing values for the
-        (key, value, delete) fields respectively.
-
-        name - A tuple of names for the three fields.
-        id - An id string to be used for each input.
-        label - The human readable label for the main label.
-        values - A tuple of values for the (key, value, delete) fields. If delete
-        is truthy the checkbox will be checked.
-        placeholder - A tuple of placeholder text for the (key, value) fields.
-        error - A list of error strings for the field or just true to highlight the field.
-        classes - An array of classes to apply to the control-group.
-        is_required - Boolean of whether this input is requred for the form to validate
-
-        Examples:
-
-        {% import 'macros/form.html' as form %}
-        {{ form.custom(
-        names=('custom_key', 'custom_value', 'custom_deleted'),
-        id='field-custom',
-        label=_('Custom Field'),
-        values=(extra.key, extra.value, extra.deleted),
-        error=''
-        ) }}
-        #}
-        {% macro custom(names=(), id="", label="", values=(), placeholders=(), error="", classes=[], attrs={},
-        is_required=false, key_values=()) %}
-        {%- set classes = (classes|list) -%}
-        {%- set label_id = (id or names[0]) ~ "-key" -%}
-        {%- set extra_html = caller() if caller -%}
-        {%- do classes.append('control-custom') -%}
-
-        {% call input_block(label_id, label or name, error, classes, control_classes=["editor"], extra_html=extra_html,
-        is_required=is_required) %}
-        <div class="input-prepend" {{ attributes(attrs) }}>
-            <label for="{{ label_id }}" class="add-on">Key</label><input id="{{ id or names[0] }}-key" type="text" name="{{ names[0] }}"
-                value="{{ values[0] | empty_and_escape }}" placeholder="{{ placeholders[0] }}" />
-            <label for="{{ id or names[1] }}-value" class="add-on">Value</label><input id="{{ id or names[1] }}-value"
-                type="text" name="{{ names[1] }}" value="{{ values[1] | empty_and_escape }}" placeholder="{{ placeholders[1] }}" />
-            {% if values[0] or values[1] or error %}
-            <label class="checkbox" for="{{ id or names[2] }}-remove">
-                <input type="checkbox" id="{{ id or names[2] }}-remove" name="{{ names[2] }}" {% if values[2] %}
-                    checked{% endif %} /> <span>{{ _('Remove') }}</span>
-            </label>
-            {% endif %}
-        </div>
-        {% endcall %}
-        {% endmacro %}
-
-        {#
-        A generic input_block for providing the default markup for CKAN form elements.
-        It is expected to be called using a {% call %} block, the contents of which
-        will be inserted into the .controls element.
-
-        for - The id for the input that the label should match.
-        label - A human readable label.
-        error - A list of error strings for the field or just true.
-        classes - An array of custom classes for the outer element.
-        control_classes - An array of custom classes for the .control wrapper.
-        extra_html - An html string to be inserted after the errors eg. info text.
-        is_required - Boolean of whether this input is requred for the form to validate
-
-        Example:
-
-        {% import 'macros/form.html' as form %}
-        {% call form.input_block("field", "My Field") %}
-        <input id="field" type="text" name="{{ name }}" value="{{ value | empty_and_escape }}" />
-        {% endcall %}
-
-        #}
-        {% macro input_block(for, label, error="", classes=[], control_classes=[], extra_html="", is_required=false)
-        %}
-        <div class="control-group{{ " error" if error }}{{ " " ~ classes | join(' ') }}">
-            {%if label%}
-            <label class="control-label" for="{{ for }}">{{ label or _('Custom') }}: {% if is_required %}<span title="{{ _("This field is required") }}"
-                    class="control-required">*</span> {% endif %}</label>
-            {%endif%}
-            <div class="controls{{ " " ~ control_classes | join(' ') }}">
-                {{ caller() }}
-                {{ extra_html }}
-            </div>
-        </div>
-        {% endmacro %}
-
-        {#
-        Builds a list of errors for the current form.
-
-        errors - A dict of field/message pairs.
-        type - The alert-* class that should be applied (default: "error")
-        classes - A list of classes to apply to the wrapper (default: [])
-
-        Example:
-
-        {% import 'macros/form.html' as form %}
-        {{ form.errors(error_summary, type="warning") }}
-
-        #}
-        {% macro errors(errors={}, type="error", classes=[]) %}
-        {% if errors %}
-        <div class="error-explanation alert alert-{{ type }}{{ " " ~ classes | join(' ') }}">
-            <ul>
-                {% for key, error in errors.items() %}
-                {%if key %}
-                <li data-field-label="{{ key }}">
-                    {{_(key+': '+error)}}
-                </li>
-                {%else%}
-                <li data-field-label="{{ key }}"> {{error}} </li>
-                {%endif%}
-                {% endfor %}
-            </ul>
-        </div>
+    </div>
+    <div class="span6 inline-error">
+        {% if error is iterable and error is not string %}
+        {{error|first}}
+        {% elif error is string %}
+        {{error}}
         {% endif %}
-        {% endmacro %}
+    </div>
+</div>
+{% endcall %}
+{% endmacro %}
 
-        {#
-        Renders an info box with a description. This will usually be used with in a
-        call block when creating an input element.
 
-        text - The text to include in the box.
-        inline - If true displays the info box inline with the input.
-        classes - A list of classes to add to the info box.
+{# 
+Creates a select with an input field for autocomplete #}
+{% macro select_autocomplete(name, id='', label='', options='', selected='', error='', classes=[],  attrs={},
+    is_required=false) %}
+{% set classes = (classes|list) %}
+{% do classes.append('control-select') %}
 
-        Example
+{%- set extra_html = caller() if caller -%}
+{% call input_block(id or name, label or name, error, classes, extra_html=extra_html, is_required=is_required)
+%}
 
-        {% import 'macros/form.html' as form %}
-        {% call form.input('name') %}
-        {{ form.info(_('My useful help text')) }}
-        {% endcall %}
+<div class="row-fluid">
+    <div class="span6">
+        <select id="{{ id or name }}" name="{{ name }}" {{ attributes(attrs) }} data-module="autocomplete">
+            {% for option in options %}
+                <option value="{{ option.key }}" {% if option.key==selected %} selected {% endif %}>{{ option.text or
+                option.value }} </option>
+            {% endfor %}
+        </select>
+    </div>
+    <div class="span6 inline-error">
+        {% if error is iterable and error is not string %}
+        {{error|first}}
+        {% elif error is string %}
+        {{error}}
+        {% endif %}
+    </div>
+</div>
+{% endcall %}
+{% endmacro %}
 
-        #}
-        {% macro info(text='', inline=false, classes=[]) %}
-        {%- if text -%}
-        <div class="info-block{{ ' info-inline' if inline }}{{ " " ~ classes | join(' ') }}">
-            <i class="fa fa-info-circle"></i>
-            {{ text }}
-        </div>
-        {%- endif -%}
-        {% endmacro %}
 
-        {#
-        Builds a single hidden input.
+{#
+Creates all the markup required for a Markdown textarea element. Handles
+matching labels to inputs, selected item and error messages.
 
-        name - name of the hidden input
-        value - value of the hidden input
+name - The name of the form parameter.
+id - The id to use on the input and label. Convention is to prefix with 'field-'.
+label - The human readable label.
+value - The value of the input.
+placeholder - Some placeholder text.
+error - A list of error strings for the field or just true to highlight the field.
+classes - An array of classes to apply to the control-group.
+is_required - Boolean of whether this input is requred for the form to validate
 
-        Example
-        {% import 'macros/form.html' as form %}
-        {{ form.hidden('name', 'value') }}
+Examples:
 
-        #}
-        {% macro hidden(name, value) %}
-        <input type="hidden" name="{{ name }}" value="{{ value }}" />
-        {% endmacro %}
+{% import 'macros/form.html' as form %}
+{{ form.markdown('desc', id='field-description', label=_('Description'), value=data.desc, error=errors.desc) }}
 
-        {#
-        Contructs hidden inputs for each name-value pair.
+#}
+{% macro markdown(name, id='', label='', value='', placeholder='', error="", classes=[], attrs={},
+is_required=false, cols=20, rows=5) %}
+{% set classes = (classes|list) %}
+{% do classes.append('control-full') %}
+{% set markdown_tooltip = "
+<pre><p>__Bold text__ or _italic text_</p><p># title<br>## secondary title<br>### etc</p><p>* list<br>* of<br>* items</p><p>http://auto.link.ed/</p></pre>
+<p><b><a href='http://daringfireball.net/projects/markdown/syntax' target='_blank'>Full markdown syntax</a></b></p>
+<p class='muted'><b>Please note:</b> HTML tags are stripped out for security reasons</p>" %}
 
-        fields - [('name1', 'value1'), ('name2', 'value2'), ...]
+{%- set extra_html = caller() if caller -%}
+{% call input_block(id or name, label or name, error, classes, control_classes=["editor"],
+extra_html=extra_html, is_required=is_required) %}
+<div class="row-fluid">
+    <div class="span6">
+        <textarea id="{{ id or name }}" name="{{ name }}" cols="{{cols}}" rows="{{rows}}" placeholder="{{ placeholder }}"
+            {{ attributes(attrs) }}>{{ value | empty_and_escape }}</textarea>
+    </div>
+    <div class="span6 inline-error">
+        {{error}}
+    </div>
+</div>
+{% endcall %}
+{% endmacro %}
 
-        Two parameter for excluding several names or name-value pairs.
+{#
+Creates all the markup required for a plain textarea element. Handles
+matching labels to inputs, selected item and error messages.
 
-        except_names - list of names to be excluded
-        except - list of name-value pairs to be excluded
+name - The name of the form parameter.
+id - The id to use on the input and label. Convention is to prefix with 'field-'.
+label - The human readable label.
+value - The value of the input.
+placeholder - Some placeholder text.
+error - A list of error strings for the field or just true to highlight the field.
+classes - An array of classes to apply to the control-group.
+is_required - Boolean of whether this input is requred for the form to validate
 
+Examples:
 
-        Example:
-        {% import 'macros/form.html' as form %}
-        {% form.hidden_from_list(fields=c.fields, except=[('topic', 'xyz')]) %}
-        {% form.hidden_from_list(fields=c.fields, except_names=['time_min', 'time_max']) %}
-        #}
-        {% macro hidden_from_list(fields, except_names=None, except=None) %}
-        {% set except_names = except_names or [] %}
-        {% set except = except or [] %}
+{% import 'macros/form.html' as form %}
+{{ form.textarea('desc', id='field-description', label=_('Description'), value=data.desc, error=errors.desc) }}
 
-        {% for name, value in fields %}
-        {% if name and value and name not in except_names and (name, value) not in except %}
-        {{ hidden(name, value) }}
-        {% endif %}
+#}
+{% macro textarea(name, id='', label='', value='', placeholder='', error="", classes=[], attrs={},
+is_required=false, rows=5, cols=20) %}
+{% set classes = (classes|list) %}
+{% do classes.append('control-full') %}
+
+{%- set extra_html = caller() if caller -%}
+{% call input_block(id or name, label or name, error, classes, extra_html=extra_html, is_required=is_required)
+%}
+<textarea id="{{ id or name }}" name="{{ name }}" cols="{{ cols }}" rows="{{ rows }}" placeholder="{{ placeholder }}"
+    {{ attributes(attrs) }}>{{ value | empty_and_escape }}</textarea>
+{% endcall %}
+{% endmacro %}
+
+{#
+Creates all the markup required for an input element with a prefixed segment.
+These are useful for showing url slugs and other fields where the input
+information forms only part of the saved data.
+
+name - The name of the form parameter.
+id - The id to use on the input and label. Convention is to prefix with 'field-'.
+label - The human readable label.
+prepend - The text that will be prepended before the input.
+value - The value of the input.
+which will use the name key as the value.
+placeholder - Some placeholder text.
+error - A list of error strings for the field or just true to highlight the field.
+classes - An array of classes to apply to the control-group.
+is_required - Boolean of whether this input is requred for the form to validate
+
+Examples:
+
+{% import 'macros/form.html' as form %}
+{{ form.prepend('slug', id='field-slug', prepend='/dataset/', label=_('Slug'), value=data.slug,
+error=errors.slug) }}
+
+#}
+{% macro prepend(name, id='', label='', prepend='', value='', placeholder='', type='text', error="",
+classes=[], attrs={}, is_required=false) %}
+{# We manually append the error here as it needs to be inside the .input-prepend block #}
+{% set classes = (classes|list) %}
+{% do classes.append('error') if error %}
+{%- set extra_html = caller() if caller -%}
+{% call input_block(id or name, label or name, error='', classes=classes, extra_html=extra_html,
+is_required=is_required) %}
+<div class="input-prepend">
+    {% if prepend %}<span class="add-on">{{ prepend }}</span>{%- endif -%}
+    <input id="{{ id or name }}" type="{{ type }}" name="{{ name }}" value="{{ value | empty_and_escape }}"
+        placeholder="{{ placeholder }}" {{ attributes(attrs) }} />
+</div>
+{% endcall %}
+{% endmacro %}
+
+{#
+Creates all the markup required for an custom key/value input. These are usually
+used to let the user provide custom meta data. Each "field" has three inputs
+one for the key, one for the value and a checkbox to remove it. So the arguments
+for this macro are nearly all tuples containing values for the
+(key, value, delete) fields respectively.
+
+name - A tuple of names for the three fields.
+id - An id string to be used for each input.
+label - The human readable label for the main label.
+values - A tuple of values for the (key, value, delete) fields. If delete
+is truthy the checkbox will be checked.
+placeholder - A tuple of placeholder text for the (key, value) fields.
+error - A list of error strings for the field or just true to highlight the field.
+classes - An array of classes to apply to the control-group.
+is_required - Boolean of whether this input is requred for the form to validate
+
+Examples:
+
+{% import 'macros/form.html' as form %}
+{{ form.custom(
+names=('custom_key', 'custom_value', 'custom_deleted'),
+id='field-custom',
+label=_('Custom Field'),
+values=(extra.key, extra.value, extra.deleted),
+error=''
+) }}
+#}
+{% macro custom(names=(), id="", label="", values=(), placeholders=(), error="", classes=[], attrs={},
+is_required=false, key_values=()) %}
+{%- set classes = (classes|list) -%}
+{%- set label_id = (id or names[0]) ~ "-key" -%}
+{%- set extra_html = caller() if caller -%}
+{%- do classes.append('control-custom') -%}
+
+{% call input_block(label_id, label or name, error, classes, control_classes=["editor"], extra_html=extra_html,
+is_required=is_required) %}
+<div class="input-prepend" {{ attributes(attrs) }}>
+    <label for="{{ label_id }}" class="add-on">Key</label><input id="{{ id or names[0] }}-key" type="text" name="{{ names[0] }}"
+        value="{{ values[0] | empty_and_escape }}" placeholder="{{ placeholders[0] }}" />
+    <label for="{{ id or names[1] }}-value" class="add-on">Value</label><input id="{{ id or names[1] }}-value"
+        type="text" name="{{ names[1] }}" value="{{ values[1] | empty_and_escape }}" placeholder="{{ placeholders[1] }}" />
+    {% if values[0] or values[1] or error %}
+    <label class="checkbox" for="{{ id or names[2] }}-remove">
+        <input type="checkbox" id="{{ id or names[2] }}-remove" name="{{ names[2] }}" {% if values[2] %}
+            checked{% endif %} /> <span>{{ _('Remove') }}</span>
+    </label>
+    {% endif %}
+</div>
+{% endcall %}
+{% endmacro %}
+
+
+
+{% macro input_address(field, label, value='', index='', placeholder='', type='text', attrs={}) %}
+{%- set _type = 'text' if type=='date' and not value else type -%}
+{%- set onFocus = 'onfocus=(this.type=\'date\')' if type=='date' and not value else '' -%}
+<div class="row-fluid">
+    <div class="span6">
+    <label class="address-label"> {{ label }} </label>
+    <input id="field-{{field}}-key" type="hidden" name="extras__{{index}}__key" value="{{field}}"  />
+    <input id="field-{{field}}-value" type="{{_type}}" name="extras__{{index}}__value" value="{{value | empty_and_escape }}" placeholder="{{ placeholder }}" {{ onFocus }} {{ attributes(attrs) }}/>
+</div>
+</div>
+{% endmacro %}
+
+
+
+{#
+A generic input_block for providing the default markup for CKAN form elements.
+It is expected to be called using a {% call %} block, the contents of which
+will be inserted into the .controls element.
+
+for - The id for the input that the label should match.
+label - A human readable label.
+error - A list of error strings for the field or just true.
+classes - An array of custom classes for the outer element.
+control_classes - An array of custom classes for the .control wrapper.
+extra_html - An html string to be inserted after the errors eg. info text.
+is_required - Boolean of whether this input is requred for the form to validate
+
+Example:
+
+{% import 'macros/form.html' as form %}
+{% call form.input_block("field", "My Field") %}
+<input id="field" type="text" name="{{ name }}" value="{{ value | empty_and_escape }}" />
+{% endcall %}
+
+#}
+{% macro input_block(for, label, error="", classes=[], control_classes=[], extra_html="", is_required=false)
+%}
+<div class="control-group{{ " error" if error }}{{ " " ~ classes | join(' ') }}">
+    {%if label%}
+    <label class="control-label" for="{{ for }}">{{ label or _('Custom') }}: {% if is_required %}<span title="{{ _("This field is required") }}"
+            class="control-required">*</span> {% endif %}</label>
+    {%endif%}
+    <div class="controls{{ " " ~ control_classes | join(' ') }}">
+        {{ caller() }}
+        {{ extra_html }}
+    </div>
+</div>
+{% endmacro %}
+
+{#
+Builds a list of errors for the current form.
+
+errors - A dict of field/message pairs.
+type - The alert-* class that should be applied (default: "error")
+classes - A list of classes to apply to the wrapper (default: [])
+
+Example:
+
+{% import 'macros/form.html' as form %}
+{{ form.errors(error_summary, type="warning") }}
+
+#}
+{% macro errors(errors={}, type="error", classes=[]) %}
+{% if errors %}
+<div class="error-explanation alert alert-{{ type }}{{ " " ~ classes | join(' ') }}">
+    <ul>
+        {% for key, error in errors.items() %}
+        {%if key %}
+        <li data-field-label="{{ key }}">
+            {{_(key+': '+error)}}
+        </li>
+        {%else%}
+        <li data-field-label="{{ key }}"> {{error}} </li>
+        {%endif%}
         {% endfor %}
-        {% endmacro %}
-
-        {#
-        Builds a space seperated list of html attributes from a dict of key/value pairs.
-        Generally only used internally by macros.
-
-        attrs - A dict of attribute/value pairs
-
-        Example
-
-        {% import 'macros/form.html' as form %}
-        {{ form.attributes({}) }}
-
-        #}
-        {%- macro attributes(attrs={}) -%}
-        {%- for key, value in attrs.items() -%}
-        {{ " " }}{{ key }}{% if value != "" %}="{{ value }}"{% endif %}
-        {%- endfor -%}
-        {%- endmacro -%}
-
-        {#
-        Outputs the "* Required field" message for the bottom of formss
-
-        Example
-        {% import 'macros/form.html' as form %}
-        {{ form.required_message() }}
-
-        #}
-        {% macro required_message() %}
-        <p class="control-required-message">
-            <span class="control-required">*</span> {{ _("Required field") }}
-        </p>
-        {% endmacro %}
-
-        {#
-        Builds a file upload for input
-
-        Example
-        {% import 'macros/form.html' as form %}
-        {{ form.image_upload(data, errors, is_upload_enabled=true) }}
-
-        #}
-        {% macro image_upload(data, errors, field_url='image_url', field_upload='image_upload',
-        field_clear='clear_upload',
-        is_url=false, is_upload=false, is_upload_enabled=false, placeholder=false,
-        url_label='', upload_label='', field_name='image_url') %}
-        {% set placeholder = placeholder if placeholder else _('http://example.com/my-image.jpg') %}
-        {% set url_label = url_label or _('Image URL') %}
-        {% set upload_label = upload_label or _('Image') %}
-
-        {% if is_upload_enabled %}
-        <div class="image-upload" data-module="odsh_image-upload" data-module-is_url="{{ 'true' if is_url else 'false' }}"
-            data-module-is_upload="{{ 'true' if is_upload else 'false' }}" data-module-field_url="{{ field_url }}"
-            data-module-field_upload="{{ field_upload }}" data-module-field_clear="{{ field_clear }}"
-            data-module-upload_label="{{ upload_label }}" data-module-field_name="{{ field_name }}">
-            {% endif %}
-
-            {{ input(field_url, label=url_label, id='field-image-url', placeholder=placeholder,
-            value=data.get(field_url), error='', classes=['control-full']) }}
-
-            {% if is_upload_enabled %}
-            {{ input(field_upload, label=upload_label, id='field-image-upload', type='file', placeholder='', value='',
-            error=errors, classes=['control-full'], is_required=true) }}
-            {% if is_upload %}
-            {{ checkbox(field_clear, label=_('Clear Upload'), id='field-clear-upload', value='true', error='',
-            classes=['control-full']) }}
-            {% endif %}
-            {% endif %}
-
-            {% if is_upload_enabled %}</div>{% endif %}
-
-        {% endmacro %}
+    </ul>
+</div>
+{% endif %}
+{% endmacro %}
+
+{#
+Renders an info box with a description. This will usually be used with in a
+call block when creating an input element.
+
+text - The text to include in the box.
+inline - If true displays the info box inline with the input.
+classes - A list of classes to add to the info box.
+
+Example
+
+{% import 'macros/form.html' as form %}
+{% call form.input('name') %}
+{{ form.info(_('My useful help text')) }}
+{% endcall %}
+
+#}
+{% macro info(text='', inline=false, classes=[]) %}
+{%- if text -%}
+<div class="info-block{{ ' info-inline' if inline }}{{ " " ~ classes | join(' ') }}">
+    <i class="fa fa-info-circle"></i>
+    {{ text }}
+</div>
+{%- endif -%}
+{% endmacro %}
+
+{#
+Builds a single hidden input.
+
+name - name of the hidden input
+value - value of the hidden input
+
+Example
+{% import 'macros/form.html' as form %}
+{{ form.hidden('name', 'value') }}
+
+#}
+{% macro hidden(name, value) %}
+<input type="hidden" name="{{ name }}" value="{{ value }}" />
+{% endmacro %}
+
+{#
+Contructs hidden inputs for each name-value pair.
+
+fields - [('name1', 'value1'), ('name2', 'value2'), ...]
+
+Two parameter for excluding several names or name-value pairs.
+
+except_names - list of names to be excluded
+except - list of name-value pairs to be excluded
+
+
+Example:
+{% import 'macros/form.html' as form %}
+{% form.hidden_from_list(fields=c.fields, except=[('topic', 'xyz')]) %}
+{% form.hidden_from_list(fields=c.fields, except_names=['time_min', 'time_max']) %}
+#}
+{% macro hidden_from_list(fields, except_names=None, except=None) %}
+{% set except_names = except_names or [] %}
+{% set except = except or [] %}
+
+{% for name, value in fields %}
+{% if name and value and name not in except_names and (name, value) not in except %}
+{{ hidden(name, value) }}
+{% endif %}
+{% endfor %}
+{% endmacro %}
+
+{#
+Builds a space seperated list of html attributes from a dict of key/value pairs.
+Generally only used internally by macros.
+
+attrs - A dict of attribute/value pairs
+
+Example
+
+{% import 'macros/form.html' as form %}
+{{ form.attributes({}) }}
+
+#}
+{%- macro attributes(attrs={}) -%}
+{%- for key, value in attrs.items() -%}
+{{ " " }}{{ key }}{% if value != "" %}="{{ value }}"{% endif %}
+{%- endfor -%}
+{%- endmacro -%}
+
+{#
+Outputs the "* Required field" message for the bottom of formss
+
+Example
+{% import 'macros/form.html' as form %}
+{{ form.required_message() }}
+
+#}
+{% macro required_message() %}
+<p class="control-required-message">
+    <span class="control-required">*</span> {{ _("Required field") }}
+</p>
+{% endmacro %}
+
+{#
+Builds a file upload for input
+
+Example
+{% import 'macros/form.html' as form %}
+{{ form.image_upload(data, errors, is_upload_enabled=true) }}
+
+#}
+{% macro image_upload(data, errors, field_url='image_url', field_upload='image_upload',
+field_clear='clear_upload',
+is_url=false, is_upload=false, is_upload_enabled=false, placeholder=false,
+url_label='', upload_label='', field_name='image_url') %}
+{% set placeholder = placeholder if placeholder else _('http://example.com/my-image.jpg') %}
+{% set url_label = url_label or _('Image URL') %}
+{% set upload_label = upload_label or _('Image') %}
+
+{% if is_upload_enabled %}
+<div class="image-upload" data-module="odsh_image-upload" data-module-is_url="{{ 'true' if is_url else 'false' }}"
+    data-module-is_upload="{{ 'true' if is_upload else 'false' }}" data-module-field_url="{{ field_url }}"
+    data-module-field_upload="{{ field_upload }}" data-module-field_clear="{{ field_clear }}"
+    data-module-upload_label="{{ upload_label }}" data-module-field_name="{{ field_name }}">
+    {% endif %}
+
+    {{ input(field_url, label=url_label, id='field-image-url', placeholder=placeholder,
+    value=data.get(field_url), error='', classes=['control-full']) }}
+
+    {% if is_upload_enabled %}
+    {{ input(field_upload, label=upload_label, id='field-image-upload', type='file', placeholder='', value='',
+    error=errors, classes=['control-full'], is_required=true) }}
+    {% if is_upload %}
+    {{ checkbox(field_clear, label=_('Clear Upload'), id='field-clear-upload', value='true', error='',
+    classes=['control-full']) }}
+    {% endif %}
+    {% endif %}
+
+    {% if is_upload_enabled %}</div>{% endif %}
+
+{% endmacro %}
diff --git a/ckanext/odsh/templates/organization/snippets/organization_form.html b/ckanext/odsh/templates/organization/snippets/organization_form.html
index 4028d048..364433fb 100644
--- a/ckanext/odsh/templates/organization/snippets/organization_form.html
+++ b/ckanext/odsh/templates/organization/snippets/organization_form.html
@@ -25,32 +25,23 @@
     {{ form.image_upload(data, errors, is_upload_enabled=h.uploads_enabled(), is_url=is_url, is_upload=is_upload) }}
 
   {% endblock %}
-
-  {% block custom_fields %}
-    {% for extra in data.extras %}
-      {% set prefix = 'extras__%d__' % loop.index0 %}
-      {{ form.custom(
-        names=(prefix ~ 'key', prefix ~ 'value', prefix ~ 'deleted'),
-        id='field-extras-%d' % loop.index,
-        label=_('Custom Field'),
-        values=(extra.key, extra.value, extra.deleted),
-        error=errors[prefix ~ 'key'] or errors[prefix ~ 'value']
-      ) }}
-    {% endfor %}
-
-    {# Add a max if 3 empty columns #}
-    {% for extra in range(data.extras|count, 3) %}
-      {% set index = (loop.index0 + data.extras|count) %}
-      {% set prefix = 'extras__%d__' % index %}
-      {{ form.custom(
-        names=(prefix ~ 'key', prefix ~ 'value', prefix ~ 'deleted'),
-        id='field-extras-%d' % index,
-        label=_('Custom Field'),
-        values=(extra.key, extra.value, extra.deleted),
-        error=errors[prefix ~ 'key'] or errors[prefix ~ 'value']
-      ) }}
-    {% endfor %}
-  {% endblock %}
+  
+  
+
+ 
+  {% set extras = h.tpsh_get_address_org(data) %}
+
+  {{ form.input_address('person','Ansprechpartner', value= extras.person , index=0, placeholder='', type='text', attrs={}) }}
+ 
+  {{ form.input_address('street','Straße', value= extras.street, index=1, placeholder='', type='text', attrs={}) }}
+  
+  {{ form.input_address('location','Stadt', value=extras.location, index=2, placeholder='', type='text', attrs={}) }}
+  
+  {{ form.input_address('telephone','Tel.-Nr.:', value=extras.telephone, index=3, placeholder='', type='text', attrs={}) }}
+
+  {{ form.input_address('mail','e-mail', value=extras.mail, index=4, placeholder='', type='text', attrs={}) }}
+ 
+  {{ form.input_address('web','Website', value=extras.web, index=5, placeholder='', type='text', attrs={}) }}
 
   {{ form.required_message() }}
 
diff --git a/ckanext/odsh/templates/package/read.html b/ckanext/odsh/templates/package/read.html
index 097f993d..068b6087 100644
--- a/ckanext/odsh/templates/package/read.html
+++ b/ckanext/odsh/templates/package/read.html
@@ -1,8 +1,10 @@
 {% extends "package/read_base.html" %}
 
 {% set pkg = c.pkg_dict %}
-
-
+{% set collection_title = h.collection_get_title(pkg) %}
+{% set successor_url = h.collection_get_successor(pkg) %}
+{% set predecessor_url = h.collection_get_predecessor(pkg) %}
+{% set latest_collection_member = h.collection_get_latest_member(pkg) %}
 {% set stars = h.odsh_openness_score_dataset_html(pkg) %}
 
 {% block breadcrumb_content %}
@@ -25,7 +27,7 @@
 {% block primary_content_inner %}
 {{ super() }}
 {% block package_description %}
-<div class="odsh-dataset-heading row-fluid">
+<div class="odsh-dataset-heading">
   <h2>
     {% block page_heading %}
     {{ h.dataset_display_name(pkg) }}
@@ -36,7 +38,7 @@
     [{{ _('Deleted') }}]
     {% endif %}
     {% endblock %}
-    <div class="pull-right">
+    <div class="odsh-dataset-edit-button">
       {% if h.check_access('package_update', {'id':pkg.id }) %}
       <div>
         {% link_for _('Manage Dataset'), controller='package', action='edit', id=pkg.name, class_='btn btn-primary btn-add-dataset',
@@ -60,16 +62,19 @@
   {% endif %}
 </div>
 {# {{ pkg.resources }} #}
+
 {% block package_notes %}
+<div class="btn btn-primary btn-lg show-filters" role="button">
+    <img src="/base/images/icon_info.svg" aria-hidden="true"></img>
+    {{ _('Detailinformationen') }}
+</div>
 {% if pkg.notes %}
 <div class="notes embedded-content">
   {{ h.render_markdown(h.get_translated(pkg, 'notes')) }}
 </div>
 {% endif %}
-{% endblock %}
-{# FIXME why is this here? seems wrong #}
-<span class="insert-comment-thread"></span>
-{% endblock %}
+{% endblock package_notes %}
+{% endblock package_description %}
 
 {% block package_resources %}
 {% snippet "package/snippets/resources_list.html", pkg=pkg, resources=pkg.resources %}
@@ -80,6 +85,48 @@
   {% endif %}
 {% endblock %}
 
+{% block collection %}
+{% if latest_collection_member %}
+<section id="dataset-collection">
+    {% if collection_title %}
+    <p>
+        Dieser Datensatz ist Bestandteil der Datenreihe "{{ collection_title }}". 
+        Sie können zu älteren und neueren Datensätzen blättern.
+    </p>
+    {% endif %} {# collection_title #}
+    <div class="button-container">
+        <a href="{{ latest_collection_member }}" class="btn btn-primary btn-lg" role="button">
+            <img src="/base/images/icon_latest.svg" aria-hidden="true"></img>
+            <span class="hide-on-mobile">{{ _('latest collection member') }}</span>
+        </a>
+        {% if predecessor_url %} 
+        <a href="{{ predecessor_url }}" class="btn btn-primary btn-lg" role="button">
+            <img src="/base/images/icon_arrow_left.svg" aria-hidden="true"></img>
+            <span class="hide-on-mobile">{{ _('predecessor') }}</span>
+        </a>
+        {% else %}
+        <a href="#" class="btn btn-primary btn-lg disabled" role="button">
+            <img src="/base/images/icon_arrow_left.svg" aria-hidden="true"></img>
+            <span class="hide-on-mobile">{{ _('predecessor') }}</span>
+        </a>
+        {% endif %}  
+        {% if successor_url %}
+        <a href="{{ successor_url }}" class="btn btn-primary btn-lg" role="button">
+            <span class="hide-on-mobile">{{ _('successor') }}</span>
+            <img src="/base/images/icon_arrow_right.svg" aria-hidden="true"></img>
+        </a>
+        {% else %}
+        <a href="#" class="btn btn-primary btn-lg disabled" role="button">
+            <span class="hide-on-mobile">{{ _('successor') }}</span>
+            <img src="/base/images/icon_arrow_right.svg" aria-hidden="true"></img>
+        </a>
+        {% endif %}
+    </div>
+</section>
+{% endif %} {# latest_collection_member #}
+{% endblock collection %}
+
+
 <div class='tag-container'>
 {% for tag in pkg.tags %}
     <div class='tag-pill'>
@@ -88,4 +135,5 @@
 {% endfor %}
 </div>
 
-{% endblock %}
\ No newline at end of file
+{% endblock %}
+
diff --git a/ckanext/odsh/templates/package/read_base.html b/ckanext/odsh/templates/package/read_base.html
index 9597da67..99cb65fd 100644
--- a/ckanext/odsh/templates/package/read_base.html
+++ b/ckanext/odsh/templates/package/read_base.html
@@ -9,9 +9,10 @@
 {% block secondary_content %}
 
 {% block package_organization %}
+{% snippet "package/snippets/close_mobile_sidebar_button.html" %}
 {% if pkg.organization %}
 {% set org = h.get_organization(pkg.organization.name) %}
-{% snippet "snippets/organization.html", organization=org, has_context_title=true, hide_description=true %}
+{% snippet "snippets/organization.html", package=pkg, organization=org, has_context_title=true, hide_description=true %}
 {% endif %}
 {% endblock %}
 
diff --git a/ckanext/odsh/templates/package/search.html b/ckanext/odsh/templates/package/search.html
index 75ce5e4e..b08b1f55 100644
--- a/ckanext/odsh/templates/package/search.html
+++ b/ckanext/odsh/templates/package/search.html
@@ -1,12 +1,18 @@
 {% ckan_extends %}
 
 
+{% block breadcrumb_content %}
+  <li class="active">{{ h.nav_link(_('Documents'), controller='package', action='search', highlight_actions = 'new index') }}</li>
+{% endblock %}
 
 {% block toolbar %}
 {{ super() }}
 <form id='dataset-search-box-form' class="section site-search simple-input" action="{% url_for controller='package', action='search' %}"
-    method="get" data-module="select-switch">
-{% snippet "snippets/search_box.html"%}
+method="get" data-module="select-switch">
+    <div class="row filter-search-row">
+        <div class='btn show-filters'>Filter</div>
+        {% snippet "snippets/search_box.html"%}
+    </div>
 {% endblock %}
 
 {% block primary_content %}
@@ -31,22 +37,23 @@
   {% endblock %}
 {% endblock %}
 
-
 {% block secondary_content %}
 <div class="filters">
-  <div class="container-fluid filter-reset">
-    <div class="filter-reset-label"><span>Filter:</span></div>
-    <div class="filter-reset-box"><a href="{{h.url_for(controller='package', action='search')}}">zurücksetzen</a></button></div>
-  </div>
+    {% snippet "package/snippets/close_mobile_sidebar_button.html" %}
+    <div class="container-fluid filter-reset">
+        <div class="filter-reset-label"><span>Filter:</span></div>
+        <div class="filter-reset-box">
+            <a href="{{h.url_for(controller='package', action='search')}}">zurücksetzen</a>
+        </div>
+    </div>
 </div>
-{% snippet "snippets/map.html",
-default_extent="{ \"type\": \"Polygon\", \"coordinates\": [[[7.6574,53.1632],[11.8322,53.1632],[11.8322,55.1066],
-[7.6574,55.1066],[7.6574,53.1632]]] }"%}
+
 <div class="filters">
   <div>
     {% for facet in c.facet_titles %}
     {{ h.snippet('snippets/facet_list.html', title=c.facet_titles[facet], name=facet) }}
     {% endfor %}
+  </div>
 
   {% block datereange_search %}
   {% set has_range_filter = request.params.get('ext_startdate') or request.params.get('ext_enddate') %}
@@ -66,27 +73,41 @@ default_extent="{ \"type\": \"Polygon\", \"coordinates\": [[[7.6574,53.1632],[11
             {%- set end_error = h.odsh_render_datetime(end, False) == '' and end -%}
             {%- set typeStart = 'text' if (start_error or not start) else 'date' -%}
             {%- set typeEnd = 'text' if (end_error or not end) else 'date' -%}
+            
             <label for="ext_startdate">{{_('from')|title}}</label>
-	          {% snippet 'snippets/datepicker.html', id='ext_startdate', value=start, class='rangesearch', placeholder=_('Date') %}
-              {%if start_error %}
-                <div class="error-reange-search">
-                    {{_('wrong_start_date_for_search')}}
-                </div>
-              {%endif%}
+            {% 
+              snippet 'snippets/datepicker.html', 
+              aria_label=_('date start'), 
+              id='ext_startdate', 
+              value=start, 
+              class='rangesearch', 
+              placeholder=_('Date') 
+            %}
+            {%if start_error %}
+              <div class="error-reange-search">
+                  {{_('wrong_start_date_for_search')}}
+              </div>
+            {%endif%}
+            
             <label for="ext_enddate">{{_('to')|title}}</label>
-	          {% snippet 'snippets/datepicker.html', id='ext_enddate', value=end, class='rangesearch', placeholder=_('Date') %}
-              {%if end_error %}
-                <div class="error-reange-search">
-                    {{_('wrong_end_date_for_search')}}
-                </div>
-              {%endif%}
+            {% 
+              snippet 'snippets/datepicker.html', 
+              aria_label=_('date end'),
+              id='ext_enddate', 
+              value=end, 
+              class='rangesearch', 
+              placeholder=_('Date') 
+            %}
+            {%if end_error %}
+              <div class="error-reange-search">
+                  {{_('wrong_end_date_for_search')}}
+              </div>
+            {%endif%}
             <a class='pull-right' href="javascript:{}" onclick="$('#dataset-search-box-form').submit();" class="action">{{_('submit date search') }}</a>
           </div>
       </div>
     </nav>
   </section>
-  </div>
- <a class="close no-text hide-filters"><i class="fa fa-times-circle"></i><span class="text">close</span></a>
   {% endblock %}
 
 </div>
@@ -94,4 +115,4 @@ default_extent="{ \"type\": \"Polygon\", \"coordinates\": [[[7.6574,53.1632],[11
 
 {% block pre_wrap %}
 </form>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/ckanext/odsh/templates/package/search.html_neu b/ckanext/odsh/templates/package/search.html_neu
new file mode 100644
index 00000000..cadf27f0
--- /dev/null
+++ b/ckanext/odsh/templates/package/search.html_neu
@@ -0,0 +1,123 @@
+{% ckan_extends %}
+
+
+{% block breadcrumb_content %}
+  <li class="active">{{ h.nav_link(_('Documents'), controller='package', action='search', highlight_actions = 'new index') }}</li>
+{% endblock %}
+
+{% block toolbar %}
+{{ super() }}
+<form id='dataset-search-box-form' class="section site-search simple-input" action="{% url_for controller='package', action='search' %}"
+method="get" data-module="select-switch">
+    <div class="row filter-search-row">
+        <div class='btn show-filters'>Filter</div>
+        {% snippet "snippets/search_box.html"%}
+    </div>
+{% endblock %}
+
+{% block primary_content %}
+  <section class="module">
+    <div class="module-content">
+      {% block page_primary_action %}
+      {% endblock %}
+      {% block form %}
+        {{ super() }}
+      {% endblock %}
+      {% block package_search_results_list %}
+        {{ h.snippet('snippets/package_list.html', packages=c.page.items) }}
+      {% endblock %}
+    </div>
+
+    {% block page_pagination %}
+    {{ c.page.pager(q=c.q,symbol_next='>') }}
+    {% endblock %}
+  </section>
+
+  {% block package_search_results_api %}
+  {% endblock %}
+{% endblock %}
+
+
+{% block secondary_content %}
+<div class="filters">
+    {% snippet "package/snippets/close_mobile_sidebar_button.html" %}
+    <div class="container-fluid filter-reset">
+        <div class="filter-reset-label"><span>Filter:</span></div>
+        <div class="filter-reset-box">
+            <a href="{{h.url_for(controller='package', action='search')}}">zurücksetzen</a>
+        </div>
+    </div>
+</div>
+{% snippet "snippets/map.html",
+default_extent="{ \"type\": \"Polygon\", \"coordinates\": [[[7.6574,53.1632],[11.8322,53.1632],[11.8322,55.1066],
+[7.6574,55.1066],[7.6574,53.1632]]] }"%}
+<div class="filters">
+  <div>
+    {% for facet in c.facet_titles %}
+    {{ h.snippet('snippets/facet_list.html', title=c.facet_titles[facet], name=facet) }}
+    {% endfor %}
+  </div>
+
+  {% block datereange_search %}
+  {% set has_range_filter = request.params.get('ext_startdate') or request.params.get('ext_enddate') %}
+  <section class="module module-narrow module-shallow">
+    <nav>
+      <div class="nav-title">{{_('timerange')}}</div>
+      <div class="rangesearch-controls">
+          {% import 'macros/form.html' as form %}
+          {% resource 'odsh/moment.js' %}
+          {% resource 'odsh/datepicker.css' %}
+          {% resource 'odsh/bootstrap-datepicker.js' %}
+          {% resource 'odsh/odsh_datepicker.js' %}
+          <div class='controls rangesearch' >
+            {%- set start = request.params['ext_startdate'] -%}
+            {%- set start_error = h.odsh_render_datetime(start, False) == '' and start -%}
+            {%- set end = request.params['ext_enddate'] -%}
+            {%- set end_error = h.odsh_render_datetime(end, False) == '' and end -%}
+            {%- set typeStart = 'text' if (start_error or not start) else 'date' -%}
+            {%- set typeEnd = 'text' if (end_error or not end) else 'date' -%}
+            
+            <label for="ext_startdate">{{_('from')|title}}</label>
+            {% 
+              snippet 'snippets/datepicker.html', 
+              aria_label=_('date start'), 
+              id='ext_startdate', 
+              value=start, 
+              class='rangesearch', 
+              placeholder=_('Date') 
+            %}
+            {%if start_error %}
+              <div class="error-reange-search">
+                  {{_('wrong_start_date_for_search')}}
+              </div>
+            {%endif%}
+            
+            <label for="ext_enddate">{{_('to')|title}}</label>
+            {% 
+              snippet 'snippets/datepicker.html', 
+              aria_label=_('date end'),
+              id='ext_enddate', 
+              value=end, 
+              class='rangesearch', 
+              placeholder=_('Date') 
+            %}
+            {%if end_error %}
+              <div class="error-reange-search">
+                  {{_('wrong_end_date_for_search')}}
+              </div>
+            {%endif%}
+            <a class='pull-right' href="javascript:{}" onclick="$('#dataset-search-box-form').submit();" class="action">{{_('submit date search') }}</a>
+          </div>
+      </div>
+    </nav>
+  </section>
+  </div>
+ <a class="close no-text hide-filters"><i class="fa fa-times-circle"></i><span class="text">close</span></a>
+  {% endblock %}
+
+</div>
+{% endblock %}
+
+{% block pre_wrap %}
+</form>
+{% endblock %}
diff --git a/ckanext/odsh/templates/package/snippets/close_mobile_sidebar_button.html b/ckanext/odsh/templates/package/snippets/close_mobile_sidebar_button.html
new file mode 100644
index 00000000..5e30ade9
--- /dev/null
+++ b/ckanext/odsh/templates/package/snippets/close_mobile_sidebar_button.html
@@ -0,0 +1,3 @@
+<div class="container-fluid hide-filters-style">
+    <a class="no-text hide-filters"><img src="/base/images/icon_close.svg" alt="Filterdialog schließen"><span class="text">close</span></a>
+</div>
\ No newline at end of file
diff --git a/ckanext/odsh/templates/package/snippets/info.html b/ckanext/odsh/templates/package/snippets/info.html
index cff6830c..167ec74d 100644
--- a/ckanext/odsh/templates/package/snippets/info.html
+++ b/ckanext/odsh/templates/package/snippets/info.html
@@ -8,6 +8,11 @@ Example:
 {% snippet "package/snippets/info.html", pkg=pkg %}
 
 #}
+
+{% set daterange = h.tpsh_get_daterange_prettified(pkg) %}
+{% set language_icon = h.get_language_icon(pkg) %}
+{% set license_attribution_by_text = h.odsh_extract_value_from_extras(pkg.extras, 'licenseAttributionByText') %}
+
 {% block package_info %}
 {% if pkg %}
 <section class="module module-narrow">
@@ -15,40 +20,43 @@ Example:
         <div class="module-content">
             {% block package_info_inner %}
             {% block heading %}
-            {% endblock %}
+            {% endblock heading %}
 
-            {% block groups %}
-            <div class="groups-detail info-detail">
-                <div>{{ _('Kategorie') }}:</div>
-                {{ pkg.groups|map(attribute='display_name')|join('; ') }}
+            {% block groups %} {# aka categories #}
+            {% if pkg.groups|length %}
+            <div class="info-detail groups-detail">
+                <div>
+                    {% trans category_count=pkg.groups|length %}
+                    category:
+                    {% pluralize %}
+                    categories:
+                    {% endtrans %}
+                </div>
+                {% for category in pkg.groups %}
+                <span class='category-with-icon'>
+                    <span class='category-icon-container'>
+                        <img src="/base/images/icon_kat_{{category.name}}.svg" />
+                    </span>
+                    <span class="category-name">
+                        {{ category.display_name }}
+                    </span>
+                </span>
+                {% endfor %}
             </div>
-            {% endblock %}
-
-            {% block nums %}
-            {% endblock %}
-
+            {% endif %}
+            {% endblock groups %}
 
-            {% block license %}
-            <div class="license-detail info-detail">
-                <div>{{ _('License') }}:</div>
-                {%set lic=pkg.license_title if pkg.license_title else '-'%}
-                {%set licenseAttributionByText = h.odsh_extract_value_from_extras(pkg.extras,'licenseAttributionByText') %}
-                {%set name=' (' + licenseAttributionByText +')' if licenseAttributionByText else ''%}
-                <a href='{{pkg.license_url}}'>{{ lic }}</a>{{ name }}
-            </div>
-            {% endblock %}
 
             {% block timerange %}
+            {% if daterange %}
             <div class="timerange-detail info-detail">
                 <div>{{ _('timerange') }}:</div>
-                {% set temporal_start = h.odsh_extract_value_from_extras(pkg.extras,'temporal_start') %}
-                {% set temporal_end = h.odsh_extract_value_from_extras(pkg.extras,'temporal_end') %}
-                {%set start=h.odsh_render_datetime(temporal_start) if temporal_start else ''%}
-                {%set end=h.odsh_render_datetime(temporal_end) if temporal_end else ''%}
-                <p>{{ start }} - {{ end }}</p>
+                <p>{{ daterange }}</p>
             </div>
-            {% endblock %}
+            {% endif %}
+            {% endblock timerange %}
 
+            
             {% block last_change %}
             <div class="last-change-detail info-detail">
                 {% set value = h.odsh_extract_value_from_extras(pkg.extras,'issued')%}
@@ -61,9 +69,19 @@ Example:
                 <div>{{ _('modified') }}:</div>
                 {{modified}}
             </div>
-            {% endblock %}
+            {% endblock last_change %}
+
+            {% block license %}
+            <div class="license-detail info-detail">
+                <div>{{ _('License') }}:</div>
+                {%set lic=pkg.license_title if pkg.license_title else '-'%}
+                {%set licenseAttributionByText = h.odsh_extract_value_from_extras(pkg.extras,'licenseAttributionByText') %}
+                {%set name=' (' + licenseAttributionByText +')' if licenseAttributionByText else ''%}
+                <a href='{{pkg.license_url}}'>{{ lic }}</a>{{ name }}
+            </div>
+            {% endblock license %}
 
-            {% endblock %}
+            {% endblock package_info_inner %}
         </div>
         {% set map_text = h.odsh_get_spatial_text(pkg) %}
         <div class="spatial-detail info-detail">
@@ -95,15 +113,27 @@ Example:
             {% set current_url = h.odsh_encodeurl(h.full_current_url()) %}
             <p>{{ _('share this dataset')}}:</p>
             <div class="share-links">
-                <a href="https://www.linkedin.com/shareArticle?mini=true&url={{current_url}}" target="_blank"><img class='' src="/base/images/Icon-linkedin.png"/></a>
-                <a href="https://www.xing.com/app/user?op=share&url={{ current_url }}" target="_blank"><img class='' src="/base/images/Icon-xing.png"/></a>
-                <a href="https://www.facebook.com/sharer.php?href={{ current_url }}" target="_blank"><img class='' src="/base/images/Icon-facebook.png"/></a>
-                <a href="https://twitter.com/share?url={{ current_url }}" target="_blank"><img class='' src="/base/images/Icon-twitter.png"/></a>
-                <a href="mailto:?body={{ current_url }}" target="_blank"><img class='' src="/base/images/Icon-mail.png"/></a>
+                <a href="https://www.linkedin.com/shareArticle?mini=true&url={{current_url}}" target="_blank">
+                    <img class='' src="/base/images/Icon-linkedin.png" alt="Linked In"/>
+                </a>
+                <a href="https://www.xing.com/app/user?op=share&url={{ current_url }}" target="_blank">
+                    <img class='' src="/base/images/Icon-xing.png" alt="XING"/>
+                </a>
+                <a href="https://www.facebook.com/sharer.php?href={{ current_url }}" target="_blank">
+                    <img class='' src="/base/images/Icon-facebook.png" alt="facebook"/>
+                </a>
+                <a href="https://twitter.com/share?url={{ current_url }}" target="_blank">
+                    <img class='' src="/base/images/Icon-twitter.png" alt="twitter"/>
+                </a>
+                <a href="mailto:?body={{ current_url }}" target="_blank">
+                    <img class='' src="/base/images/Icon-mail.png" alt="{{ _('send an email') }}"/>
+                </a>
             </div>
         </div>
-        {% endblock %}
+        {% endblock social_nav %}
         {% endif %}
+
+        
 </section>
 {% endif %}
-{% endblock %}
\ No newline at end of file
+{% endblock package_info %}
diff --git a/ckanext/odsh/templates/package/snippets/package_basic_fields.html b/ckanext/odsh/templates/package/snippets/package_basic_fields.html
index 5bed804b..ada4778f 100644
--- a/ckanext/odsh/templates/package/snippets/package_basic_fields.html
+++ b/ckanext/odsh/templates/package/snippets/package_basic_fields.html
@@ -3,315 +3,320 @@
 {% resource 'odsh/bootstrap-multiselect.js' %}
 {% set dataset_is_draft = data.get('state', 'draft').startswith('draft') or data.get('state', 'none') == 'none' %}
 
-<!-- field title -->
+
+{# field title #}
 {% block package_basic_fields_title %}
 {% set error_string = _(_('Title') + ': '+errors.title[0]) if errors.title %}
-{{ form.input('title', id='field-title', label=_('Title'), value=data.title,
-error=error_string, classes=['control-full'], attrs={'data-module': 'slug-preview-target'},
-is_required=true,placeholder=_('Enter title')) }}
-{% endblock %}
+{{ 
+    form.input(
+        'title', id='field-title', 
+        label=_('Title'), 
+        value=data.title,
+        error=error_string, 
+        classes=['control-full'], 
+        attrs={'data-module': 'slug-preview-target'},
+        is_required=true,
+        placeholder=_('Enter title')
+    ) 
+}}
+{% endblock package_basic_fields_title %}
 
 
-    <!-- field notes -->
-    {% block package_basic_fields_description %}
-    {% set error_string = _(_('Description') + ': '+errors.notes[0]) if errors.notes %}
-    {{ form.markdown('notes', id='field-notes', label=_('Description'), value=data.notes,
-    error=error_string, is_required=true, placeholder=_('Enter description')) }}
-    {% endblock %}
+{# field note #}
+{% block package_basic_fields_description %}
+{% set error_string = _(_('Description') + ': '+errors.notes[0]) if errors.notes %}
+{{ 
+    form.markdown(
+        'notes', 
+        id='field-notes', 
+        label=_('Description'), 
+        value=data.notes,
+        error=error_string, 
+        is_required=false, 
+        placeholder=_('Enter description')
+    ) 
+}}
+{% endblock package_basic_fields_description %}
 
-    {% block package_basic_fields_org %}
-    {% if data.group_id %}
-    <input type="hidden" name="groups__0__id" value="{{ data.group_id }}" />
-    {% endif %}
 
-    {% set dataset_has_organization = data.owner_org or data.group_id %}
-    {% set organizations_available = h.organizations_available('create_dataset') %}
-    {% set user_is_sysadmin = h.check_access('sysadmin') %}
-    {% set show_organizations_selector = organizations_available %}
-    {% set show_visibility_selector = dataset_has_organization or (organizations_available and (user_is_sysadmin or
-    dataset_is_draft)) %}
-    {% set existing_org = data.owner_org or data.group_id %}
+{# field Organization #}
+{% block package_basic_fields_org %}
+{% if data.group_id %}
+<input type="hidden" name="groups__0__id" value="{{ data.group_id }}" />
+{% endif %}
 
-    <div class="control-group field-organization">
-        <label for="field-organizations" class="control-label">{{ _('Organization') }}
-            <span title="{{ _("This field is required") }}" class="control-required">*</span>
-        </label>
-        <div class="controls">
-            <div class="row-fluid">
-                <div class="span6">
-                    <select id="field-organizations" name="owner_org" data-module="autocomplete">
-                        {% if h.check_config_permission('create_unowned_dataset') %}
-                        <option value="" {% if not selected_org and data.id %} selected="selected" {% endif %}>{{ _('No
-                            organization') }}</option>
-                        {% endif %}
-                        {% for organization in organizations_available %}
-                        {# get out first org from users list only if there is not an existing org #}
-                        {% set selected_org = (existing_org and existing_org == organization.id) or (not existing_org and not data.id and organization.id == organizations_available[0].id) %}
-                        <option value="{{ organization.id }}" {% if selected_org %} selected="selected" {% endif %}>{{
-                            organization.display_name }}</option>
-                        {% endfor %}
-                    </select>
-                </div>
+{% set dataset_has_organization = data.owner_org or data.group_id %}
+{% set organizations_available = h.organizations_available('create_dataset') %}
+{% set user_is_sysadmin = h.check_access('sysadmin') %}
+{% set show_organizations_selector = organizations_available %}
+{% set show_visibility_selector = dataset_has_organization or (organizations_available and (user_is_sysadmin or
+dataset_is_draft)) %}
+{% set existing_org = data.owner_org or data.group_id %}
+
+<div class="control-group field-organization">
+    <label for="field-organizations" class="control-label">
+        {{ _('Organization') }}
+        <span title="{{ _("This field is required") }}" class="control-required">*</span>
+    </label>
+    <div class="controls">
+        <div class="row-fluid">
+            <div class="span6">
+                <select id="field-organizations" name="owner_org" data-module="autocomplete">
+                    {% if h.check_config_permission('create_unowned_dataset') %}
+                    <option value="" {% if not selected_org and data.id %} selected="selected" {% endif %}>{{ _('No
+                        organization') }}</option>
+                    {% endif %}
+                    {% for organization in organizations_available %}
+                    {# get out first org from users list only if there is not an existing org #}
+                    {% set selected_org = (existing_org and existing_org == organization.id) or (not existing_org and not data.id and organization.id == organizations_available[0].id) %}
+                    <option value="{{ organization.id }}" {% if selected_org %} selected="selected" {% endif %}>{{
+                        organization.display_name }}</option>
+                    {% endfor %}
+                </select>
             </div>
         </div>
     </div>
-    {% endblock %}
+</div>
+{% endblock package_basic_fields_org %}
 
 
-    <!-- field license -->
-    {% set error_missing_attr = h.odsh_extract_error('licenseAttributionByText', errors) %}
-    <label class="control-label" for="field-license">
-        {{ _("License") }}:
-        <span title="{{ _("This field is required") }}" class="control-required">*</span>
-    </label>
-    <div class='row-fluid'>
-        <div class='span3'>
-            {% block package_basic_fields_license %}
-                {% set error = errors.license_id %}
-                {% set error_license_id = _(_("License") + ': '+errors.license_id[0] ) if errors.license_id %}
-            <div class="control-group {{ " error" if error_license_id }}">
-                <div class="controls">
-                    <select id="field-license" name="license_id">
-                        {% set existing_license_id = data.get('license_id') %}
-                        {% for license_id, license_desc in h.presorted_license_options(existing_license_id) %}
-                        <option value="{{ license_id }}" {% if existing_license_id==license_id %}selected="selected" {%
-                            endif %}>{{ license_desc }}</option>
-                        {% endfor %}
-                    </select>
-                </div>
+{# field license #}
+{% block package_basic_fields_license %}
+
+{% set error_missing_attr = h.odsh_extract_error('licenseAttributionByText', errors) %}
+<label class="control-label" for="field-license">
+    {{ _("License") }}:
+    <span title="{{ _("This field is required") }}" class="control-required">*</span>
+</label>
+<div class='row-fluid'>
+    <div class='span3'>
+            {% set error = errors.license_id %}
+            {% set error_license_id = _(_("License") + ': '+errors.license_id[0] ) if errors.license_id %}
+        <div class="control-group {{ " error" if error_license_id }}">
+            <div class="controls">
+                <select id="field-license" name="license_id">
+                    {% set existing_license_id = data.get('license_id') %}
+                    {% for license_id, license_desc in h.presorted_license_options(existing_license_id) %}
+                    <option value="{{ license_id }}" {% if existing_license_id==license_id %}selected="selected" {%
+                        endif %}>{{ license_desc }}</option>
+                    {% endfor %}
+                </select>
             </div>
         </div>
-        <div class='span3'>
-            <!-- field Namensnennung -->
-            {% set field = 'licenseAttributionByText' %}
-            {% set value = h.odsh_extract_value_from_extras(data.extras,field) %}
-            <div class="control-group {{ " error" if error_missing_attr }} control-full">
-                <div class="controls">
-                            {{ form.input_extra(field, value=value, index=h.odsh_create_checksum(field), type='text', attrs={'disabled':true,
-            'data-module':"odsh_form", 'data-module-licensetoggle':'true', 'data-module-autofill':'true'}, placeholder=_('enter name')) }}
-                </div>
+    </div>
+    <div class='span3'>
+        {# field Namensnennung #}
+        {% set field = 'licenseAttributionByText' %}
+        {% set value = h.odsh_extract_value_from_extras(data.extras,field) %}
+        <div class="control-group {{ " error" if error_missing_attr }} control-full">
+            <div class="controls">
+                        {{ form.input_extra(field, value=value, index=h.odsh_create_checksum(field), type='text', attrs={'disabled':true,
+        'data-module':"odsh_form", 'data-module-licensetoggle':'true', 'data-module-autofill':'true'}, placeholder=_('enter name')) }}
             </div>
         </div>
-        {% if error_license_id %} 
-            <div class="span6 inline-error">
-                {{_(error_license_id)}}
-            </div>
-        {% endif %}
-        {% if error_missing_attr%} 
-            <div class="span6 inline-error">
-                {{_(error_missing_attr)}}
-            </div>
-        {% endif %}
     </div>
+    {% if error_license_id %} 
+        <div class="span6 inline-error">
+            {{_(error_license_id)}}
+        </div>
+    {% endif %}
+    {% if error_missing_attr%} 
+        <div class="span6 inline-error">
+            {{_(error_missing_attr)}}
+        </div>
+    {% endif %}
+</div>
 
-    {% endblock %}
+{% endblock package_basic_fields_license%}
 
-    <!-- timerange -->
-    {% set error_start = h.odsh_extract_error_new('temporal_start', errors) %}
-    {% set error_end = h.odsh_extract_error_new('temporal_end', errors) %}
-    {% set error_string = 'odsh_temporal_error_label' if error_start and error_end else (error_start if error_start else (error_end if error_end))%}
-    <label for="start-end" class="control-label">{{ _('timerange') }}:
-        <span title="{{ _("This field is required") }}" class="control-required">*</span>
-    </label>
-    <div class='row-fluid'>
-          {% resource 'odsh/moment.js' %}
-          {% resource 'odsh/datepicker.css' %}
-          {% resource 'odsh/bootstrap-datepicker.js' %}
-          {% resource 'odsh/odsh_datepicker.js' %}
-        <div id='start-end' class='span3'>
-            <!-- field temporal_start -->
-            {% set field = 'temporal_start' %}
-            {% set data_temporal_start = h.odsh_extract_value_from_extras(data.extras,field) %}
-            {% set value = data_temporal_start.split('T')[0] if data_temporal_start else None %}
-            {% set index = h.odsh_create_checksum(field) %}
-            <div class="control-group {{ " error" if error_start }} control-full">
-                <div class="controls">
-                            {{ form.input_extra(field, value=value, index=index, type='hidden') }}
-                            <input pattern="\d{2}\.\d{2}\.\d{4}" autocomplete="off" id="datepicker_start" type="text" 
-                                value="{{h.odsh_render_datetime(value, False)}}" placeholder="{{ _('from') }}"
-                                data-module="odsh_datepicker" data-module-target='field-temporal_start-value'/>
-                </div>
+
+{# timerange #}
+{% set error_start = h.odsh_extract_error_new('temporal_start', errors) %}
+{% set error_end = h.odsh_extract_error_new('temporal_end', errors) %}
+{% set error_string = 'odsh_temporal_error_label' if error_start and error_end else (error_start if error_start else (error_end if error_end))%}
+<label for="start-end" class="control-label">{{ _('timerange') }}:
+    {# <span title="{{ _("This field is required") }}" class="control-required">*</span> #}
+</label>
+<div class='row-fluid'>
+        {% resource 'odsh/moment.js' %}
+        {% resource 'odsh/datepicker.css' %}
+        {% resource 'odsh/bootstrap-datepicker.js' %}
+        {% resource 'odsh/odsh_datepicker.js' %}
+    <div id='start-end' class='span3'>
+        {# field temporal_start #}
+        {% set field = 'temporal_start' %}
+        {% set data_temporal_start = h.odsh_extract_value_from_extras(data.extras,field) %}
+        {% set value = data_temporal_start.split('T')[0] if data_temporal_start else None %}
+        {% set index = h.odsh_create_checksum(field) %}
+        <div class="control-group {{ " error" if error_start }} control-full">
+            <div class="controls">
+                        {{ form.input_extra(field, value=value, index=index, type='hidden') }}
+                        <input pattern="\d{2}\.\d{2}\.\d{4}" autocomplete="off" id="datepicker_start" type="text" 
+                            value="{{h.odsh_render_datetime(value, False)}}" placeholder="{{ _('from') }}"
+                            data-module="odsh_datepicker" data-module-target='field-temporal_start-value'/>
             </div>
         </div>
-        <div class='span3'>
-            <!-- field temporal_end -->
-            {% set field = 'temporal_end' %}
-            {% set data_temporal_end = h.odsh_extract_value_from_extras(data.extras,field) %}
-            {% set value = data_temporal_end.split('T')[0] if data_temporal_end else None %}
-            <div class="control-group {{ " error" if error_end }} control-full">
-                <div class="controls">
-                            {{ form.input_extra(field, value=value, index=h.odsh_create_checksum(field), type='hidden') }}
-                            <input pattern="\d{2}\.\d{2}\.\d{4}"  autocomplete="off" id="datepicker_end" type="text" 
-                                value="{{h.odsh_render_datetime(value, False)}}" placeholder="{{ _('to') }}"
-                                data-module="odsh_datepicker" data-module-target='field-temporal_end-value'/>
-                </div>
+    </div>
+    <div class='span3'>
+        {# field temporal_end #}
+        {% set field = 'temporal_end' %}
+        {% set data_temporal_end = h.odsh_extract_value_from_extras(data.extras,field) %}
+        {% set value = data_temporal_end.split('T')[0] if data_temporal_end else None %}
+        <div class="control-group {{ " error" if error_end }} control-full">
+            <div class="controls">
+                        {{ form.input_extra(field, value=value, index=h.odsh_create_checksum(field), type='hidden') }}
+                        <input pattern="\d{2}\.\d{2}\.\d{4}"  autocomplete="off" id="datepicker_end" type="text" 
+                            value="{{h.odsh_render_datetime(value, False)}}" placeholder="{{ _('to') }}"
+                            data-module="odsh_datepicker" data-module-target='field-temporal_end-value'/>
             </div>
         </div>
-        {% if error_string %} 
-            <div class="span6 inline-error">
-                {{_(error_string)}}
-            </div>
-        {% endif %}
     </div>
+    {% if error_string %} 
+        <div class="span6 inline-error">
+            {{_(error_string)}}
+        </div>
+    {% endif %}
+</div>
 
-    <!-- field issued -->
 
-    {% set field = 'issued' %}
-    {% set data_issued = h.odsh_extract_value_from_extras(data.extras,field) %}
-    {% set error = h.odsh_extract_error_new(field, errors) %}
-    {% set value = data_issued.split('T')[0] if data_issued else (h.odsh_now() if not error else '')%}
-    <div class="control-group {{ " error" if error }} control-full">
-        <label class="control-label" for="field-{{field}}">Veröffentlichungsdatum: <span title="Dieses Feld ist erforderlich" class="control-required">*</span> </label>
-        <div class="controls">
-            <div class="row-fluid">
-                <div class="span6">
-                    {{ form.input_extra(field, value=value , index=h.odsh_create_checksum(field), type='hidden') }}
-                    <input  pattern="\d{2}\.\d{2}\.\d{4}" autocomplete="off" type="text" 
-                        value="{{h.odsh_render_datetime(value, False)}}" 
-                        data-module="odsh_datepicker" data-module-target='field-issued-value'/>
-                </div>
-                <div class="span6 inline-error">
-                    {% if error %} 
-                    {{_(error)}}
-                    {% endif %}
-                </div>
+{# field issued #}
+{% set field = 'issued' %}
+{% set data_issued = h.odsh_extract_value_from_extras(data.extras,field) %}
+{% set error = h.odsh_extract_error_new(field, errors) %}
+{% set value = data_issued.split('T')[0] if data_issued else (h.odsh_now() if not error else '')%}
+<div class="control-group {{ " error" if error }} control-full">
+    <label class="control-label" for="field-{{field}}">Veröffentlichungsdatum: <span title="Dieses Feld ist erforderlich" class="control-required">*</span> </label>
+    <div class="controls">
+        <div class="row-fluid">
+            <div class="span6">
+                {{ form.input_extra(field, value=value , index=h.odsh_create_checksum(field), type='hidden') }}
+                <input  pattern="\d{2}\.\d{2}\.\d{4}" autocomplete="off" type="text" 
+                    value="{{h.odsh_render_datetime(value, False)}}" 
+                    data-module="odsh_datepicker" data-module-target='field-issued-value'/>
+            </div>
+            <div class="span6 inline-error">
+                {% if error %} 
+                {{_(error)}}
+                {% endif %}
             </div>
         </div>
     </div>
+</div>
 
 
-    <!-- field tags -->
-    {% block package_basic_fields_tags %}
-    {% set tag_attrs = {'data-module': 'autocomplete', 'data-module-tags': '', 'data-module-source':
-    '/api/2/util/tag/autocomplete?incomplete=?'} %}
-    {{ form.input('tag_string', id='field-tags', label=_('Tags'), value=data.tag_string, error=errors.tag_string,
-    classes=['control-full'], attrs=tag_attrs,
-    is_required=false, placeholder=_('odsh tags placeholder')) }}
-    {% endblock %}
+{# field tags #}
+{% block package_basic_fields_tags %}
+{% set tag_attrs = {
+    'data-module': 'autocomplete', 
+    'data-module-tags': '', 
+    'data-module-source': '/api/2/util/tag/autocomplete?incomplete=?'
+} %}
+{{ 
+    form.input(
+        'tag_string', 
+        id='field-tags', 
+        label=_('Tags'), 
+        value=data.tag_string, 
+        error=errors.tag_string,
+        classes=['control-full'], 
+        attrs=tag_attrs,
+        is_required=false, 
+        placeholder=_('odsh tags placeholder')
+    ) 
+}}
+{% endblock %}
 
 
-    <!-- field spatial_uri -->
-    {% set field = 'spatial_uri' %}
-    {% set value = h.odsh_extract_value_from_extras(data.extras,field) %}
-    {% set error = h.odsh_extract_error(field, errors) %}
-    <div class="control-group {{ " error" if error }} control-full">
-        <label class="control-label" for="field-{{field}}">{{_('Spatial uri')}}: <span title="Dieses Feld ist erforderlich" class="control-required">*</span> </label>
-        <div class="controls">
-            <div class="row-fluid">
-            {% if not value and not error and data.state == 'active'%}
-                <div class="span6">
-                    <input  type='text' value="{{h.truncate(h.odsh_extract_value_from_extras(data.extras,'spatial'),20)}}" readonly  />
-                </div>
-            {% else %}
-                <div class="span6">
-                    {{ form.input_extra(field, value=value, index=h.odsh_create_checksum(field), type='text', placeholder=_('Enter spatial uri')) }}
-                </div>
-                <div class="span6 inline-error">
-                    {% if error %} 
-                    {{_(error)}}
-                    {% endif %}
-                </div>
-                {% endif %}
-            </div>
-        </div>
-    </div>
+{# field language #}
+{% set before_selected = data.get('language') or h.odsh_extract_value_from_extras(data.extras, 'language') or 'http://publications.europa.eu/resource/authority/language/DEU' %}
+{{ form.tpsh_select('language', label=_('language'), options=h.get_language_for_selection(), selected=before_selected , error=errors.language, is_required=False, classes=['control-full']) }}
 
-    {#
-    {% set spatial_extends_available = h.odsh_spatial_extends_available() %}
-    <div class="control-group">
-        <label class="control-label" for="field-{{field}}">{{_('Spatial uri')}}: <span title="Dieses Feld ist erforderlich" class="control-required">*</span> </label>
-        <div class="controls">
-            <div class="row-fluid">
-                <div class="span6">
-                    <select id="field-{{field}}" data-module="autocomplete" data-module-items="10">
-                        {% for extend in spatial_extends_available%}
-                        <option value="{{ extend }}" {% if selected_extend %} selected="selected" {% endif %}>{{extend}}</option> 
-                        {% endfor %}
-                    </select>
-                </div>
-            </div>
-        </div>
-    </div>
-    #}
 
-    <!-- field private -->
-    <div class="control-group">
-        <label for="field-private" class="control-label">{{ _('Visibility') }}:
-            <span title="{{ _("This field is required") }}" class="control-required">*</span>
-        </label>
-        <div class="controls">
-            <div class="row-fluid">
-                <div class="span6">
-                    <select id="field-private" name="private">
-                        {% for option in [('True', _('Private')), ('False', _('Public'))] %}
-                        <option value="{{ option[0] }}" {% if option[0]==data.private|trim %}selected="selected" {%
-                            endif %}>{{
-                            option[1] }}</option>
-                        {% endfor %}
-                    </select>
-                </div>
+{# field spatial_uri #}
+{% set spatial_uri_from_extras =  h.odsh_extract_value_from_extras(data.extras, 'spatial_uri') %}
+{% set spatial_uri = data.spatial_uri_temp or spatial_uri_from_extras or '' %}
+{{ form.select_autocomplete('spatial_uri_temp', label=_('Spatial uri'), selected=spatial_uri, options=h.get_spatial_for_selection(), is_required=False, classes=['control-full', 'field-spatial_uri'])}}
+
+
+{# field private #}
+<div class="control-group">
+    <label for="field-private" class="control-label">{{ _('Visibility') }}:
+        <span title="{{ _("This field is required") }}" class="control-required">*</span>
+    </label>
+    <div class="controls">
+        <div class="row-fluid">
+            <div class="span6">
+                <select id="field-private" name="private">
+                    {% for option in [('True', _('Private')), ('False', _('Public'))] %}
+                    <option value="{{ option[0] }}" {% if option[0]==data.private|trim %}selected="selected" {%
+                        endif %}>{{
+                        option[1] }}</option>
+                    {% endfor %}
+                </select>
             </div>
         </div>
     </div>
+</div>
 
 
-    {% if data.id and h.check_access('package_delete', {'id': data.id}) and data.state != 'active' %}
-    <div class="control-group">
-        <label for="field-state" class="control-label">{{ _('State') }}</label>
-        <div class="controls">
-            <div class="row-fluid">
-                <div class="span6">
-                    <select id="field-state" name="state">
-                        <option value="active" {% if data.get('state', 'none' )=='active' %} selected="selected" {%
-                            endif %}>{{
-                            _('Active') }}</option>
-                        <option value="deleted" {% if data.get('state', 'none' )=='deleted' %} selected="selected" {%
-                            endif %}>{{
-                            _('Deleted') }}</option>
-                    </select>
-                </div>
+{% if data.id and h.check_access('package_delete', {'id': data.id}) and data.state != 'active' %}
+<div class="control-group">
+    <label for="field-state" class="control-label">{{ _('State') }}</label>
+    <div class="controls">
+        <div class="row-fluid">
+            <div class="span6">
+                <select id="field-state" name="state">
+                    <option value="active" {% if data.get('state', 'none' )=='active' %} selected="selected" {%
+                        endif %}>{{
+                        _('Active') }}</option>
+                    <option value="deleted" {% if data.get('state', 'none' )=='deleted' %} selected="selected" {%
+                        endif %}>{{
+                        _('Deleted') }}</option>
+                </select>
             </div>
         </div>
     </div>
-    {% endif %}
+</div>
+{% endif %}
 
-    <!-- field groups -->
-    {% set error_groups = h.odsh_extract_error_new('groups', errors) %}
-    <div class="control-group {{ " error" if error_groups }}">
-        {% set groups_label='Kategorien'%}
-        {% set multiselect_nonSelectedText='keine' %}
-        {% set multiselect_allSelectedText='alle' %}
-        {% set multiselect_nSelectedText='gewählt' %}
-        <label for="field-groups" class="control-label">{{ groups_label }}
-            <span title="{{ _("This field is required") }}" class="control-required">*</span>
-        </label>
-        <div class="controls">
-            <div class="row-fluid">
-                <div class="span6">
-                    {% set existing_groups = data.get('groups') %}
-                    {% if existing_groups %}
-                    {% set existing_groups_string = existing_groups|map(attribute='id')|join(',') %}
-                    {% else %}
-                    {% set existing_groups_string = h.odsh_extract_value_from_extras(data.extras,'groups') %}
-                    {% endif %}
-                    <select id='field-groups' multiple="multiple" data-module="odsh_form" data-module-multiselect='true'
-                        data-module-nonSelectedText="{{multiselect_nonSelectedText}}" data-module-allSelectedText="{{multiselect_allSelectedText}}"
-                        data-module-nSelectedText="{{multiselect_nSelectedText}}" data-module-update='{{data.id != None}}'>
-                        {% for option in h.groups_available()%}
-                        <option value={{option.id}} {% if existing_groups_string!=None and option['id'] in existing_groups_string %}selected="selected"
-                            {% endif %}>
-                            {{ option['display_name'] }}</option>
-                        {% endfor %}
-                    </select>
-                    <div id='selected-groups'>
-                        {{ form.input_extra('groups', value=existing_groups_string, index=h.odsh_create_checksum('groups'), type='hidden')}}
-                    </div>
-                </div>
-                <div class="span6 inline-error">
-                    {% if error_groups %} 
-                    {{_(error_groups)}}
-                    {% endif %}
+
+{# field groups #}
+{% set error_groups = h.odsh_extract_error_new('groups', errors) %}
+<div class="control-group {{ " error" if error_groups }}">
+    {% set groups_label='Kategorien'%}
+    {% set multiselect_nonSelectedText='keine' %}
+    {% set multiselect_allSelectedText='alle' %}
+    {% set multiselect_nSelectedText='gewählt' %}
+    <label for="field-groups" class="control-label">
+        {{ groups_label }}
+    </label>
+    <div class="controls">
+        <div class="row-fluid">
+            <div class="span6">
+                {% set existing_groups = data.get('groups') %}
+                {% if existing_groups %}
+                {% set existing_groups_string = existing_groups|map(attribute='id')|join(',') %}
+                {% else %}
+                {% set existing_groups_string = h.odsh_extract_value_from_extras(data.extras,'groups') %}
+                {% endif %}
+                <select id='field-groups' multiple="multiple" data-module="odsh_form" data-module-multiselect='true'
+                    data-module-nonSelectedText="{{multiselect_nonSelectedText}}" data-module-allSelectedText="{{multiselect_allSelectedText}}"
+                    data-module-nSelectedText="{{multiselect_nSelectedText}}" data-module-update='{{data.id != None}}'>
+                    {% for option in h.groups_available()%}
+                    <option value={{option.id}} {% if existing_groups_string!=None and option['id'] in existing_groups_string %}selected="selected"
+                        {% endif %}>
+                        {{ option['display_name'] }}</option>
+                    {% endfor %}
+                </select>
+                <div id='selected-groups'>
+                    {{ form.input_extra('groups', value=existing_groups_string, index=h.odsh_create_checksum('groups'), type='hidden')}}
                 </div>
             </div>
+            <div class="span6 inline-error">
+                {% if error_groups %} 
+                {{_(error_groups)}}
+                {% endif %}
+            </div>
         </div>
-    </div>
\ No newline at end of file
+    </div>
+</div>
diff --git a/ckanext/odsh/templates/package/snippets/resource_item.html b/ckanext/odsh/templates/package/snippets/resource_item.html
index cf63b5a7..457eb4d8 100644
--- a/ckanext/odsh/templates/package/snippets/resource_item.html
+++ b/ckanext/odsh/templates/package/snippets/resource_item.html
@@ -2,44 +2,66 @@
 {% set url = h.url_for(controller='package', action=url_action, id=pkg.name, resource_id=res.id) %}
 
 {# hack for correcting slave url if resource was uploaded #}
-{% set download = h.odsh_public_resource_url(res) or ulr%}
+{% set download = h.odsh_public_resource_url(res) or url %}
 
-<li class="resource-item" data-id="{{ res.id }}">
+{% set rtitle=h.resource_display_name(res) if res.name else ' '%}
+{% set resource_size = h.tpsh_get_resource_size(res) %}
 
-  <div class="container-fluid">
-    <div class="row">
-      <div class="span8 resource-details-left">
-        <div class="row resource-title-container">
-        {% set rtitle=h.resource_display_name(res) if res.name else ' '%}
-          <div class="resource-title" title="{{ rtitle }}">
-        {% if res.name %}
-        <a href="{{ download }}">
-            {{ h.resource_display_name(res) }}
-        </a>
-        {% endif %}
-          </div>
+<li class="resource-item" data-id="{{ res.id }}">
+    <div class="resource-title-container">
+        <div class="resource-title" title="{{ rtitle }}">
+            {% if res.name %}
+            <a href="{{ download }}">
+                {{ h.resource_display_name(res) }}
+            </a>
+            {% endif %}
+            {% if resource_size %}
+            <p>Dateigröße: {{ resource_size }}</p>  
+            {% endif %}
+            {% set number_of_pages = res.get('number_of_pages') %}
+            {% if number_of_pages%}
+            <p>Seitenanzahl: {{ number_of_pages }}</p>   
+            {% endif %}
         </div>
+        <div class="resource-icons">
+            {% block resource_item_explore_links %}
+            <a href="{{ download }}" aria-label="{{ _('download file') }}">
+                <div aria-hidden="true" class="icon icon-download"></div>
+            </a>
+            {% if can_edit %}
+            <a href="{{ h.url_for(controller='package', action='resource_edit', id=pkg.name, resource_id=res.id) }}">
+                <div class="icon icon-edit"></div>
+            </a>
+            {% endif %}
+            {% endblock %}
+        </div>
+            {% if res.format %}
+            <a href="{{ download }}" >
+               <div class="dataformat-label resource-dataformat-label label" style='font-size:{{150/(res.format|length)}}px'>{{res.format}}</div>
+            </a>
+            {% endif %}
+    </div>
+</li>
+    
+        <!-- </div>
         <div class="row resource-description-container">
         </div>
       <div class="resource-icons">
-        {% block resource_item_explore_links %}
-        <a href="{{ download }}">
-          <div class="icon icon-download"></div>
+        <a href="{{ download }}" aria-label="{{ _('download file') }}">
+          <div aria-hidden="true" class="icon icon-download"></div>
         </a>
         {% if can_edit %}
         <a href="{{ h.url_for(controller='package', action='resource_edit', id=pkg.name, resource_id=res.id) }}">
           <div class="icon icon-edit"></div>
         </a>
         {% endif %}
-        {% endblock %}
+      </div>
+      <div>
+        
+        
       </div>
       </div>
-      {% if(res.format) %}
-        <a href="{{ download }}">
-          <div class="dataformat-label resource-dataformat-label label" style='font-size:{{150/(res.format|length)}}px'>{{res.format}}</div>
-        </a>
-      {% endif %}
     </div>
   </div>
 
-</li>
\ No newline at end of file
+</li> -->
diff --git a/ckanext/odsh/templates/page.html b/ckanext/odsh/templates/page.html
index 3cd01dec..134079dd 100644
--- a/ckanext/odsh/templates/page.html
+++ b/ckanext/odsh/templates/page.html
@@ -1,11 +1,21 @@
 {% ckan_extends %}
 
+{% block skip %}
+    <a class="skip-link" href="#content">
+        Zum Inhalt springen.
+    </a>
+{% endblock skip %}
 
 {%- block content %}
+<div class="blur-layer"></div>
 {% block maintag %}<div role="main">{% endblock %}
+
+{% if h.odsh_use_matomo() %}
 {% set matomo_url = h.odsh_tracking_url()%}
 {% set matomo_id = h.odsh_tracking_id()%}
 <noscript><p><img src="{{matomo_url}}?idsite={{matomo_id}}&rec=1" style="border:0;" alt="" /></p></noscript>
+{% endif %}
+
   <div id="content" class="container">
   {% if h.odsh_show_testbanner() %}
 <div id="testsystem">
diff --git a/ckanext/odsh/templates/snippets/datepicker.html b/ckanext/odsh/templates/snippets/datepicker.html
index 18ff3039..1119e4e4 100644
--- a/ckanext/odsh/templates/snippets/datepicker.html
+++ b/ckanext/odsh/templates/snippets/datepicker.html
@@ -1,6 +1,17 @@
 
 {% set class = class or '' %}
 {% set placeholder = placeholder or '' %}
+{% set aria_label = aria_label or '' %}
 <input id="{{id}}" name="{{id}}" type="hidden" value="{{value}}" />
-<input pattern="\d{2}\.\d{2}\.\d{4}" autocomplete="off" id="datepicker_{{id}}" type="text" value="{{h.odsh_render_datetime(value, False)}}" placeholder="{{ placeholder }}"
-    class='{{class}}' data-module="odsh_datepicker" data-module-target='{{id}}'/>
\ No newline at end of file
+<input
+    aria-label="{{ aria_label }}" 
+    pattern="\d{2}\.\d{2}\.\d{4}" 
+    autocomplete="off" 
+    id="datepicker_{{ id }}" 
+    type="text" 
+    value="{{h.odsh_render_datetime(value, False)}}" 
+    placeholder="{{ placeholder }}"
+    class='{{ class }}' 
+    data-module="odsh_datepicker" 
+    data-module-target='{{ id }}'
+/>
\ No newline at end of file
diff --git a/ckanext/odsh/templates/snippets/facet_list.html b/ckanext/odsh/templates/snippets/facet_list.html
index 9741ee16..17531a48 100644
--- a/ckanext/odsh/templates/snippets/facet_list.html
+++ b/ckanext/odsh/templates/snippets/facet_list.html
@@ -12,44 +12,66 @@
 <nav>
   {% set title = title or h.get_facet_title(name) %}
   <div class="nav-title">{{ title }}</div>
-    <ul class="{{ nav_class or 'unstyled nav nav-simple nav-facet' }}">
-        {% for item in items %}
-        {% set href = h.remove_url_param(name, item.name, extras=extras, alternative_url=alternative_url) if
-        item.active else h.add_url_param(new_params={name: item.name}, extras=extras, alternative_url=alternative_url)
-        %}
-        {% set label = label_function(item) if label_function else item.display_name %}
-        {% if title=='Open-Data-Eigenschaften'%}
-        {% set label = _(label)%}
-        {% endif%}
-        {% set count = count_label(item['count']) if count_label else ('%d' % item['count']) %}
-        {% set label_truncated = h.truncate(label, 25) if not label_function else label %}
-        <li class="{{ nav_item_class or 'nav-item' }}">
-	  <div class="facet_label">
-	    {# TODO: checkbox-id vereinheitlichen (code-duplikation) und sicher gegen Titel mit Leerzeichen machen! #}
-	    <input type="checkbox" alt="Checkbox" {% if item.active %} checked {% endif %} class="filter-checkbox" id="check-{{ title.lower() }}-{{ loop.index }}"/>
-	    <label class="mylabel" for="check-{{ title.lower() }}-{{ loop.index }}"></label>
-	    <a href="{{ href }}" title="{{ label if label != label_truncated else '' }}">
-                <span>{{ label}}</span>
+  <ul class="{{ nav_class or 'unstyled nav nav-simple nav-facet' }}">
+    {% for item in items %}
+      {% set href = h.remove_url_param(name, item.name, extras=extras, alternative_url=alternative_url) if
+          item.active else h.add_url_param(new_params={name: item.name}, extras=extras, alternative_url=alternative_url)
+      %}
+      {% set label = label_function(item) if label_function else item.display_name %}
+      {% if title=='Open-Data-Eigenschaften'%}
+      {% set label = _(label)%}
+      {% endif%}
+      {% set count = count_label(item['count']) if count_label else ('%d' % item['count']) %}
+      {% set label_truncated = h.truncate(label, 25) if not label_function else label %}
+      <li class="{{ nav_item_class or 'nav-item' }}">
+        <div class="facet_label">
+          {# TODO: checkbox-id vereinheitlichen (code-duplikation) und sicher gegen Titel mit Leerzeichen machen! #}
+          <input type="checkbox" 
+            {% if item.active %} checked {% endif %} 
+            class="filter-checkbox"
+            id="check-{{ title.lower() }}-{{ loop.index }}"
+            aria-hidden="true"
+          />
+          <span 
+            role="checkbox"
+            class="mylabel" 
+            for="check-{{ title.lower() }}-{{ loop.index }}" 
+            aria-labelledby="description-{{ title.lower() }}-{{ loop.index }}"
+            aria-checked={% if item.active %}"true"{% else %}"false"{% endif %}
+          >
+          </span>
+          {% if name=='groups' %}
+          <span class="group-icon-container" aria-hidden="true">
+            <img src="/base/images/icon_kat_{{item.name}}.svg" alt=""/>
+          </span>
+          {% endif %}
+          
+          <label class="odsh-visible-label" for="check-{{ title.lower() }}-{{ loop.index }}">
+            <a href="{{ href }}" title="{{ label if label != label_truncated else '' }}">
+              <span id="description-{{ title.lower() }}-{{ loop.index }}">{{ label }}</span>
             </a>
-	  </div>
-	  <div class="facet_count">
-            <span class="facet_count">{{ count }}</span>
-	  </div>
-        </li>
-        {% endfor %}
-    </ul>
+          </label>
+        </div>
+        <div class="facet_count">
+          <span class="facet_count">{{ count }}</span>
+        </div>
+      </li>
+    {% endfor %}
+  </ul>
 </nav>
 
 <div class="module-footer">
+    {% if not name=='groups' %}
     {% if h.get_param_int('_%s_limit' % name) %}
     {% if h.odsh_has_more_facets(name) %}
     <a href="{{ h.remove_url_param('_%s_limit' % name, replace=0, extras=extras, alternative_url=alternative_url) }}"
-        class="read-more">> {{ _('Show More') }}</a>
+    class="read-more">> {{ _('Show More') }}</a>
     {% endif %}
     {% else %}
     <a href="{{ h.remove_url_param('_%s_limit' % name, extras=extras, alternative_url=alternative_url) }}" class="read-more">> {{
         _('Show Less')}}</a>
     {% endif %}
+    {% endif %}
 </div>
 
 {% else %}
diff --git a/ckanext/odsh/templates/snippets/home_breadcrumb_item.html b/ckanext/odsh/templates/snippets/home_breadcrumb_item.html
index a14dcb74..7631991a 100644
--- a/ckanext/odsh/templates/snippets/home_breadcrumb_item.html
+++ b/ckanext/odsh/templates/snippets/home_breadcrumb_item.html
@@ -1,9 +1,7 @@
 {# Used to insert the home icon into a breadcrumb #}
 <li class="home">
     <a href="{{ h.url_for('home') }}">
-        <img class='icon-home' src='/base/images/Icon-Home.png' alt='Ikon Home' />
-        <span> 
-            {{_('Home') }}
-        </span>
+        <img class='icon-home' src='/base/images/Icon-Home.png' alt='home icon' />
+        <span> {{_('Home') }}</span>
     </a>
 </li>
\ No newline at end of file
diff --git a/ckanext/odsh/templates/snippets/organization.html b/ckanext/odsh/templates/snippets/organization.html
index bbd506d3..df7bda00 100644
--- a/ckanext/odsh/templates/snippets/organization.html
+++ b/ckanext/odsh/templates/snippets/organization.html
@@ -15,7 +15,6 @@ Example:
 #}
 
 {% set truncate = truncate or 0 %}
-{% set url = h.url_for(controller='organization', action='read', id=organization.name) %}
 
 {% block info %}
 <div class="module module-narrow module-shallow context-info">
@@ -25,17 +24,61 @@ Example:
         [{{ _('Deleted') }}]
         {% endif %}
     </h1>
-    {% endblock %}
-    <section class="module-content">
+    {% endblock heading%}
+    <section id="section-org" class="module-content">
         {% block inner %}
         {% block image %}
         <div class="image">
-            <a href="{{ url }}">
-                <img src="{{ organization.image_display_url or h.url_for_static('/base/images/placeholder-organization.png') }}"
-                    width="200" alt="{{ organization.name }}" />
-            </a>
+            <img src="{{ organization.image_display_url or h.url_for_static('/base/images/placeholder-organization.png') }}"
+                width="200" alt="{{ organization.name }}" />
         </div>
-        {% endblock %}
+        
+        <div class="information-organisation">
+            {% set address = h.tpsh_get_address_org(organization) %}
+            {% set street = address.get('street') %}
+            {% set location = address.get('location') %}
+            {% set mail = address.get('mail') %}
+            {% set telephone = address.get('telephone') %}
+            {% set web = address.get('web') %}
+            
+            {% if person %}
+            <p>   
+                {{ person }}  
+            </p>
+            {% endif %} {# person #}
+
+            {% if street and location %}
+            <p>{{ street }}</p>
+            <p>{{ location }}</p>
+            {% endif %} {# street and location #}
+                
+            {% if mail %}
+            {% if package %}
+            {% set package_name = package.get('name') %}
+            {% set betreff = "Transparenzportal Dokument: "+ package_name%}
+            {% set body_mail = h.tpsh_get_body_mail(organization, package)   %}
+            {% else %}
+            {% set betreff = "Transparenzportal" %}
+            {% endif %} {# package #}
+            <p>
+                <a href="mailto:{{ mail }}?subject={{betreff}}&body={{body_mail}}Viele Grüße">{{ mail }}</a>
+            </p>
+            {% endif %} {# mail #}
+
+            {% if telephone %}
+            <p class="phone">
+                {{ telephone }}
+            </p>
+            {% endif %} {# telephone #}
+            
+            {% if web %}
+            <p>
+                <a href="{{address.web}}">{{ address.web }}</a>
+            </p>
+            {% endif %} {# web #}
+        </div>
+        {% endblock image%}
+
         {% if not hide_description %}
         {% block description %}
         {% if organization.description %}
@@ -46,7 +89,7 @@ Example:
         {% else %}
         <p class="empty">{{ _('There is no description for this organization') }}</p>
         {% endif %}
-        {% endblock %}
+        {% endblock description %}
         {% endif %}
         {% if show_nums %}
         {% block nums %}
@@ -56,18 +99,18 @@ Example:
                 <dd>{{ h.SI_number_span(organization.num_followers) }}</dd>
             </dl>
             <dl>
-                <dt>{{ _('Datasets') }}</dt>
+                <dt>{{ _('Documents') }}</dt>
                 <dd>{{ h.SI_number_span(organization.package_count) }}</dd>
             </dl>
         </div>
-        {% endblock %}
+        {% endblock nums%}
         {% block follow %}
         <div class="follow_button">
             {{ h.follow_button('group', organization.id) }}
         </div>
-        {% endblock %}
+        {% endblock follow %}
         {% endif %}
-        {% endblock %}
+        {% endblock inner %}
     </section>
 </div>
 {% endblock %}
\ No newline at end of file
diff --git a/ckanext/odsh/templates/snippets/package_item.html b/ckanext/odsh/templates/snippets/package_item.html
index d1a84c3e..b0918d3e 100644
--- a/ckanext/odsh/templates/snippets/package_item.html
+++ b/ckanext/odsh/templates/snippets/package_item.html
@@ -14,82 +14,104 @@ Example:
 
 #}
 {% set truncate = truncate or 180 %}
-{% set truncate_title = truncate_title or 80 %}
+{% set truncate_title = truncate_title or 180 %}
 {% set title = package.title or package.name %}
 {% set notes = h.markdown_extract(package.notes, extract_length=truncate) %}
 {% set license_title =package.license_title if package.license_title else '-'%}
 {% set licenseAttributionByText = h.odsh_extract_value_from_extras(package.extras,'licenseAttributionByText')%}
 {% set license_name=' ('+licenseAttributionByText +')' if licenseAttributionByText else ''%}
 {% set license = license_title + license_name %}
-{% set temporal_start = h.odsh_extract_value_from_extras(package.extras,'temporal_start') %}
-{% set start=h.odsh_render_datetime(temporal_start) if temporal_start else ''%}
-{% set temporal_end = h.odsh_extract_value_from_extras(package.extras,'temporal_end') %}
-{% set end=h.odsh_render_datetime(temporal_end) if temporal_end else ''%}
-{% set timerange = start + '-' + end%}
 {% set org = package.organization.title or package.organization.name or '-' %}
 {% set stars = h.odsh_openness_score_dataset_html(package) %}
 {% set access_count=(package.tracking_summary.total if package.tracking_summary) or '-' %}
-{% set timerange_label ='Zeitraum' %}
-{% set access_count_label ='Aufrufe' %}
 {% set issued_extra = h.odsh_extract_value_from_extras(package.extras,'issued') %}
-{% set issued = h.odsh_render_datetime(issued_extra) if issued_extra else h.odsh_render_datetime(package.metadata_created)%} 
-{% set categories = package.groups|map(attribute='display_name')|join(', ') if package.groups else '-' %}
+{% set issued = h.odsh_render_datetime(issued_extra) if issued_extra else h.odsh_render_datetime(package.metadata_created)%}
+{% set daterange = h.tpsh_get_daterange_prettified(package) %}
+{% set language_of_package = h.tpsh_get_language_of_package(package) %}
+{% set language_icon = h.get_language_icon(package) %}
+{% set thumbnail = package.get('thumbnail') %}
 
 {% block package_item %}
-<div class="container-fluid odsh-dataset-item">
-  {% block content %}
-  <div class="dataset-content">
-    {% block heading %}
-    <p>{{org}}</p>
-    <h3 class="dataset-heading">
-      {% block heading_private %}
-      {% if package.is_new %}
-        <span class='label new-dataset-label'>{{ _('NEW') }}</span>
-      {% endif %}
-      {% if package.private %}
-      <span class="dataset-private label label-inverse">
-        <i class="fa fa-lock"></i>
-        {{ _('Private') }}
-      </span>
-      {% endif %}
-      {% endblock %}
-      {% block heading_title %}
-      {{ h.link_to(h.truncate(title, truncate_title), h.url_for(controller='package', action='read', id=package.name),title=_('View {organization_name}').format(organization_name=title))
-      }}
-      {% endblock %}
-      {% block heading_meta %}
-      {% if package.get('state', '').startswith('draft') %}
-      <span class="label label-info">{{ _('Draft') }}</span>
-      {% elif package.get('state', '').startswith('deleted') %}
-      <span class="label label-important">{{ _('Deleted') }}</span>
-      {% endif %}
-      {{ h.popular('recent views', package.tracking_summary.recent, min=10) if package.tracking_summary }}
-      </span>
-      {% endblock %}
-    </h3>
-    {% endblock %}
-    {% block banner %}
-    {% if banner %}
-    <span class="banner">{{ _('Popular') }}</span>
-    {% endif %}
-    {% endblock %}
-    {% block notes %}
+<div class="odsh-dataset-item">
+    {% block content %}
+    <div class="dataset-content">
+        {% block heading %}
+        {%if daterange %}
+        <div class='package-info-pill'>
+            {{ daterange }}
+        </div>
+        {% endif %}
+        {% set spatial_text=h.odsh_get_spatial_text(package)%}
+        {% if spatial_text %}
+        <div class='package-info-pill'>
+            {{ spatial_text }}
+        </div>
+        {% endif %}
+        {% if language_of_package != 'Deutsch' and language_of_package %}
+        <div class='package-info-pill'>
+            <img src={{ language_icon }} />
+            {{ language_of_package }}
+        </div>
+        {% endif %}
+        <p>{{ org }}</p>
+        <h3 class="dataset-heading">
+            {% block heading_private %}
+            {% if package.is_new %}
+            <span class='label new-dataset-label'>{{ _('NEW') }}</span>
+            {% endif %}
+            {% if package.private %}
+            <span class="dataset-private label label-inverse">
+                <i class="fa fa-lock"></i>
+                {{ _('Private') }}
+            </span>
+            {% endif %}
+            {% endblock heading_private %}
+            {% block heading_title %}
+            {{ h.link_to(h.truncate(title, truncate_title), h.url_for(controller='package', action='read', id=package.name),title=_('View {organization_name}').format(organization_name=title))}}
+            {% endblock heading_title %}
+            {% block heading_meta %}
+            {% if package.get('state', '').startswith('draft') %}
+            <span class="label label-info">{{ _('Draft') }}</span>
+            {% elif package.get('state', '').startswith('deleted') %}
+            <span class="label label-important">{{ _('Deleted') }}</span>
+            {% endif %}
+            {{ h.popular('recent views', package.tracking_summary.recent, min=10) if package.tracking_summary }}
+            {% endblock heading_meta %}
+        </h3>
+        {% endblock heading%}
+        {% block banner %}
+        {% if banner %}
+        <span class="banner">{{ _('Popular') }}</span>
+        {% endif %}
+        {% endblock banner%}
 
-    {%if start or end %}
-    <div class='package-info-pill'>
-        {{timerange}}
-    </div>
-    {% endif %}
-    {% set spatial_text=h.odsh_get_spatial_text(package)%}
-    {%if spatial_text %}
-    <div class='package-info-pill'>
-        {{ spatial_text }}
+        {% block notes %}
+        {% if package.groups|length %}   
+        <p class='package-info-category'>
+            <span class='category-header'>
+                {% trans category_count=package.groups|length %}
+                category:
+                {% pluralize %}
+                categories:
+                {% endtrans %}
+            </span>
+            {% for category in package.groups %}
+            <span class='category-with-icon'>
+                <span class='category-icon-container' aria-hidden='true'>
+                    <img src="/base/images/icon_kat_{{category.name}}.svg" alt=""/>
+                </span>
+                <span class="category-name">
+                    {{ category.display_name }}
+                </span>
+            </span>
+            {% endfor %}
+        </p>
+        {% endif %}
+        {% endblock notes %}
     </div>
-    {% endif %}
-    <p class='package-info-categorie'>{{ _('Kategorie') }}: {{ categories}} </p>
-    {% endblock %}
-  </div>
-  <div class='dataset-spacer'></div>
+
+    <div class='dataset-spacer'></div>
+
   <div class="dataset-meta">
     {% block resources %}
     {% block resources_outer %}
@@ -118,6 +140,7 @@ Example:
     {% endblock %}
     {% endblock %}
   </div>
-  {% endblock %}
+
+    {% endblock content %}
 </div>
-{% endblock %}
+{% endblock package_item %}
diff --git a/ckanext/odsh/templates/snippets/search_box.html b/ckanext/odsh/templates/snippets/search_box.html
index 7599b722..e5831c99 100644
--- a/ckanext/odsh/templates/snippets/search_box.html
+++ b/ckanext/odsh/templates/snippets/search_box.html
@@ -1,8 +1,16 @@
 <div class='search-box-container'>
     <div class='search-box'>
-            <div class="field">
-                <input id="field-sitewide-search" class="search" type="text" value="{{c.q}}" name="q" placeholder="{{ _('Search dataset') }}" />
-                <button class="btn-search" type="submit">
+            <div class="field search-field">
+                <input 
+                    aria-label="{{ _('enter search query for datasets') }}"
+                    id="field-sitewide-search" 
+                    class="search" 
+                    type="text" 
+                    value="{{c.q}}" 
+                    name="q" 
+                    placeholder="{{ _('Search dataset') }}" 
+                />
+                <button class="btn-search" type="submit" aria-label="{{ _('Search dataset') }}"></button>
             </div>
     </div>
 </div>
\ No newline at end of file
diff --git a/ckanext/odsh/templates/snippets/search_form.html b/ckanext/odsh/templates/snippets/search_form.html
index 52b85f3d..9e1ea9ed 100644
--- a/ckanext/odsh/templates/snippets/search_form.html
+++ b/ckanext/odsh/templates/snippets/search_form.html
@@ -12,7 +12,11 @@
           (_('Name Ascending'), 'title_string asc'),
           (_('Name Descending'), 'title_string desc'),
           (_('Issued Ascending'), 'extras_issued asc'),
-          (_('Issued Descending'), 'extras_issued desc'),
+          (_('Issued Descending'), 'extras_issued desc'),          
+          (_('Start Date Ascending'), 'temporal_start asc'),
+          (_('Start Date Descending'), 'temporal_start desc'),
+          (_('End Date Ascending'), 'temporal_end asc'),
+          (_('End Date Descending'), 'temporal_end desc'),
           (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ]
         %}
 {% endif %}
@@ -31,10 +35,27 @@
     {%- endif %}
     {% endblock %}
 
+    {% block search_title %}
+    {% if not error %}
+    {% if force_title %}
+    <h2>{{force_title }}</h2>
+    {% else %}
+    <h2>{% snippet 'snippets/search_result_text.html', query=query, count=count, type=type %}</h2>
+    {% if type == 'dataset' %}
+    <a aria-label="{{ _('rss feeds') }}" href={{h.remove_url_param([''], controller='feed', action='custom') }}> 
+        <i aria-hidden="true" class="fa fa-medium fa-rss"></i>
+    </a>
+    {%- endif -%}
+    {% endif %}
+    {% else %}
+    <h2>Error</h2>
+    {% endif %}
+    {% endblock %}
+
     {% block search_sortby %}
     {% if sorting %}
     <div class="form-select control-group control-order-by">
-        <select id="field-order-by" name="sort">
+        <select id="field-order-by" name="sort" aria-label="{{sorting_label_prefix}}&nbsp;&hellip;">
             {% for label, value in sorting %}
             {% if label and value %}
             <option value="{{ value }}" {% if sorting_selected==value %} selected="selected" {% endif %}>
@@ -49,18 +70,6 @@
     {% endif %}
     {% endblock %}
 
-    {% block search_title %}
-    {% if not error %}
-    {% if force_title %}
-    <h2>{{force_title }}</h2>
-    {% else %}
-    <h2>{% snippet 'snippets/search_result_text.html', query=query, count=count, type=type %}</h2>
-    {% endif %}
-    {% else %}
-    <h2>Error</h2>
-    {% endif %}
-    {% endblock %}
-
     {% block search_facets %}
     {% if facets %}
     <p class="filter-list">
@@ -78,12 +87,19 @@
                 {#{{_(value)}}#}
                 {%- endif %}
              {%- endif %}
-                <a href="{{ facets.remove_field(field, value) }}" class="remove" title="{{ _('Remove') }}"><i class="fa fa-times"></i></a>
+                <a 
+                    href="{{ facets.remove_field(field, value) }}" 
+                    class="remove"
+                    aria-label="{{ _('Remove filters') }}" 
+                    title="{{ _('Remove filters') }}"
+                >
+                    <i class="fa fa-times" aria-hidden="true"></i>
+                </a>
         </span>
         {% endfor %}
         {% endfor %}
     </p>
-    <a class="show-filters btn">{{ _('Filter Results') }}</a>
+    <!-- <a class="show-filters btn">{{ _('Filter Results') }}</a> -->
     {% else%}
     {% if always_show_filter_list%}
     <p class="filter-list"></p>
@@ -99,26 +115,54 @@
             {% if start_date and not start_error%}
             <span class="filtered pill">
                 {{_('daterange')}}: {{_('from')}} {{ start_date}}
-                <a href="{{ h.remove_url_param('ext_startdate') }}" class="remove" title="{{ _('Remove') }}"><i class="fa fa-times"></i></a>
+                <a 
+                    href="{{ h.remove_url_param('ext_startdate') }}" 
+                    class="remove"
+                    aria-label="{{ _('Remove filters') }}" 
+                    title="{{ _('Remove filters') }}"
+                >
+                <i class="fa fa-times" aria-hidden="true"></i>
+            </a>
             </span>
             {% endif %}
             {% if start_error %}
             <span class="filtered pill error">
                 {{_('daterange')}}: {{_('wrong_start_date_for_search')}}
-                <a href="{{ h.remove_url_param('ext_startdate') }}" class="remove" title="{{ _('Remove') }}"><i class="fa fa-times"></i></a>
+                <a 
+                    href="{{ h.remove_url_param('ext_startdate') }}"
+                    class="remove"
+                    aria-label="{{ _('Remove filters') }}" 
+                    title="{{ _('Remove filters') }}"
+                >
+                    <i class="fa fa-times" aria-hidden="true"></i>
+                </a>
             </span>
             {% endif %}
 
             {% if end_date and not end_error%}
             <span class="filtered pill">
                 {{_('daterange')}}: {{_('to')}} {{ end_date}}
-                <a href="{{ h.remove_url_param('ext_enddate') }}" class="remove" title="{{ _('Remove') }}"><i class="fa fa-times"></i></a>
+                <a 
+                    href="{{ h.remove_url_param('ext_enddate') }}" 
+                    class="remove"
+                    aria-label="{{ _('Remove filters') }}" 
+                    title="{{ _('Remove filters') }}"
+                >
+                <i class="fa fa-times" aria-hidden="true"></i>
+            </a>
             </span>
             {% endif %}
             {% if end_error %}
             <span class="filtered pill error">
                 {{_('daterange')}}: {{_('wrong_end_date_for_search')}}
-                <a href="{{ h.remove_url_param('ext_enddate') }}" class="remove" title="{{ _('Remove') }}"><i class="fa fa-times"></i></a>
+                <a 
+                    href="{{ h.remove_url_param('ext_enddate') }}" 
+                    class="remove"
+                    aria-label="{{ _('Remove filters') }}" 
+                    title="{{ _('Remove filters') }}"
+                >
+                    <i class="fa fa-times" aria-hidden="true"></i>
+                </a>
             </span>
             {% endif %}
         </p>
@@ -132,7 +176,14 @@
         <p class="filter-list">
             <span class="filtered pill">
                 {{_('map search active')}}
-                <a href="{{ h.remove_url_param(['ext_bbox','ext_prev_extent', 'ext_location'])}}" class="remove" title="{{ _('Remove') }}"><i class="fa fa-times"></i></a>
+                <a 
+                    href="{{ h.remove_url_param(['ext_bbox','ext_prev_extent', 'ext_location'])}}" 
+                    class="remove"
+                    aria-label="{{ _('Remove filters') }}" 
+                    title="{{ _('Remove filters') }}"
+                >
+                <i class="fa fa-times" aria-hidden="true"></i>
+            </a>
             </span>
         </p>
         {% endif %}
diff --git a/ckanext/odsh/templates/snippets/search_result_text.html b/ckanext/odsh/templates/snippets/search_result_text.html
index 56cf8470..cd44abe6 100644
--- a/ckanext/odsh/templates/snippets/search_result_text.html
+++ b/ckanext/odsh/templates/snippets/search_result_text.html
@@ -45,7 +45,4 @@ Example:
 {%- else -%}
 {{ text_no_query_none }}
 {%- endif -%}
-{%- endif -%}
-{% if type == 'dataset' %}
-<a href={{h.remove_url_param([''], controller='feed', action='custom' )}}> <i class="fa fa-medium fa-rss"></i></a>
 {%- endif -%}
\ No newline at end of file
diff --git a/ckanext/odsh/templates/user/edit_user_form.html b/ckanext/odsh/templates/user/edit_user_form.html
new file mode 100644
index 00000000..9ceda7c7
--- /dev/null
+++ b/ckanext/odsh/templates/user/edit_user_form.html
@@ -0,0 +1,59 @@
+{% import 'macros/form.html' as form %}
+{% resource 'odsh/tpsh_validate_password.js' %}
+
+
+<form id="user-edit-form" class="dataset-form form-horizontal" method="post" action="{{ action }}">
+  {{ form.errors(error_summary) }}
+
+  <fieldset>
+    <legend>{{ _('Change details') }}</legend>
+    {{ form.input('name', label=_('Username'), id='field-username', value=data.name, error=errors.name, classes=['control-medium'], is_required=true) }}
+
+    {{ form.input('fullname', label=_('Full name'), id='field-fullname', value=data.fullname, error=errors.fullname, placeholder=_('eg. Joe Bloggs'), classes=['control-medium']) }}
+
+    {{ form.input('email', label=_('Email'), id='field-email', type='email', value=data.email, error=errors.email, placeholder=_('eg. joe@example.com'), classes=['control-medium'], is_required=true) }}
+
+    {{ form.markdown('about', label=_('About'), id='field-about', value=data.about, error=errors.about, placeholder=_('A little information about yourself')) }}
+
+    {% if c.show_email_notifications %}
+      {% call form.checkbox('activity_streams_email_notifications', label=_('Subscribe to notification emails'), id='field-activity-streams-email-notifications', value=True, checked=c.userobj.activity_streams_email_notifications) %}
+      {% set helper_text = _("You will receive notification emails from {site_title}, e.g. when you have new activities on your dashboard."|string) %}
+      {{ form.info(helper_text.format(site_title=g.site_title), classes=['info-help-tight']) }}
+      {% endcall %}
+    {% endif %}
+
+  </fieldset>
+
+  <fieldset>
+    <legend>{{ _('Change password') }}</legend>
+    {{ form.input('old_password',
+                  type='password',
+                  label=_('Sysadmin Password') if c.is_sysadmin else _('Old Password'),
+                  id='field-password',
+                  value=data.oldpassword,
+                  error=errors.oldpassword,
+                  classes=['control-medium'],
+                  attrs={'autocomplete': 'off'}
+                  ) }}
+
+    {{ form.input(
+        'password1', type='password', label=_('Password'), id='field-password', value=data.password1, error=errors.password1, classes=['control-medium'], attrs={'autocomplete': 'off', 'data-module': 'tpsh_validate_password'} ) }}
+
+    {{ form.input('password2', type='password', label=_('Confirm Password'), id='field-password-confirm', value=data.password2, error=errors.password2, classes=['control-medium'], attrs={'autocomplete': 'off'}) }}
+  </fieldset>
+
+  <div class="form-actions">
+    {% block delete_button %}
+      {% if h.check_access('user_delete', {'id': data.id})  %}
+        <a class="btn btn-danger pull-left" href="{% url_for controller='user', action='delete', id=data.id %}" data-module="confirm-action" data-module-content="{{ _('Are you sure you want to delete this User?') }}">{% block delete_button_text %}{{ _('Delete') }}{% endblock %}</a>
+      {% endif %}
+    {% endblock %}
+    {% block generate_button %}
+      {% if h.check_access('user_generate_apikey', {'id': data.id})  %}
+        <a class="btn btn-warning" href="{% url_for controller='user', action='generate_apikey', id=data.id %}" data-module="confirm-action" data-module-content="{{ _('Are you sure you want to regenerate the API key?') }}">{% block generate_button_text %}{{ _('Regenerate API Key') }}{% endblock %}</a>
+      {% endif %}
+    {% endblock %}
+    {{ form.required_message() }}
+    <button class="btn btn-primary" type="submit" name="save">{{ _('Update Profile') }}</button>
+  </div>
+</form>
\ No newline at end of file
diff --git a/ckanext/odsh/tests/test_validation.py b/ckanext/odsh/tests/test_validation.py
index d631545a..b2edc40b 100644
--- a/ckanext/odsh/tests/test_validation.py
+++ b/ckanext/odsh/tests/test_validation.py
@@ -110,3 +110,25 @@ def test_validate_licenseAttributionByText():
             ('extras', 0, 'key'): 'licenseAttributionByText',
             ('extras', 0, 'value'): ''}
     validate_licenseAttributionByText('key', data, {}, None)
+
+
+def test_convert_subjectID_to_subjectText():
+    # arrange
+    data = {('extras', 0, 'subject'): 'subject',
+            ('extras', 0, 'subject'): 'Test_id'}
+    # act
+    convert_subjectID_to_subjectText('key', data, {}, None):
+    # assert
+    assert data[('extras', 1, 'key')] == 'subject_text'
+    assert data[('extras', 1, 'value')] == 'Test_subject'
+
+
+def test_exception_convert_subjectID_to_subjectText():
+    # arrange
+    data = {('extras', 0, 'subject'): 'subject',
+            ('extras', 0, 'subject'): 'Nicht_Vorhanden'}
+    # act
+    convert_subjectID_to_subjectText('key', data, {}, None):
+    #assert
+    assert data[('extras', 1, 'key')] == 'subject_text'
+    assert data[('extras', 1, 'value')] == ''
diff --git a/ckanext/odsh/tests_tpsh/__init__.py b/ckanext/odsh/tests_tpsh/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/ckanext/odsh/tests_tpsh/resources/__init__.py b/ckanext/odsh/tests_tpsh/resources/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/ckanext/odsh/tests_tpsh/resources/collection1.rdf b/ckanext/odsh/tests_tpsh/resources/collection1.rdf
new file mode 100644
index 00000000..8ffd2585
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/resources/collection1.rdf
@@ -0,0 +1,474 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rdf:RDF xmlns:dcatde="http://dcat-ap.de/def/dcatde/1_0/" xmlns:dcat="http://www.w3.org/ns/dcat#"
+xmlns:dct="http://purl.org/dc/terms/" xmlns:foaf="http://xmlns.com/foaf/0.1/"
+xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:schema="http://schema.org/">
+  <dcat:Catalog rdf:about="https://data.some.org/catalog">
+
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte">
+        <dct:type rdf:resource="http://dcat-ap.de/def/datasetTypes/collection" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+	<dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+
+        <dct:hasVersion rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201704" />
+        <dct:hasVersion rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201703" />
+        <dct:hasVersion rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201702" />
+        <dct:hasVersion rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201701" />
+        <dct:hasVersion rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201612" />
+        <dct:hasVersion rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2017" />
+        <dct:hasVersion rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2016" />
+        <dct:hasVersion rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2015" />
+      </dcat:Dataset>
+    </dcat:dataset>
+    
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201704">
+        <dct:isVersionOf rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201704/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201704.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-03-20</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-04-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-04-30</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201703">
+        <dct:isVersionOf rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201703/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201703.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach
+        Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-02-20</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-03-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-03-31</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201702">
+        <dct:isVersionOf rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201702/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201702.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach
+        Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-01-16</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-02-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-02-28</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201701">
+        <dct:isVersionOf rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201701/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201701.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach
+        Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-12-12</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-01-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-01-31</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201612">
+        <dct:isVersionOf rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201612/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201612.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach
+        Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-11-21</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-12-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-12-31</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2017">
+        <dct:isVersionOf rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2017/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_Antrag_Jahr_2017.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach
+        Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-12-31</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-01-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-12-31</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2016">
+        <dct:isVersionOf rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2016/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_Antrag_Jahr_2016.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach
+        Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-12-31</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-01-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-12-31</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2015">
+        <dct:isVersionOf rdf:resource="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte" />
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2015/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_Antrag_Jahr_2015.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach
+        Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-31</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-01-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-31</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+    <dcat:dataset>
+      <dcat:Dataset rdf:about="http://opendata.schleswig-holstein.de/dataset/Test_nicht_in_Collection">
+        <dct:title>SER Statistik anerkannte Versorgungsberechtigte</dct:title>
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_Antrag_Jahr_2015/resource">
+            <dcat:accessURL rdf:resource="http://185.223.104.6/data/lasd/LAsDSH_SER_Statistik_Antrag_Jahr_2015.pdf" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+            <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+            <dct:format rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/SOCI" />
+        <dct:description>Statistik der Versorgung von rentenberechtigten Kriegsopfern und gleichgestellten Personen nach
+        Personenkreis und MdE innerhalb Schleswig-Holsteins</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-31</dct:issued>
+        <dct:license rdf:resource="http://dcat-ap.de/def/licenses/dl-by-de/2.0" />
+        <dcatde:licenseAttributionByText>Landesamt für soziale Dienste Schleswig-Holstein</dcatde:licenseAttributionByText>
+        <dct:publisher>
+          <foaf:Organization rdf:about="http://opendata.schleswig-holstein.de/lasd" />
+        </dct:publisher>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-01-01</schema:startDate>
+            <schema:endDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-31</schema:endDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+        <dcat:keyword>Soziales Entschädigungsrecht</dcat:keyword>
+        <dcat:keyword>Kriegsopfer</dcat:keyword>
+        <dcat:keyword>Beschädigte</dcat:keyword>
+        <dcat:keyword>Witwen</dcat:keyword>
+        <dcat:keyword>Waisen</dcat:keyword>
+        <dcat:keyword>BVG</dcat:keyword>
+        <dcat:keyword>SVG</dcat:keyword>
+        <dcat:keyword>ZDG</dcat:keyword>
+        <dcat:keyword>OEG</dcat:keyword>
+        <dcat:keyword>IfSG</dcat:keyword>
+        <dcat:keyword>HHG</dcat:keyword>
+        <dcat:keyword>SER</dcat:keyword>
+        <dcat:keyword>Statistik</dcat:keyword>
+        <dcat:keyword>Versorgungsberechtigte</dcat:keyword>
+      </dcat:Dataset>
+    </dcat:dataset>
+  </dcat:Catalog>
+</rdf:RDF>
diff --git a/ckanext/odsh/tests_tpsh/resources/org_dicts.py b/ckanext/odsh/tests_tpsh/resources/org_dicts.py
new file mode 100644
index 00000000..5948d765
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/resources/org_dicts.py
@@ -0,0 +1,87 @@
+# encoding: utf-8
+
+organization_with_address = {
+            'approval_status': u'approved',
+            'created': '2019-07-29T08:11:32.697127',
+            'description': u'',
+            'display_name': u'Test-Organisation',
+            'extras': [
+                {
+                    'group_id': u'63c87e74-60a9-4a4a-a980-d7983c47f92b',
+                    'id': u'b31c1b27-8c4e-46d7-b533-30bc4cc93d0e',
+                    'key': u'location',
+                    'revision_id': u'5e9677a3-ddab-4306-850f-cfd4fad3d676',
+                    'state': u'active',
+                    'value': u'Müllerdorf'
+                },
+                {
+                    'group_id': u'63c87e74-60a9-4a4a-a980-d7983c47f92b',
+                    'id': u'7302c660-871e-44f0-92f4-18bc5b8953ec',
+                    'key': u'mail',
+                    'revision_id': u'5e9677a3-ddab-4306-850f-cfd4fad3d676',
+                    'state': u'active',
+                    'value': u'mueller@mueller.de'
+                },
+                {
+                    'group_id': u'63c87e74-60a9-4a4a-a980-d7983c47f92b',
+                    'id': u'6d3e02ba-b721-4362-92f3-985ed50f6c42',
+                    'key': u'person',
+                    'revision_id': u'5e9677a3-ddab-4306-850f-cfd4fad3d676',
+                    'state': u'active',
+                    'value': u'Michael Müller'
+                },
+                {
+                    'group_id': u'63c87e74-60a9-4a4a-a980-d7983c47f92b',
+                    'id': u'baf92ac2-21e2-49f5-96f8-e48c7fd50cf0',
+                    'key': u'street',
+                    'revision_id': u'5e9677a3-ddab-4306-850f-cfd4fad3d676',
+                    'state': u'active',
+                    'value': u'Müllergasse 10'
+                },
+                {
+                    'group_id': u'63c87e74-60a9-4a4a-a980-d7983c47f92b',
+                    'id': u'd5ce2972-487e-444b-95ba-c6a8db238c67',
+                    'key': u'telephone',
+                    'revision_id': u'5e9677a3-ddab-4306-850f-cfd4fad3d676',
+                    'state': u'active',
+                    'value': u'040 123456'
+                },
+                {
+                    'group_id': u'63c87e74-60a9-4a4a-a980-d7983c47f92b',
+                    'id': u'00d1d308-6718-4d90-81ae-25ee3f0b76f7',
+                    'key': u'web',
+                    'revision_id': u'5e9677a3-ddab-4306-850f-cfd4fad3d676',
+                    'state': u'active',
+                    'value': u'mueller.de'
+                }
+            ],
+            'groups': [],
+            'id': u'63c87e74-60a9-4a4a-a980-d7983c47f92b',
+            'image_display_url': u'',
+            'image_url': u'',
+            'is_organization': True,
+            'name': u'test-organisation',
+            'num_followers': 0L,
+            'package_count': 51,
+            'revision_id': u'3040af6c-d3f6-462d-b48a-329d63e17a28',
+            'state': u'active',
+            'tags': [],
+            'title': u'Test-Organisation',
+            'type': u'organization',
+            'users': [{
+                'about': u'',
+                'activity_streams_email_notifications': False,
+                'capacity': u'admin',
+                'created': '2019-06-05T06:19:17.576291',
+                'display_name': u'ckanuser',
+                'email_hash': 'b28744113bd1ae8dc4f6e17aefe3bd9b',
+                'fullname': u'',
+                'id': u'ff8d002d-3908-45e5-ba7b-445381860957',
+                'name': u'ckanuser',
+                'number_created_packages': 13L,
+                'number_of_edits': 456L,
+                'openid': None,
+                'state': u'active',
+                'sysadmin': True
+            }]
+        }
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/resources/subject_mapping_for_tests.json b/ckanext/odsh/tests_tpsh/resources/subject_mapping_for_tests.json
new file mode 100644
index 00000000..2e8bd946
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/resources/subject_mapping_for_tests.json
@@ -0,0 +1,26 @@
+{
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Verwaltungsvorschrift" : "Verwaltungsvorschrift",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Organisationsplan" : "Organisationsplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Geschaeftsverteilungsplan" : "Geschäftsverteilungsplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Aktenplan" : "Aktenplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Richtlinie" : "Richtlinie und Runderlass",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Statistik" : "amtliche Statistik",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Taetigkeitsbericht" : "Tätigkeitsbericht",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Broschuere" : "Broschüre",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Gutachten" : "Gutachten",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Studie" : "Studie",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Haushaltsplan" : "Haushaltsplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Stellenplan" : "Stellenplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Wirtschaftsplan" : "Wirtschaftsplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#ZuwendungAnPerson" : "Übersicht über Zuwendungen an juristische Personen des Privatrechts",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#ZuwendungAnLand" : "Übersicht über Zuwendungen an das Land Schleswig-Holstein",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#IZGAntwort" : "IZG/GvgV-Auskunft",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Gerichtsurteil" : "Gerichtsurteil",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#GesetzvorlageLandtag" : "Gesetzesvorlage an den Landtag",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#MitteilungLandtag" : "Mitteilung an den Landtag",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Unternehmensdaten" : "wesentliche Unternehmensdaten von Beteiligungen des Landes",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#VergütungsOG" : "jährliche Vergütungen nach dem VergütungsOG",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Vertrag" : "Vertrag",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#sonstiges" : "sonstiges"
+}
+    
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/resources/test.pdf b/ckanext/odsh/tests_tpsh/resources/test.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..10451cf0fba2fea7ac87ae52cc9b350b48c67198
GIT binary patch
literal 112437
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
OjLZypRaIU6-FN|6bFg>-

literal 0
HcmV?d00001

diff --git a/ckanext/odsh/tests_tpsh/resources/transparenz.rdf b/ckanext/odsh/tests_tpsh/resources/transparenz.rdf
new file mode 100644
index 00000000..ea4fb5e3
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/resources/transparenz.rdf
@@ -0,0 +1,1145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rdf:RDF xmlns:dcatde="http://dcat-ap.de/def/dcatde/1_0/" xmlns:dcat="http://www.w3.org/ns/dcat#" xmlns:dct="http://purl.org/dc/terms/"
+xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:schema="http://schema.org/">
+  <dcat:Catalog rdf:about="https://transparenz.schleswig-holstein.de/catalog">
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/9f9ae60bb0d8985e10e9ab8aa6a7ca34">
+        <dct:title>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2017)</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5768d5cdbc58abd45c8620e44e017f01" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/af_blano_fortschritt2017.pdf?__blob=publicationFile&amp;v=5">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/af_blano_fortschritt2017.pdf?__blob=publicationFile&amp;v=5" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2017)</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-05-02</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-05-02</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/ff612d0f165d46f3091f58e1ef56a2ec">
+        <dct:title>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2016)</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5768d5cdbc58abd45c8620e44e017f01" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/ae_blano_fortschritt2016.pdf?__blob=publicationFile&amp;v=6">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/ae_blano_fortschritt2016.pdf?__blob=publicationFile&amp;v=6" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2016)</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-04-10</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-04-10</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/3a0d0674120fbf06b5cb8737124e3fd0">
+        <dct:title>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2015)</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5768d5cdbc58abd45c8620e44e017f01" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/ad_blano_fortschritt2015.pdf?__blob=publicationFile&amp;v=8">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/ad_blano_fortschritt2015.pdf?__blob=publicationFile&amp;v=8" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2015)</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-07-10</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-07-10</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/b5cd3f303f594ecde96e1017e953b688">
+        <dct:title>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2014)</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5768d5cdbc58abd45c8620e44e017f01" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/ad_blano_fortschritt2014.pdf?__blob=publicationFile&amp;v=4">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/ad_blano_fortschritt2014.pdf?__blob=publicationFile&amp;v=4" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2014)</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-07-17</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-07-17</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/cd606b042789723a2b6d61cb31c46c39">
+        <dct:title>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2013)</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5768d5cdbc58abd45c8620e44e017f01" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/ac_blano_fortschritt2013.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/UXO/Berichte/PDF/Berichte/ac_blano_fortschritt2013.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt (Jahr 2013)</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2014-07-26</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2014-07-26</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/04640ac19a21450984d2af7c402d6aa0">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2006 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2006.pdf?__blob=publicationFile&amp;v=6">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2006.pdf?__blob=publicationFile&amp;v=6" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2006 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/86fe10eb6578e940d7df8e3d6da6520d">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2007 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2007.pdf?__blob=publicationFile&amp;v=6">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2007.pdf?__blob=publicationFile&amp;v=6" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2007 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/b0024265f96b9de5a590541f5e0aec91">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2008 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2008.pdf?__blob=publicationFile&amp;v=6">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2008.pdf?__blob=publicationFile&amp;v=6" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2008 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/ccb65ee5047e3c9cc67384b513400246">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2009 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2009.pdf?__blob=publicationFile&amp;v=6">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2009.pdf?__blob=publicationFile&amp;v=6" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2009 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/ae2a3cffda84388365bc87711ed4af47">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2010 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2010.pdf?__blob=publicationFile&amp;v=6">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2010.pdf?__blob=publicationFile&amp;v=6" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2010 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-29</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/91a479991245f208dd6f8ba82411a570">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2011 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2011.pdf?__blob=publicationFile&amp;v=6">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2011.pdf?__blob=publicationFile&amp;v=6" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2011 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-28</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-28</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/1ee93d311ae6078dc11655c2ca8865b5">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2012 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2012.pdf?__blob=publicationFile&amp;v=6">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2012.pdf?__blob=publicationFile&amp;v=6" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2012 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-28</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-28</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/f5123967a8d0d80ff135342ce41a09bb">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2013 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2013.pdf?__blob=publicationFile&amp;v=5">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2013.pdf?__blob=publicationFile&amp;v=5" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2013 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-28</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-28</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/05199f38b6234e794f79ad3726957a3e">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2014/15 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2015.pdf?__blob=publicationFile&amp;v=3">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2015.pdf?__blob=publicationFile&amp;v=3" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2014/15 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-07-14</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-07-14</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/ffef477b7ebb1447d869b33c79cac8e2">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2016/17 - Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2017.pdf?__blob=publicationFile&amp;v=3">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2017.pdf?__blob=publicationFile&amp;v=3" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2016/17 - Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-08-01</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-08-01</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/a1fea922aa7d9f7a924784615301da83">
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein 2015/16 – Bericht</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2016.pdf?__blob=publicationFile&amp;v=2">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/VIII/Service/Broschueren/Broschueren_VIII/Gesundheit/schuleinguntber2016.pdf?__blob=publicationFile&amp;v=2" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein 2015/16 – Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-11-27</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-11-27</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/423e1ea7e98b492aebc0ca5108c7b36d">
+        <dct:title>Jahresbericht 2017 zur biologischen Vielfalt - Jagd und Artenschutz</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/7ee94f73beb43faf4099208b4e55734b" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/V/Service/Broschueren/Broschueren_V/Umwelt/pdf/Jahresbericht_Zur_biologischen_Vielfalt_2017.pdf?__blob=publicationFile&amp;v=3">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/V/Service/Broschueren/Broschueren_V/Umwelt/pdf/Jahresbericht_Zur_biologischen_Vielfalt_2017.pdf?__blob=publicationFile&amp;v=3" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Jahresbericht 2017 zur biologischen Vielfalt - Jagd und Artenschutz</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-01-16</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-01-16</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/6ea87d1f4a92efb288ed53e2bf901880">
+        <dct:title>Jahresbericht 2018 zur biologischen Vielfalt - Jagd und Artenschutz</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/7ee94f73beb43faf4099208b4e55734b" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/V/Service/Broschueren/Broschueren_V/Umwelt/pdf/Jahresbericht_zur_biologischen_Vielfalt_2018.pdf?__blob=publicationFile&amp;v=2">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/V/Service/Broschueren/Broschueren_V/Umwelt/pdf/Jahresbericht_zur_biologischen_Vielfalt_2018.pdf?__blob=publicationFile&amp;v=2" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Jahresbericht 2018 zur biologischen Vielfalt - Jagd und Artenschutz</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-12-16</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-12-16</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/7f6ef434153bdbfff9ed42c8d9ee1381">
+        <dct:title>Jahresbericht 2016 zur biologischen Vielfalt – Jagd- und Artenschutz</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/7ee94f73beb43faf4099208b4e55734b" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Landesregierung/V/Service/Broschueren/Broschueren_V/Umwelt/pdf/biodiversitaetsbericht2016.pdf?__blob=publicationFile&amp;v=3">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Landesregierung/V/Service/Broschueren/Broschueren_V/Umwelt/pdf/biodiversitaetsbericht2016.pdf?__blob=publicationFile&amp;v=3" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Jahresbericht 2016 zur biologischen Vielfalt – Jagd- und Artenschutz</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-12-21</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-12-21</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/f681f52201dcf1b1ea467aeed683c8a2">
+        <dct:title>Waldzustandsbericht 2018</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2018.pdf?__blob=publicationFile&amp;v=2">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2018.pdf?__blob=publicationFile&amp;v=2" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2018</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-11-29</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2018-11-29</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/225ebaffe8e7a30483ac43935e91e1f4">
+        <dct:title>Waldzustandsbericht 2017</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht_2017.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht_2017.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2017</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-12-27</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2017-12-27</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/9f48b6c643a139a0b4e7eac2ab4cfbb0">
+        <dct:title>Waldzustandsbericht 2016</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2016.pdf?__blob=publicationFile&amp;v=3">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2016.pdf?__blob=publicationFile&amp;v=3" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2016</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-12-15</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2016-12-15</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/904ef47daad01d2979ab20dda18b2ae7">
+        <dct:title>Waldzustandsbericht 2015</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2015.pdf?__blob=publicationFile&amp;v=3">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2015.pdf?__blob=publicationFile&amp;v=3" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2015</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-31</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2015-12-31</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/2147dcaa148ff19a89fa99c989dd648e">
+        <dct:title>Waldzustandsbericht 2014</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2014.pdf?__blob=publicationFile&amp;v=2">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2014.pdf?__blob=publicationFile&amp;v=2" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2014</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2014-12-31</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2014-12-31</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/f201ecaf859f8e713cd030615bd3f5cb">
+        <dct:title>Waldzustandsbericht 2013</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2013.pdf?__blob=publicationFile&amp;v=2">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2013.pdf?__blob=publicationFile&amp;v=2" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2013</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2013-12-31</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2013-12-31</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/9bbeaf7b503dbd2c667786db08c4512d">
+        <dct:title>Waldzustandsbericht 2012</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2012.pdf?__blob=publicationFile&amp;v=2">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2012.pdf?__blob=publicationFile&amp;v=2" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2012</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2012-12-31</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2012-12-31</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/f6de9c145fe28effe99fc163b92d657e">
+        <dct:title>Waldzustandsbericht 2011</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2011.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2011.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2011</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2011-12-31</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2011-12-31</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/5d794a0f4064ba53b5047dbe36eef3ef">
+        <dct:title>Waldzustandsbericht 2010</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2010.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2010.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2010</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2010-12-31</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2010-12-31</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/0ac0c2ceb265a7c0ca18385c95ec6e3a">
+        <dct:title>Waldzustandsbericht 2009</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2009.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2009.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2009</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2009-12-31</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2009-12-31</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/2f21507e1dc4e9106e348a65bb9e5cfa">
+        <dct:title>Waldzustandsbericht 2008</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2008.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2008.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2008</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2009-01-06</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2009-01-06</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/1e4b51fbab78072693617fcc2458824e">
+        <dct:title>Waldzustandsbericht 2006/2007</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2006_2007.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2006_2007.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldzustandsbericht 2006/2007</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-02-18</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-02-18</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/ac543132dfecddfdaa9ef8385034323f">
+        <dct:title>Waldschadensbericht 2005</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2005.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2005.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldschadensbericht 2005</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2006-03-22</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2006-03-22</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+   <dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/f9727d9cfb4ad6f923a800e0f116b6e3">
+        <dct:title>Waldschadensbericht 2004</dct:title>
+
+   <dct:isVersionOf rdf:resource="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63" />
+        <dcat:distribution>
+          <dcat:Distribution rdf:about="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2004.pdf?__blob=publicationFile&amp;v=1">
+            <dct:title></dct:title>
+            <dcat:accessURL rdf:resource="https://www.schleswig-holstein.de/DE/Fachinhalte/W/wald/Downloads/Waldzustandsbericht2004.pdf?__blob=publicationFile&amp;v=1" />
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+            <dct:format  rdf:resource="http://publications.europa.eu/resource/authority/file-type/PDF" />
+            <dcat:mediaType>application/pdf</dcat:mediaType>
+          </dcat:Distribution>
+        </dcat:distribution>
+        <dct:subject rdf:resource="http://d-nb.info/gnd/4128022-2"/>
+        <dcat:theme rdf:resource="http://publications.europa.eu/resource/authority/data-theme/GOVE" />
+        <dct:description>Waldschadensbericht 2004</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU"/>
+        <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2004-11-30</dct:issued>
+            <dct:license rdf:resource="http://dcat-ap.de/def/licenses/cc-zero" />
+        <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2019-07-15T14:55:00.00000</dct:modified>
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+        <dct:temporal>
+          <dct:PeriodOfTime>
+            <schema:startDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2004-11-30</schema:startDate>
+          </dct:PeriodOfTime>
+        </dct:temporal>
+      </dcat:Dataset>
+    </dcat:dataset>
+
+<dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/5768d5cdbc58abd45c8620e44e017f01">
+        <dct:type rdf:resource="http://dcat-ap.de/def/datasetTypes/collection" />
+        <dct:title>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt</dct:title>
+        <dct:description>Munitionsbelastung der deutschen Meeresgewässer – Entwicklungen und Fortschritt</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/b5cd3f303f594ecde96e1017e953b688" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/9f9ae60bb0d8985e10e9ab8aa6a7ca34" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/ff612d0f165d46f3091f58e1ef56a2ec" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/3a0d0674120fbf06b5cb8737124e3fd0" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/cd606b042789723a2b6d61cb31c46c39" />
+
+      </dcat:Dataset>
+    </dcat:dataset>
+<dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/f1f2513c3899ecf6f15691e0e4412822">
+        <dct:type rdf:resource="http://dcat-ap.de/def/datasetTypes/collection" />
+        <dct:title>Schuleingangsuntersuchungen in Schleswig-Holstein – Bericht</dct:title>
+        <dct:description>Schuleingangsuntersuchungen in Schleswig-Holstein – Bericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/ae2a3cffda84388365bc87711ed4af47" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/1ee93d311ae6078dc11655c2ca8865b5" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/91a479991245f208dd6f8ba82411a570" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/b0024265f96b9de5a590541f5e0aec91" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/04640ac19a21450984d2af7c402d6aa0" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/ffef477b7ebb1447d869b33c79cac8e2" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/a1fea922aa7d9f7a924784615301da83" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/86fe10eb6578e940d7df8e3d6da6520d" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/ccb65ee5047e3c9cc67384b513400246" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/f5123967a8d0d80ff135342ce41a09bb" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/05199f38b6234e794f79ad3726957a3e" />
+
+      </dcat:Dataset>
+    </dcat:dataset>
+<dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63">
+        <dct:type rdf:resource="http://dcat-ap.de/def/datasetTypes/collection" />
+        <dct:title>Waldzustandsbericht</dct:title>
+        <dct:description>Waldzustandsbericht</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/1e4b51fbab78072693617fcc2458824e" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/0ac0c2ceb265a7c0ca18385c95ec6e3a" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/f9727d9cfb4ad6f923a800e0f116b6e3" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/904ef47daad01d2979ab20dda18b2ae7" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/5d794a0f4064ba53b5047dbe36eef3ef" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/2147dcaa148ff19a89fa99c989dd648e" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/f201ecaf859f8e713cd030615bd3f5cb" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/9bbeaf7b503dbd2c667786db08c4512d" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/ac543132dfecddfdaa9ef8385034323f" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/f6de9c145fe28effe99fc163b92d657e" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/f681f52201dcf1b1ea467aeed683c8a2" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/9f48b6c643a139a0b4e7eac2ab4cfbb0" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/225ebaffe8e7a30483ac43935e91e1f4" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/2f21507e1dc4e9106e348a65bb9e5cfa" />
+
+      </dcat:Dataset>
+    </dcat:dataset>
+<dcat:dataset>
+      <dcat:Dataset rdf:about="http://transparenz.schleswig-holstein.de/7ee94f73beb43faf4099208b4e55734b">
+        <dct:type rdf:resource="http://dcat-ap.de/def/datasetTypes/collection" />
+        <dct:title>Jahresbericht zur biologischen Vielfalt</dct:title>
+        <dct:description>Jahresbericht zur biologischen Vielfalt</dct:description>
+        <dct:language rdf:resource="http://publications.europa.eu/resource/authority/language/DEU" />
+        <dct:spatial>
+          <dct:Location rdf:about="http://dcat-ap.de/def/politicalGeocoding/stateKey/01" />
+        </dct:spatial>
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/423e1ea7e98b492aebc0ca5108c7b36d" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/6ea87d1f4a92efb288ed53e2bf901880" />
+
+        <dct:hasVersion rdf:resource="http://transparenz.schleswig-holstein.de/7f6ef434153bdbfff9ed42c8d9ee1381" />
+
+      </dcat:Dataset>
+    </dcat:dataset>
+</dcat:Catalog>
+</rdf:RDF>
+
diff --git a/ckanext/odsh/tests_tpsh/test_checksum.py b/ckanext/odsh/tests_tpsh/test_checksum.py
new file mode 100644
index 00000000..6bff5d4f
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_checksum.py
@@ -0,0 +1,59 @@
+from mock import patch, mock_open
+import nose.tools as nt
+from ckanext.odsh.lib.uploader import _raise_validation_error_if_hash_values_differ, calculate_hash
+import ckantoolkit as ct
+import ckan.logic as logic
+import hashlib
+
+import os
+path = os.path.abspath(__file__)
+dir_path = os.path.dirname(path)
+
+class testHashException(object):     
+     text = 'Transparenz SH'
+     # hash produced by following command in bash:
+     # echo -n "Transparenz SH" | md5sum
+     hash_for_text = '791759e98a3ec4cc9c03141a3293292b'
+
+     def test_without_hash(self):
+          resource = {'package_id':'Test_id',}
+          with patch("__builtin__.open", mock_open(read_data=self.text)) as mock_file:
+               with open('some/file') as f:
+                    assert _raise_validation_error_if_hash_values_differ(f, resource) == None
+
+     def test_with_correct_hash(self):
+          resource = {'package_id':'Test_id', 'hash':self.hash_for_text}
+          with patch("__builtin__.open", mock_open(read_data=self.text)) as mock_file:
+               with open('some/file') as f:
+                    assert _raise_validation_error_if_hash_values_differ(f, resource) == None
+
+     def test_with_wrong_hash(self):
+          resource = {'package_id':'Test_id', 'hash':'incorrect_hash'}
+          with patch("__builtin__.open", mock_open(read_data=self.text)) as mock_file:
+               with open('some/file') as f:
+                    with nt.assert_raises(logic.ValidationError) as e:
+                         _raise_validation_error_if_hash_values_differ(f, resource)
+          exception_upload = e.exception.error_dict.get('upload')
+          assert exception_upload[0] == 'Berechneter Hash und mitgelieferter Hash sind unterschiedlich'
+     
+     def test_mock_file(self):
+          with patch("__builtin__.open", mock_open(read_data=self.text)) as mock_file:
+               with open('some/file') as f:
+                    file_content = f.read()
+          nt.assert_equal(file_content, self.text)
+     
+     def test_hash_of_empty_string(self):
+          hash_empty_string = 'd41d8cd98f00b204e9800998ecf8427e'
+          nt.assert_equal(hash_empty_string, hashlib.md5('').hexdigest())
+     
+     def test_pdf(self):
+          # expected_hash_pdf produced by following command in bash:
+          # md5sum test.pdf
+          expected_hash_pdf = '66123edf64fabf1c073fc45478bf4a57'
+          with open(dir_path + '/resources/test.pdf') as f:
+               hash = calculate_hash(f)
+          nt.assert_equal(hash, expected_hash_pdf)
+
+               
+               
+               
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/test_date_range.py b/ckanext/odsh/tests_tpsh/test_date_range.py
new file mode 100644
index 00000000..e9b7121d
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_date_range.py
@@ -0,0 +1,158 @@
+ # -*- coding: utf-8 -*-
+
+import nose.tools as nt
+
+import datetime
+
+from ckanext.odsh.pretty_daterange.date_range import DateRange
+
+class TestDateRange(object):
+    def test_is_one_year_returns_true(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 1, 1),
+            date_end = datetime.date(2000, 12, 31)
+        )
+        assert dr.is_one_year()
+    
+    def test_is_one_year_returns_false_for_less_than_one_year(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 1, 1),
+            date_end = datetime.date(2000, 12, 30)
+        )
+        assert dr.is_one_year()==False
+    
+    def test_is_one_year_returns_false_for_more_than_one_year(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 1, 1),
+            date_end = datetime.date(2001, 1, 15)
+        )
+        assert dr.is_one_year()==False
+    
+    def test_is_one_year_returns_false_for_two_years(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 1, 1),
+            date_end = datetime.date(2001, 12, 31)
+        )
+        assert dr.is_one_year()==False
+    
+    def test_is_one_half_of_year_returns_true_for_first_half(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 1, 1),
+            date_end = datetime.date(2000, 6, 30)
+        )
+        assert dr.is_one_half_of_year()
+    
+    def test_is_one_half_of_year_returns_true_for_second_half(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 7, 1),
+            date_end = datetime.date(2000, 12, 31)
+        )
+        assert dr.is_one_half_of_year()
+    
+    def test_is_one_half_of_year_returns_false_for_full_year(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 1, 1),
+            date_end = datetime.date(2000, 12, 31)
+        )
+        assert dr.is_one_half_of_year()==False
+    
+    def test_get_half_year_returns_1_for_first_half_of_year(self):
+        half_year = DateRange.get_half_year(datetime.date(2000, 6, 30))
+        nt.assert_equal(half_year, 1)
+    
+    def test_get_half_year_returns_2_for_second_half_of_year(self):
+        half_year = DateRange.get_half_year(datetime.date(2000, 7, 1))
+        nt.assert_equal(half_year, 2)
+    
+    def test_is_one_quarter_of_year_returns_true_for_first_quarter(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 1, 1),
+            date_end = datetime.date(2000, 3, 31)
+        )
+        assert dr.is_one_quarter_of_year()
+    
+    def test_is_one_quarter_of_year_returns_true_for_second_quarter(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 4, 1),
+            date_end = datetime.date(2000, 6, 30)
+        )
+        assert dr.is_one_quarter_of_year()
+
+    def test_is_one_quarter_of_year_returns_true_for_third_quarter(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 7, 1),
+            date_end = datetime.date(2000, 9, 30)
+        )
+        assert dr.is_one_quarter_of_year()
+    
+    def test_is_one_quarter_of_year_returns_true_for_fourth_quarter(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 10, 1),
+            date_end = datetime.date(2000, 12, 31)
+        )
+        assert dr.is_one_quarter_of_year()
+    
+    def test_get_quarter_returns_1_for_first_quarter(self):
+        quarter = DateRange.get_quarter(datetime.date(2000, 2, 1))
+        nt.assert_equal(quarter, 1)
+    
+    def test_get_quarter_returns_2_for_second_quarter(self):
+        quarter = DateRange.get_quarter(datetime.date(2000, 5, 1))
+        nt.assert_equal(quarter, 2)
+
+    def test_get_quarter_returns_3_for_third_quarter(self):
+        quarter = DateRange.get_quarter(datetime.date(2000, 8, 1))
+        nt.assert_equal(quarter, 3)
+    
+    def test_get_quarter_returns_4_for_fourth_quarter(self):
+        quarter = DateRange.get_quarter(datetime.date(1981, 11, 21))
+        nt.assert_equal(quarter, 4)
+
+    def test_is_one_month_returns_true(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 12, 1),
+            date_end = datetime.date(2000, 12, 31)
+        )
+        assert dr.is_one_month()
+
+    def test_is_one_month_returns_false_for_two_months(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 11, 1),
+            date_end = datetime.date(2000, 12, 31)
+        )
+        assert dr.is_one_month()==False
+    
+    def test_is_range_of_multiple_months_returns_false_for_single_month(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 11, 1),
+            date_end = datetime.date(2000, 11, 30)
+        )
+        assert dr.is_range_of_multiple_months()==False
+    
+    def test_is_range_of_multiple_months_returns_true_for_multiple_months(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 11, 1),
+            date_end = datetime.date(2021, 12, 31)
+        )
+        assert dr.is_range_of_multiple_months()
+    
+    def test_is_range_of_multiple_months_in_same_year_returns_false_for_differing_years(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 11, 1),
+            date_end = datetime.date(2021, 12, 31)
+        )
+        assert dr.is_range_of_multiple_months_in_same_year()==False
+
+    def test_is_range_of_multiple_months_in_same_year_returns_true_for_same_year(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 11, 1),
+            date_end = datetime.date(2000, 12, 31)
+        )
+        assert dr.is_range_of_multiple_months_in_same_year()
+
+    def test_is_range_of_multiple_years_returns_false_for_single_year(self):
+        dr = DateRange(
+            date_start = datetime.date(2000, 1, 1),
+            date_end = datetime.date(2000, 12, 31)
+        )
+        assert dr.is_range_of_multiple_years() == False
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/test_date_range_formatter.py b/ckanext/odsh/tests_tpsh/test_date_range_formatter.py
new file mode 100644
index 00000000..d2c8e77b
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_date_range_formatter.py
@@ -0,0 +1,145 @@
+ # -*- coding: utf-8 -*-
+
+import nose.tools as nt
+
+import datetime
+
+from ckanext.odsh.pretty_daterange.date_range_formatter import DateRangeFormatter
+
+class TestDateRangeFormatter(object):
+    def test_it_raises_value_error_if_date_end_before_date_start(self):
+        date_start = datetime.date(2019,1,1)
+        date_end = datetime.date(2018,1,1)
+        with nt.assert_raises(ValueError):
+            drf = DateRangeFormatter(date_start, date_end)
+    
+    def test_it_stores_date_start_and_date_end(self):
+        date_start = datetime.date(2019,1,1)
+        date_end = datetime.date(2019,2,1)
+        drf = DateRangeFormatter(date_start, date_end)
+        assert drf.date_start==date_start and drf.date_end==date_end
+    
+    def test_it_returns_date_in_correct_format(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019,1,2), 
+            date_end = datetime.date(2020, 2, 4), 
+            expected_str = u'02.01.2019 - 04.02.2020')
+    
+    def _assert_output_string_equals(self, date_start, date_end, expected_str):
+        drf = DateRangeFormatter(date_start, date_end)
+        formatted_date_range = drf.get_formatted_str()
+        nt.assert_equal(formatted_date_range, expected_str)
+    
+    def test_it_returns_single_date_if_start_equals_end(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 1, 2), 
+            date_end = datetime.date(2019, 1, 2), 
+            expected_str = u'02.01.2019')
+
+    def test_it_returns_only_year_for_full_year(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 1, 1), 
+            date_end = datetime.date(2019, 12, 31), 
+            expected_str = u'2019')
+    
+    def test_it_returns_only_year_for_multiple_full_years(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 1, 1), 
+            date_end = datetime.date(2020, 12, 31), 
+            expected_str = u'2019 - 2020')
+    
+    def test_it_returns_month_for_full_month(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 2, 1), 
+            date_end = datetime.date(2019, 2, 28), 
+            expected_str = u'Februar 2019')
+    
+    def test_it_returns_months_for_range_of_months(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 2, 1), 
+            date_end = datetime.date(2020, 3, 31), 
+            expected_str = u'Februar 2019 - März 2020')
+    
+    def test_it_returns_months_for_range_of_months_in_same_year(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 2, 1), 
+            date_end = datetime.date(2019, 3, 31), 
+            expected_str = u'Februar - März 2019')
+    
+    def test_it_returns_first_quarter(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 1, 1), 
+            date_end = datetime.date(2019, 3, 31), 
+            expected_str = u'1. Quartal 2019')
+    
+    def test_it_returns_second_quarter(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 4, 1), 
+            date_end = datetime.date(2019, 6, 30), 
+            expected_str = u'2. Quartal 2019')
+    
+    def test_it_returns_third_quarter(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 7, 1), 
+            date_end = datetime.date(2019, 9, 30), 
+            expected_str = u'3. Quartal 2019')
+    
+    def test_it_returns_fourth_quarter(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 10, 1), 
+            date_end = datetime.date(2019, 12, 31), 
+            expected_str = u'4. Quartal 2019')
+    
+    def test_it_returns_first_half_year(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 1, 1), 
+            date_end = datetime.date(2019, 6, 30), 
+            expected_str = u'1. Halbjahr 2019')
+
+    def test_it_returns_second_half_year(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 7, 1), 
+            date_end = datetime.date(2019, 12, 31), 
+            expected_str = u'2. Halbjahr 2019')
+    
+    def test_it_returns_date_start_if_date_end_is_none(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 7, 1), 
+            date_end = None, 
+            expected_str = u'ab 01.07.2019'
+        )
+    
+    def test_it_returns_date_end_if_date_start_is_none(self):
+        self._assert_output_string_equals(
+            date_start = None, 
+            date_end = datetime.date(2019, 7, 1), 
+            expected_str = u'bis 01.07.2019'
+        )
+
+    def test_it_returns_empty_string_if_date_start_and_end_are_none(self):
+        self._assert_output_string_equals(
+            date_start = None, 
+            date_end = None, 
+            expected_str = u''
+        )
+
+    def test_it_returns_date_start_if_date_end_is_empty(self):
+        self._assert_output_string_equals(
+            date_start = datetime.date(2019, 7, 1), 
+            date_end = '', 
+            expected_str = u'ab 01.07.2019'
+        )
+    
+    def test_it_returns_date_end_if_date_start_is_empty(self):
+        self._assert_output_string_equals(
+            date_start = '', 
+            date_end = datetime.date(2019, 7, 1), 
+            expected_str = u'bis 01.07.2019'
+        )
+
+    def test_it_returns_empty_string_if_date_start_and_end_are_empty(self):
+        self._assert_output_string_equals(
+            date_start = '', 
+            date_end = '', 
+            expected_str = u''
+        )
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/test_helper_pkg_dict.py b/ckanext/odsh/tests_tpsh/test_helper_pkg_dict.py
new file mode 100644
index 00000000..2b5af7be
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_helper_pkg_dict.py
@@ -0,0 +1,200 @@
+import datetime
+import nose.tools as nt
+from mock import patch, call
+
+from ckanext.odsh.helper_pkg_dict import HelperPgkDict
+import ckanext.odsh.helpers_tpsh as helpers_tpsh
+import ckanext.odsh.uri_store as uri_store
+
+class TestHelperPkgDict(object):
+    def test_is_collection_returns_true(self):
+        dataset_dict = {
+            u'type': u'collection',
+        }
+        h = HelperPgkDict(dataset_dict)
+        is_collection = h.is_collection()
+        nt.assert_true(is_collection)
+    
+    def test_is_collection_returns_false_if_no_type(self):
+        dataset_dict = {}
+        h = HelperPgkDict(dataset_dict)
+        is_collection = h.is_collection()
+        nt.assert_false(is_collection)
+    
+    def test_is_collection_returns_false_if_type_dataset(self):
+        dataset_dict = {u'type': u'dataset'}
+        h = HelperPgkDict(dataset_dict)
+        is_collection = h.is_collection()
+        nt.assert_false(is_collection)
+    
+    def test_shall_be_part_of_collection_returns_true_if_flag_add_to_collection_is_True(self):
+        dataset_dict = {'add_to_collection': True}
+        h = HelperPgkDict(dataset_dict)
+        shall_be_part_of_collection = h.shall_be_part_of_collection()
+        nt.assert_true(shall_be_part_of_collection)
+    
+    def test_shall_be_part_of_collection_returns_false_if_flag_add_to_collection_is_False(self):
+        dataset_dict = {'add_to_collection': False}
+        h = HelperPgkDict(dataset_dict)
+        shall_be_part_of_collection = h.shall_be_part_of_collection()
+        nt.assert_false(shall_be_part_of_collection)
+    
+    def test_shall_be_part_of_collection_returns_false_if_flag_add_to_collection_not_in_dict(self):
+        dataset_dict = {}
+        h = HelperPgkDict(dataset_dict)
+        shall_be_part_of_collection = h.shall_be_part_of_collection()
+        nt.assert_false(shall_be_part_of_collection)
+    
+    def test_update_relations_to_collection_members_leads_to_correct_call_of_add_to_collection(self):
+        with patch.object(helpers_tpsh, 'add_pkg_to_collection') as patch_add_package_to_collection:
+            # arange
+            # taken from debugging _update_relations_to_collection_members:
+            dataset_dict_collection = {
+                'id': u'248ceefd-2fb8-4a3c-ab3c-d2c873b24e4d',
+                u'extras': [
+                    {u'key': u'has_version', u'value': u'["http://transparenz.schleswig-holstein.de/9f9ae60bb0d8985e10e9ab8aa6a7ca34", "http://transparenz.schleswig-holstein.de/3a0d0674120fbf06b5cb8737124e3fd0", "http://transparenz.schleswig-holstein.de/b5cd3f303f594ecde96e1017e953b688", "http://transparenz.schleswig-holstein.de/ff612d0f165d46f3091f58e1ef56a2ec", "http://transparenz.schleswig-holstein.de/cd606b042789723a2b6d61cb31c46c39"]'},
+                ]
+            }
+            id_collection = u'248ceefd-2fb8-4a3c-ab3c-d2c873b24e4d'
+            uri_collection_member = 'http://transparenz.schleswig-holstein.de/b5cd3f303f594ecde96e1017e953b688'
+            id_collection_member = 'fake_id_collection_member'
+            uri_store._set_uri_to_id({uri_collection_member: id_collection_member})
+
+            # act
+            h = HelperPgkDict(dataset_dict_collection)
+            h.update_relations_to_collection_members()
+
+            # assert
+            calls = [call(id_collection_member,id_collection), ]
+            patch_add_package_to_collection.assert_has_calls(calls)
+
+            # teardown
+            uri_store._set_uri_to_id({})
+    
+    def test_update_relation_to_collection_leads_to_correct_call_of_add_to_collection(self):
+        with patch.object(helpers_tpsh, 'add_pkg_to_collection') as patch_add_package_to_collection:
+            # arange
+            # taken from debugging _update_relations_to_collection_members:
+            dataset_dict_collection_member = {
+                u'add_to_collection': True,
+                u'extras': [
+                    {u'key': u'is_version_of', u'value': u'["http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63"]'},
+                ],
+                'id': u'248ceefd-2fb8-4a3c-ab3c-d2c873b24e4d',
+            }
+            id_collection_member = u'248ceefd-2fb8-4a3c-ab3c-d2c873b24e4d'
+            uri_collection = 'http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63'
+            id_collection = 'fake_id_collection'
+            uri_store._set_uri_to_id({uri_collection: id_collection})
+
+            # act
+            h = HelperPgkDict(dataset_dict_collection_member)
+            h.update_relation_to_collection()
+
+            # assert
+            calls = [call(id_collection_member,id_collection), ]
+            patch_add_package_to_collection.assert_has_calls(calls)
+
+            # teardown
+            uri_store._set_uri_to_id({})
+    
+    def test_get_collection_uri(self):
+        dataset_dict_collection_member = {
+            u'add_to_collection': True,
+            u'extras': [
+                {u'key': u'is_version_of', u'value': u'["http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63"]'},
+            ],
+            'id': u'248ceefd-2fb8-4a3c-ab3c-d2c873b24e4d',
+        }
+        h = HelperPgkDict(dataset_dict_collection_member)
+        collection = h.get_collection_uri()
+        nt.assert_equal(collection, u'http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63')
+    
+    def test_get_collection_uri_if_not_in_extras(self):
+        dataset_dict_collection_member = {
+            u'id': u'248ceefd-2fb8-4a3c-ab3c-d2c873b24e4d',
+        }
+        h = HelperPgkDict(dataset_dict_collection_member)
+        collection = h.get_collection_uri()
+        nt.assert_equal(collection, None)
+    
+    def test_get_uris_collection_members(self):
+        collection_members_as_string = u'["http://transparenz.schleswig-holstein.de/cd606b042789723a2b6d61cb31c46c39", "http://transparenz.schleswig-holstein.de/3a0d0674120fbf06b5cb8737124e3fd0", "http://transparenz.schleswig-holstein.de/b5cd3f303f594ecde96e1017e953b688", "http://transparenz.schleswig-holstein.de/9f9ae60bb0d8985e10e9ab8aa6a7ca34", "http://transparenz.schleswig-holstein.de/ff612d0f165d46f3091f58e1ef56a2ec"]'
+        dataset_dict = {
+            u'extras': [
+                {u'key': u'has_version', u'value': collection_members_as_string},
+            ]
+        }
+        h = HelperPgkDict(dataset_dict)
+        uris = h.get_uris_collection_members()
+        nt.assert_equal(uris[0], 'http://transparenz.schleswig-holstein.de/cd606b042789723a2b6d61cb31c46c39')
+        nt.assert_equal(uris[1], 'http://transparenz.schleswig-holstein.de/3a0d0674120fbf06b5cb8737124e3fd0')
+        nt.assert_equal(uris[-1], 'http://transparenz.schleswig-holstein.de/ff612d0f165d46f3091f58e1ef56a2ec')
+
+
+
+class Test_get_date_start_and_end_from_pkg_dict(object):
+
+    def setUp(self):
+        self.dict_with_start_and_end_date = {
+            u'extras': [
+                {u'key': u'groups', u'value': u''}, 
+                {u'key': u'issued', u'value': u'2019-07-06T00:00:00'}, 
+                {u'key': u'licenseAttributionByText', u'value': u''}, 
+                {u'key': u'subject_text', u'value': u''}, 
+                {u'key': u'temporal_end', u'value': u'2019-08-31T00:00:00'}, 
+                {u'key': u'temporal_start', u'value': u'2019-08-01T00:00:00'}
+            ],
+        }
+        self.dict_with_empty_start_date = {
+            u'extras': [
+                {u'key': u'groups', u'value': u''}, 
+                {u'key': u'issued', u'value': u'2019-07-06T00:00:00'}, 
+                {u'key': u'licenseAttributionByText', u'value': u''}, 
+                {u'key': u'subject_text', u'value': u''}, 
+                {u'key': u'temporal_end', u'value': u'2019-08-31T00:00:00'}, 
+                {u'key': u'temporal_start', u'value': u''}
+            ],
+        }
+        self.dict_with_empty_end_date = {
+            u'extras': [
+                {u'key': u'groups', u'value': u''}, 
+                {u'key': u'issued', u'value': u'2019-07-06T00:00:00'}, 
+                {u'key': u'licenseAttributionByText', u'value': u''}, 
+                {u'key': u'subject_text', u'value': u''}, 
+                {u'key': u'temporal_end', u'value': u''}, 
+                {u'key': u'temporal_start', u'value': u'2019-08-01T00:00:00'}
+            ],
+        }
+        self.date_start_expected = datetime.date(2019, 8, 1)
+        self.date_end_expected = datetime.date(2019, 8, 31)
+
+    def test_it_returns_correct_start_date(self):
+        h = HelperPgkDict(self.dict_with_start_and_end_date)
+        date_start, _ = h._get_date_start_and_end_from_pkg_dict()
+        nt.assert_equal(date_start, self.date_start_expected)
+    
+    def test_it_returns_correct_end_date(self):
+        h = HelperPgkDict(self.dict_with_start_and_end_date)
+        _, date_end = h._get_date_start_and_end_from_pkg_dict()
+        nt.assert_equal(date_end, self.date_end_expected)
+    
+    def test_it_return_none_if_date_start_empty(self):
+        h = HelperPgkDict(self.dict_with_empty_start_date)
+        date_start, _ = h._get_date_start_and_end_from_pkg_dict()
+        nt.assert_equal(date_start, None)
+    
+    def test_it_return_none_if_date_end_empty(self):
+        h = HelperPgkDict(self.dict_with_empty_end_date)
+        _, date_end = h._get_date_start_and_end_from_pkg_dict()
+        nt.assert_equal(date_end, None)
+    
+    def test_it_returns_date_start_if_date_end_empty(self):
+        h = HelperPgkDict(self.dict_with_empty_end_date)
+        date_start, _ = h._get_date_start_and_end_from_pkg_dict()
+        nt.assert_equal(date_start, self.date_start_expected)
+    
+    def test_it_returns_date_end_if_date_start_empty(self):
+        h = HelperPgkDict(self.dict_with_empty_start_date)
+        _, date_end = h._get_date_start_and_end_from_pkg_dict()
+        nt.assert_equal(date_end, self.date_end_expected)    
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/test_helpers_tpsh.py b/ckanext/odsh/tests_tpsh/test_helpers_tpsh.py
new file mode 100644
index 00000000..78c10608
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_helpers_tpsh.py
@@ -0,0 +1,281 @@
+# encoding: utf-8
+
+import os
+from collections import namedtuple, OrderedDict
+import datetime
+import nose.tools as nt
+from mock import patch
+from ckan.common import config
+import ckan.logic.action.create as create
+from ckanext.odsh.tests_tpsh.resources import org_dicts
+
+
+from ckanext.odsh.helpers_tpsh import (
+    map_dct_type_to_ckan_type,
+    map_ckan_type_to_dct_type,
+    add_pkg_to_collection,
+    correct_missing_relationship,
+    get_language_of_package,
+    get_address_org,
+    load_json_to_ordered_dict,
+    load_subject_mapping,
+    get_subject_for_selection
+)
+
+
+class TestMatchDctTypeToCkanType(object):
+    
+    def test_it_returns_collection(self):
+        dct_type = 'http://dcat-ap.de/def/datasetTypes/collection'
+        ckan_type = map_dct_type_to_ckan_type(dct_type)
+        expected_ckan_type = 'collection'
+        nt.assert_equal(ckan_type, expected_ckan_type)
+    
+    def test_it_returns_none_for_unknown_type(self):
+        nt.assert_equal(
+            map_dct_type_to_ckan_type('some unknown type'), 
+            None
+        )
+
+
+class TestMatchCkanTypeToDctType(object):
+    
+    def test_it_returns_url_for_collection(self):
+        ckan_type = 'collection'
+        dct_type = map_ckan_type_to_dct_type(ckan_type)
+        expected_dct_type = 'http://dcat-ap.de/def/datasetTypes/collection'
+        nt.assert_equal(
+            dct_type, expected_dct_type
+        )
+
+
+FakePackageRelationship = namedtuple(
+    'FakePackageRelationship',
+    '''
+    object_package_id
+    revision_id
+    subject_package_id
+    id
+    type
+    '''
+)
+
+class Test_correct_missing_relationship(object):
+    def setUp(self):
+        self.relationships_from_model = [
+            FakePackageRelationship(
+                object_package_id=u'object package id',
+                revision_id=u'revision id',
+                subject_package_id=u'subject package id',
+                id=u'id',
+                type=u'type'
+            )
+        ]
+
+    def test_it_does_not_modify_pkg_dict_if_no_model_relationships(self):
+        relationships_from_model = []
+        original_pkg_dict = {'id': 'some_id'}
+        pkg_dict = dict(original_pkg_dict)
+        correct_missing_relationship(
+            pkg_dict, relationships_from_model
+        )
+        nt.assert_equal(pkg_dict, original_pkg_dict)
+    
+    def test_it_does_not_modify_pkg_dict_if_relationships_already_in_dict(self):
+        original_pkg_dict = {
+            u'type': u'dataset',
+            u'relationships_as_subject': [
+                {
+                    u'__extras': {
+                        u'object_package_id': u'original object package id', 
+                        u'revision_id': u'original revision id', 
+                        u'subject_package_id': u'original subject package id'
+                    }, 
+                    u'comment': u'', 
+                    u'id': u'original id', 
+                    u'type': u'original type'
+                }
+            ]
+        }
+        pkg_dict = dict(original_pkg_dict)
+        correct_missing_relationship(
+            pkg_dict, self.relationships_from_model
+        )
+        nt.assert_equal(pkg_dict, original_pkg_dict)
+    
+    def test_it_does_not_modify_pkg_dict_if_type_collection(self):
+        original_pkg_dict = {
+            u'type': u'collection',
+            u'relationships_as_subject': [
+                {
+                    u'__extras': {
+                        u'object_package_id': u'original object package id', 
+                        u'revision_id': u'original revision id', 
+                        u'subject_package_id': u'original subject package id'
+                    }, 
+                    u'comment': u'', 
+                    u'id': u'original id', 
+                    u'type': u'original type'
+                }
+            ]
+        }
+        pkg_dict = dict(original_pkg_dict)
+        correct_missing_relationship(
+            pkg_dict, self.relationships_from_model
+        )
+        nt.assert_equal(pkg_dict, original_pkg_dict)
+    
+    def test_it_adds_relationships_if_not_already_in_dict(self):
+        pkg_dict = {
+            u'type': u'dataset',
+            u'relationships_as_subject': []
+        }
+        correct_missing_relationship(
+            pkg_dict, self.relationships_from_model
+        )
+        expected_pkg_dict = {
+            u'type': u'dataset',
+            u'relationships_as_subject': [
+                {
+                    u'__extras': {
+                        u'object_package_id': u'object package id', 
+                        u'revision_id': u'revision id', 
+                        u'subject_package_id': u'subject package id'
+                    }, 
+                    u'comment': u'', 
+                    u'id': u'id', 
+                    u'type': u'type'
+                }
+            ]
+        }
+
+        from_relationships = lambda d, key: d.get('relationships_as_subject')[0].get(key)
+        from_extras = lambda d, key: d.get('relationships_as_subject')[0].get('__extras').get(key)
+        
+        # assert
+        nt.assert_equal(pkg_dict.get('type'), 'dataset')
+        
+        for key in ('id', 'type'):
+            nt.assert_true(from_relationships(pkg_dict, key) is not None)
+            nt.assert_equal(
+                from_relationships(pkg_dict, key), 
+                from_relationships(expected_pkg_dict, key)
+            )
+
+        for key in ('object_package_id', 'revision_id', 'subject_package_id'):
+            nt.assert_true(
+                pkg_dict is not None)
+            nt.assert_equal(
+                from_extras(pkg_dict, key),
+                from_extras(expected_pkg_dict, key)
+            )
+
+    
+class Test_get_language_of_package(object):
+    def setUp(self):
+        config.update({'ckanext.odsh.language_mapping': '/usr/lib/ckan/default/src/ckanext-odsh/language_mapping.json'})
+    
+    def tearDown(self):
+        config.clear()
+
+    def test_it_returns_Englisch(self):
+        test_package = {
+                'id': u'language_test',
+                u'extras': [
+                    {u'key': u'language', u'value': u'http://publications.europa.eu/resource/authority/language/ENG'},
+                ]
+            }
+        nt.assert_equal(get_language_of_package(test_package),'Englisch')
+    
+    def test_it_returns_None_if_language_id_not_in_dict(self):
+        test_package = {
+                'id': u'language_test',
+                u'extras': [
+                    {u'key': u'language', u'value': u'tlhIngan Hol'},
+                ]
+            }
+        nt.assert_equal(get_language_of_package(test_package), None)
+    
+    def test_it_returns_None_if_language_not_in_pkg_dict(self):
+        test_package = {}
+        nt.assert_equal(get_language_of_package(test_package), None)
+    
+
+class Test_get_address_org(object):
+    def test_it_returns_address_for_org_with_address(self):
+        organization = org_dicts.organization_with_address
+        address = get_address_org(organization)
+        nt.assert_equal(address.get('location'), u'Müllerdorf')
+        nt.assert_equal(address.get('person'), u'Michael Müller')
+        nt.assert_equal(address.get('mail'), u'mueller@mueller.de')
+        nt.assert_equal(address.get('street'), u'Müllergasse 10')
+        nt.assert_equal(address.get('telephone'), u'040 123456')
+        nt.assert_equal(address.get('web'), u'http://mueller.de')
+
+    def test_it_returns_empty_dict_if_called_via_organization_new(self):
+        organization = dict()
+        address = get_address_org(organization)
+        assert type(address) is dict
+        nt.assert_equal(len(address), 0)
+
+
+def _add_subject_mapping_file_to_config():
+    path_current_file = os.path.dirname(os.path.abspath(__file__))
+    path_to_subject_mapping_file = path_current_file + '/resources/subject_mapping_for_tests.json'
+    config.update({'ckanext.odsh.subject_mapping': path_to_subject_mapping_file})
+
+class Test_load_json_to_ordered_dict(object):
+    def setUp(self):
+        json_str = '{"A": 1, "B": 2, "D": 3, "C":4, "E": 0}'
+        self.result = load_json_to_ordered_dict(json_str)
+    
+    def test_it_does_not_crash(self):
+        pass
+
+    def test_it_returns_ordered_dict(self):
+        nt.assert_is(type(self.result), OrderedDict)
+    
+    def test_it_preserves_order_of_keys(self):
+        keys = self.result.keys()
+        nt.assert_equal(keys, [u'A', u'B', u'D', u'C', u'E'])
+    
+    def test_it_preserves_order_of_values(self):
+        values = self.result.values()
+        nt.assert_equal(values, [1, 2, 3, 4, 0])
+
+class Test_load_subject_mapping(object):
+    def setUp(self):
+        _add_subject_mapping_file_to_config()
+        self.SUBJECT_MAPPING = load_subject_mapping()
+    
+    def tearDown(self):
+        config.clear()
+    
+    def test_it_returns_an_ordered_dictionary(self):
+        nt.assert_is(type(self.SUBJECT_MAPPING), OrderedDict)
+    
+    def test_it_preserves_order_of_json_file(self):
+        keys = self.SUBJECT_MAPPING.keys()
+        nt.assert_equal(keys[0], u'http://transparenz.schleswig-holstein.de/informationsgegenstand#Verwaltungsvorschrift')
+        nt.assert_equal(keys[1], u'http://transparenz.schleswig-holstein.de/informationsgegenstand#Organisationsplan')
+        nt.assert_equal(keys[2], u'http://transparenz.schleswig-holstein.de/informationsgegenstand#Geschaeftsverteilungsplan')
+        nt.assert_equal(keys[3], u'http://transparenz.schleswig-holstein.de/informationsgegenstand#Aktenplan')
+
+class Test_get_subject_for_selection(object):
+    def setUp(self):
+        _add_subject_mapping_file_to_config()
+        self.result = get_subject_for_selection()
+    
+    def tearDown(self):
+        config.clear()
+
+    def test_it_returns_a_list(self):
+        assert type(self.result) is list
+    
+    def test_first_element_is_empty(self):
+        nt.assert_equal(self.result[0], {'key': 'empty', 'value': ' '})
+    
+    def test_it_contains_more_than_one_element(self):
+        nt.assert_greater(len(self.result), 1)
+
+        
diff --git a/ckanext/odsh/tests_tpsh/test_icap.py b/ckanext/odsh/tests_tpsh/test_icap.py
new file mode 100644
index 00000000..f97bbc74
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_icap.py
@@ -0,0 +1,67 @@
+import nose.tools as nt
+from testfixtures import log_capture
+
+from ckan.common import config
+from ckanext.odsh.lib.odsh_icap_client import ODSHICAPRequest, _read_from_config
+
+class Test_ODSHICAPRequest(object):
+    def setUp(self):
+        config.update({
+            'ckanext.odsh.icap.host': 'some_host',
+            'ckanext.odsh.icap.port': '123',
+            'ckanext.odsh.icap.clientip': 'some_ip',
+        })
+    
+    def tearDown(self):
+        config.clear()
+
+    def test_it_initializes_with_parameters_set_in_config(self):
+        request = ODSHICAPRequest('some_filename', 'some_filebuffer')
+        nt.assert_equal(request.HOST, 'some_host')
+        nt.assert_equal(request.PORT, 123)
+        nt.assert_equal(request.CLIENTIP, 'some_ip')
+    
+    @log_capture()
+    def test_it_logs_missing_parameter_host_to_error_log(self, capture):
+        del config['ckanext.odsh.icap.host']
+        ODSHICAPRequest('some_filename', 'some_filebuffer')
+        capture.check((
+            'ckanext.odsh.lib.odsh_icap_client',
+            'ERROR',
+            "'key ckanext.odsh.icap.host is not defined in ckan config file.'"
+        ))
+    
+    @log_capture()
+    def test_it_logs_missing_parameter_port_to_error_log(self, capture):
+        del config['ckanext.odsh.icap.port']
+        ODSHICAPRequest('some_filename', 'some_filebuffer')
+        capture.check((
+            'ckanext.odsh.lib.odsh_icap_client',
+            'ERROR',
+            "'key ckanext.odsh.icap.port is not defined in ckan config file.'"
+        ))
+    
+    @log_capture()
+    def test_it_logs_missing_parameter_clientip_to_error_log(self, capture):
+        del config['ckanext.odsh.icap.clientip']
+        ODSHICAPRequest('some_filename', 'some_filebuffer')
+        capture.check((
+            'ckanext.odsh.lib.odsh_icap_client',
+            'ERROR',
+            "'key ckanext.odsh.icap.clientip is not defined in ckan config file.'"
+        ))
+    
+    def test_read_from_config_raises_KeyError_if_host_not_defined_in_config(self):
+        del config['ckanext.odsh.icap.host']
+        with nt.assert_raises(KeyError):
+            _read_from_config('ckanext.odsh.icap.host')
+    
+    def test_read_from_config_raises_KeyError_if_port_not_defined_in_config(self):
+        del config['ckanext.odsh.icap.port']
+        with nt.assert_raises(KeyError):
+            _read_from_config('ckanext.odsh.icap.port')
+    
+    def test_read_from_config_raises_KeyError_if_clientip_not_defined_in_config(self):
+        del config['ckanext.odsh.icap.clientip']
+        with nt.assert_raises(KeyError):
+            _read_from_config('ckanext.odsh.icap.clientip')
diff --git a/ckanext/odsh/tests_tpsh/test_matomo.py b/ckanext/odsh/tests_tpsh/test_matomo.py
new file mode 100644
index 00000000..0c20d685
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_matomo.py
@@ -0,0 +1,53 @@
+import nose.tools as nt
+from mock import patch
+from ckan.common import config
+
+from ckanext.odsh.plugin import OdshPlugin
+import ckanext.odsh.helpers_tpsh as helpers_tpsh
+import ckanext.odsh.matomo as matomo
+
+class Test_helper_odsh_use_matomo(object):
+    def setUp(self):
+        self.plugin = OdshPlugin()
+    
+    def test_use_matomo_returns_False_if_not_in_config(self):
+        use_matomo = self.plugin.get_helpers()['odsh_use_matomo']()
+        nt.assert_false(use_matomo)
+    
+    def test_use_matomo_returns_False_if_set_False_in_config(self):
+        config.update({'ckanext.odsh.use_matomo': 'False'})
+        use_matomo = self.plugin.get_helpers()['odsh_use_matomo']()
+        nt.assert_false(use_matomo)
+        config.clear()
+    
+    def test_use_matomo_returns_True_if_set_True_in_config(self):
+        config.update({'ckanext.odsh.use_matomo': 'True'})
+        use_matomo = self.plugin.get_helpers()['odsh_use_matomo']()
+        nt.assert_true(use_matomo)
+        config.clear()
+    
+
+class Test_decorator_do_if_use_matomo(object):
+    def test_it_does_not_if_use_matomo_set_False_in_config(self):
+        
+        @matomo.do_if_use_matomo
+        def set_to_true(_):
+            return True
+        
+        config.update({'ckanext.odsh.use_matomo': 'False'})
+        did_run = False
+        did_run = set_to_true(did_run)
+        nt.assert_false(did_run)
+        config.clear()
+    
+    def test_it_does_if_use_matomo_set_True_in_config(self):
+        
+        @matomo.do_if_use_matomo
+        def set_to_true(_):
+            return True
+
+        config.update({'ckanext.odsh.use_matomo': 'True'})
+        did_run = False
+        did_run = set_to_true(did_run)
+        nt.assert_true(did_run)
+        config.clear()
diff --git a/ckanext/odsh/tests_tpsh/test_odsh_helpers.py b/ckanext/odsh/tests_tpsh/test_odsh_helpers.py
new file mode 100644
index 00000000..a4c48823
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_odsh_helpers.py
@@ -0,0 +1,161 @@
+import datetime
+import nose.tools as nt
+from mock import patch
+
+import ckan.lib.helpers as helpers
+
+import ckanext.odsh.helpers as odsh_helpers
+from ckanext.odsh.helpers import is_within_last_month
+import ckanext.odsh.collection.helpers as helpers_collection
+import ckan.model as model
+
+
+class Test_tpsh_get_successor_and_predecessor_dataset(object):
+    
+    def setUp(self):
+        
+        # construct datasets that shall be in following order:
+        # name      date
+        # public2   2014-07-01
+        # public3   2014-07-01
+        # public4   2014-07-02
+        # public1   2014-07-03
+
+        self.names_collection_members = [
+            u'public3', u'public2', u'public1', u'public4', 
+            u'private3', u'private2', u'private1']
+        self.dates_collection_members = [
+            u'2014-07-01T00:00:00', #public3
+            u'2014-07-01T00:00:00', #public2
+            u'2014-07-03T00:00:00', #public1
+            u'2014-07-02T00:00:00', #public4
+            u'2014-07-05T00:00:00', #private3
+            u'2014-07-06T00:00:00', #private2
+            u'2014-07-07T00:00:00', #private1
+        ]
+        self.pkg_dicts_collection_members = [
+            {
+                u'name': name,
+                u'extras': {u'issued': date}
+            }
+            for (name, date) in zip(self.names_collection_members, self.dates_collection_members)
+        ]
+
+        def fake_access_checker(access_type, pkg_dict):
+            pkg_name = pkg_dict.get('name')
+            if 'public' in pkg_name:
+                return True
+            return False
+        
+        def fake_get_package_dict(name):
+            package_list = filter(lambda pkg_dict:pkg_dict.get('name')==name, self.pkg_dicts_collection_members)
+            return package_list[0]
+
+        self.patch_get_datasets_belonging_to_collection_by_dataset = patch.object(
+            helpers_collection,
+            'get_all_datasets_belonging_to_collection_by_dataset',
+            return_value = self.names_collection_members)
+        self.patch_get_datasets_belonging_to_collection_by_dataset.start()
+
+        self.patch_check_access = patch.object(
+            helpers,
+            'check_access',
+            new=fake_access_checker, 
+        )
+        self.patch_check_access.start()
+
+        self.patch_get_package_dict = patch.object(
+            helpers_collection,
+            'get_package_dict',
+            new=fake_get_package_dict,
+        )
+        self.patch_get_package_dict.start()
+    
+    def tearDown(self):
+        self.patch_get_datasets_belonging_to_collection_by_dataset.stop()
+        self.patch_check_access.stop()
+        self.patch_get_package_dict.stop()
+
+    def test_patch_get_datasets_belonging_to_collection_by_dataset(self):
+        return_value = helpers_collection.get_all_datasets_belonging_to_collection_by_dataset()
+        nt.assert_equal(return_value, self.names_collection_members)
+    
+    def test_patch_access_checker_returns_True(self):
+        pkg_dict = {u'name': u'public1'}
+        has_access = helpers.check_access('package_show', pkg_dict)
+        nt.assert_true(has_access)
+    
+    def test_patch_access_checker_returns_False(self):
+        pkg_dict = {u'name': u'private1'}
+        has_access = helpers.check_access('package_show', pkg_dict)
+        nt.assert_false(has_access)
+    
+    def test_patch_package_get(self):
+        pkg_dict = helpers_collection.get_package_dict('public1')
+        nt.assert_equal(pkg_dict.get('name'), 'public1')
+    
+    def test_it_returns_correct_for_public2(self):
+        pkg_dict = {u'name': u'public2'}
+        successor, predecessor = helpers_collection.get_successor_and_predecessor_dataset(pkg_dict)
+        nt.assert_equal(successor, 'public3')
+        nt.assert_equal(predecessor, None)
+    
+    def test_it_returns_correct_for_public3(self):
+        pkg_dict = {u'name': u'public3'}
+        successor, predecessor = helpers_collection.get_successor_and_predecessor_dataset(pkg_dict)
+        nt.assert_equal(successor, 'public4')
+        nt.assert_equal(predecessor, 'public2')
+
+    def test_it_returns_correct_for_public4(self):
+        pkg_dict = {u'name': u'public4'}
+        successor, predecessor = helpers_collection.get_successor_and_predecessor_dataset(pkg_dict)
+        nt.assert_equal(successor, 'public1')
+        nt.assert_equal(predecessor, 'public3')
+
+    def test_it_returns_correct_for_public1(self):
+        pkg_dict = {u'name': u'public1'}
+        successor, predecessor = helpers_collection.get_successor_and_predecessor_dataset(pkg_dict)
+        nt.assert_equal(successor, None)
+        nt.assert_equal(predecessor, 'public4')
+    
+    def test_it_returns_None_if_no_siblings(self):
+        with patch.object(
+            helpers_collection,
+            'get_all_datasets_belonging_to_collection_by_dataset',
+            return_value = list()
+        ):
+            pkg_dict = {u'name': u'some_name'}
+            successor, predecessor = helpers_collection.get_successor_and_predecessor_dataset(pkg_dict)
+            nt.assert_equal(successor, None)
+            nt.assert_equal(predecessor, None)
+
+
+class Test_is_within_last_month(object):
+    def test_it_returns_true_for_simple_query(self):
+        date = datetime.date(2019, 4, 15)
+        date_ref = datetime.date(2019, 4, 29)
+        assert is_within_last_month(date, date_ref)
+    
+    def test_it_uses_today_if_date_ref_missing(self):
+        date = datetime.date.today() - datetime.timedelta(days=20)
+        assert is_within_last_month(date)
+    
+    def test_it_returns_true_for_dates_in_different_years(self):
+        date = datetime.date(2018, 12, 16)
+        date_ref = datetime.date(2019, 1, 15)
+        assert is_within_last_month(date, date_ref)
+    
+    def test_it_returns_false_for_dates_in_different_years(self):
+        date = datetime.date(2018, 12, 15)
+        date_ref = datetime.date(2019, 1, 15)
+        assert is_within_last_month(date, date_ref)==False
+    
+    def test_it_returns_true_for_dates_in_differen_months(self):
+        date = datetime.date(2018, 6, 16)
+        date_ref = datetime.date(2018, 7, 10)
+        assert is_within_last_month(date, date_ref)
+    
+    def test_it_return_false_for_date_in_different_months(self):
+        date = datetime.date(2018, 6, 8)
+        date_ref = datetime.date(2018, 7, 10)
+        assert is_within_last_month(date, date_ref)==False
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/test_password_validation.py b/ckanext/odsh/tests_tpsh/test_password_validation.py
new file mode 100644
index 00000000..c999b397
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_password_validation.py
@@ -0,0 +1,35 @@
+# encoding: utf-8
+
+import nose.tools as nt
+from ckanext.odsh.logic.action import check_password
+
+class Test_PasswordValidation(object):
+
+    @staticmethod
+    def assert_password_invalid(password):
+        assert not check_password(password)
+    
+    @staticmethod
+    def assert_password_valid(password):
+        assert check_password(password)
+    
+    def test_valid_password(self):
+        self.assert_password_valid('Passwort1 :) :P :D')
+    
+    def test_umlaute(self):
+        self.assert_password_valid('Pässword')
+    
+    def test_no_uppercase(self):
+        self.assert_password_invalid('passwort1')
+    
+    def test_no_lowercase(self):
+        self.assert_password_invalid('PASSWORT1')
+    
+    def test_no_letters(self):
+        self.assert_password_invalid('37459073245!!?===))/=$§äüöÄÜÖ')
+    
+    def test_only_letters(self):
+        self.assert_password_invalid('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
+    
+    def test_to_short(self):
+        self.assert_password_invalid('Pw123')
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/test_plugin.py b/ckanext/odsh/tests_tpsh/test_plugin.py
new file mode 100644
index 00000000..e5084a45
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_plugin.py
@@ -0,0 +1,52 @@
+import datetime
+
+import ckanext.odsh.plugin as plugin
+
+class TestMethodBeforeView(object):
+    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(
+            {
+                u'extras': [
+                    {u'key': 'issued', u'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(
+            {
+                u'extras': [
+                    {u'key': 'issued', u'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(
+            {
+                u'extras': [
+                    {u'key': 'issued', u'value': ten_days_ago_as_ckan_str}
+                ],
+                'some_other_key': 'some_other_value', 
+            }
+        )
+        assert dict_for_template['some_other_key']=='some_other_value'
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/test_profiles.py b/ckanext/odsh/tests_tpsh/test_profiles.py
new file mode 100644
index 00000000..0d6e859b
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_profiles.py
@@ -0,0 +1,184 @@
+import nose.tools as nt
+import rdflib
+from rdflib import Graph
+from mock import patch
+
+from ckanext.dcat.profiles import URIRefOrLiteral
+
+import ckanext.odsh.profiles as profiles
+import ckanext.odsh.helper_pkg_dict as helper_pkg_dict
+
+DCT = rdflib.namespace.Namespace("http://purl.org/dc/terms/")
+
+
+class TestODSHDCATdeProfileParseDatasetWithCollection(object):
+    '''
+    Tests for ODSHDCATdeProfile.parse_dataset with an rdf file 
+    containing a collection
+    '''
+    def setUp(self):
+        rdf_graph = Graph()
+        rdf_graph.parse('ckanext/odsh/tests_tpsh/resources/collection1.rdf')
+        self.profile = profiles.ODSHDCATdeProfile(rdf_graph)
+        self.dataset_ref_with_collection = URIRefOrLiteral(
+            'http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte'
+        )
+        self.dataset_ref_with_collection_member = URIRefOrLiteral(
+            'http://opendata.schleswig-holstein.de/dataset/LAsDSH_SER_Statistik_anerkannte_Versorgungsberechtigte_Monat_201704'
+        )
+        self.dataset_ref_with_member_not_in_collection = URIRefOrLiteral(
+            'http://opendata.schleswig-holstein.de/dataset/Test_nicht_in_Collection'
+        )
+    
+    def test_parse_dataset_adds_type_collection_to_dataset_dict(self):
+        dataset_dict = {}
+        self.profile.parse_dataset(dataset_dict, self.dataset_ref_with_collection)
+        nt.assert_equal('collection', dataset_dict['type'])
+    
+    def test_parse_dataset_adds_flag_for_collection_member(self):
+        dataset_dict = {}
+        self.profile.parse_dataset(dataset_dict, self.dataset_ref_with_collection_member)
+        nt.assert_equal(True, dataset_dict.get('add_to_collection'))
+    
+    def test_parse_type_adds_type_collection_to_dataset_dict(self):
+        dataset_dict = {}
+        self.profile._parse_type(dataset_dict, self.dataset_ref_with_collection)
+        nt.assert_equal('collection', dataset_dict['type'])
+
+    def test_parse_type_does_not_add_collection_to_dataset_dict(self):
+        dataset_dict = {}
+        self.profile._parse_type(dataset_dict, self.dataset_ref_with_collection_member)
+        nt.assert_not_in('type', dataset_dict)
+
+    def test_belongs_to_collection_returns_true(self):
+        dataset_dict = {}
+        assert self.profile._belongs_to_collection(dataset_dict, self.dataset_ref_with_collection_member)
+
+    def test_belongs_to_collection_returns_false(self):
+        dataset_dict = {}
+        belongs_to_collection = self.profile._belongs_to_collection(
+            dataset_dict, self.dataset_ref_with_member_not_in_collection)
+        nt.assert_false(belongs_to_collection)
+    
+
+class TestODSHDCATdeProfileParseDatasetWithSubject(object):
+    '''
+    Tests for ODSHDCATdeProfile.parse_dataset with an rdf file 
+    containing datasets with subjects
+    '''
+    def setUp(self):
+        rdf_graph = Graph()
+        rdf_graph.parse('ckanext/odsh/tests_tpsh/resources/transparenz.rdf')
+        self.profile = profiles.ODSHDCATdeProfile(rdf_graph)
+        self.dataset_ref_with_subject = URIRefOrLiteral(
+            'http://transparenz.schleswig-holstein.de/ae2a3cffda84388365bc87711ed4af47'
+        )
+
+    def test_parse_subject_returns_subject(self):
+        dataset_dict = {}
+        self.profile._parse_subject(dataset_dict, self.dataset_ref_with_subject)
+        nt.assert_equal('http://d-nb.info/gnd/4128022-2', dataset_dict['subject'])
+    
+    def test_parse_dataset_returns_subject(self):
+        dataset_dict = {}
+        self.profile.parse_dataset(dataset_dict, self.dataset_ref_with_subject)
+        nt.assert_equal('http://d-nb.info/gnd/4128022-2', dataset_dict['subject'])
+
+
+class TestODSHDCATdeProfileGraphFromDataset(object):
+    '''
+    Tests for ODSHDCATdeProfile.graph_from_dataset
+    '''
+    def setUp(self):
+        rdf_graph = Graph()
+        self.profile = profiles.ODSHDCATdeProfile(rdf_graph)
+        self.dummy_dataset_ref = URIRefOrLiteral('http://some_ref')
+    
+    def get_graph_and_assert_in(self, dataset_dict, dataset_ref, expected_node):
+        self.profile.graph_from_dataset(dataset_dict, dataset_ref)
+        graph_serialized = self.profile.g.serialize()
+        print(self.profile.g.serialize(format='pretty-xml'))
+        nt.assert_in(expected_node, graph_serialized)
+    
+    
+    patch_collection_member = patch.object(
+        profiles.ODSHDCATdeProfile, 
+        '_dataset_belongs_to_collection', 
+        return_value=True
+    )
+    
+    patch_no_collection_member = patch.object(
+        profiles.ODSHDCATdeProfile, 
+        '_dataset_belongs_to_collection', 
+        return_value=False
+    )
+
+    
+    @patch_no_collection_member
+    def test_it_adds_dct_subject(self, __):
+        dataset_dict = {
+            'subject': 'http://some_subject',
+            'type': 'dataset',
+            'groups': [],
+        }        
+        expected_node = '<dct:subject rdf:resource="http://some_subject"/>'
+        self.get_graph_and_assert_in(dataset_dict, self.dummy_dataset_ref, expected_node)
+    
+    
+    @patch_no_collection_member
+    def test_it_adds_dct_type_collection(self, __):
+        dataset_dict = {
+            'groups': [],
+            'type': 'collection',
+        }
+        expected_node = (
+            '<dct:type rdf:resource="http://dcat-ap.de/def/datasetTypes/collection"/>'
+        )
+        with patch.object(
+            profiles.ODSHDCATdeProfile, 
+            '_get_dataset_refs_belonging_to_collection', 
+            return_value=[]
+        ):
+            self.get_graph_and_assert_in(dataset_dict, self.dummy_dataset_ref, expected_node)
+    
+    
+    @patch_no_collection_member
+    def test_it_adds_members_of_collection(self, __):
+        '''
+        tests if rdf export of a collection  contains the members of that collection.
+        The members are read from the package relationships.
+        '''
+        dataset_dict = {
+            'groups': [],
+            'type': 'collection',
+        }
+        expected_nodes = (
+            '<dct:hasVersion rdf:resource="http://id_1"/>',
+            '<dct:hasVersion rdf:resource="http://id_2"/>',
+        )
+        # mock get_dataset_refs_belonging_to_collection(context, collection_name)
+        dataset_refs_belonging_to_collection = ['http://id_1', 'http://id_2']
+        with patch.object(
+            profiles.ODSHDCATdeProfile, 
+            '_get_dataset_refs_belonging_to_collection', 
+            return_value=dataset_refs_belonging_to_collection
+        ):
+            for expected_node in expected_nodes:
+                self.get_graph_and_assert_in(dataset_dict, self.dummy_dataset_ref, expected_node)
+    
+    def test_remove_predefined_collection_members(self):
+        rdf_graph = Graph()
+        self.profile = profiles.ODSHDCATdeProfile(rdf_graph)
+        dummy_ref = rdflib.URIRef('http://transparenz.schleswig-holstein.de/5ffd27c528f7ab6936318da90d5cdd63')
+        refs = (
+            'http://transparenz.schleswig-holstein.de/9bbeaf7b503dbd2c667786db08c4512d',
+            'http://transparenz.schleswig-holstein.de/f6de9c145fe28effe99fc163b92d657e'
+        )
+        for ref in refs:
+            self.profile.g.add(
+                (dummy_ref, DCT.hasVersion, rdflib.URIRef(ref))
+            )
+        self.profile._remove_predefined_collection_members()
+        graph_serialized = self.profile.g.serialize()
+        for ref in refs:
+            nt.assert_not_in(ref, graph_serialized)
\ No newline at end of file
diff --git a/ckanext/odsh/tests_tpsh/test_search.py b/ckanext/odsh/tests_tpsh/test_search.py
new file mode 100644
index 00000000..8e5008f9
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_search.py
@@ -0,0 +1,133 @@
+import nose.tools as nt
+import ckanext.odsh.search as search
+
+class Test_before_search(object):
+    def setUp(self):
+        self.search_params_before_test = {
+            'extras': {}, 
+            'facet.field': ['organization', 'subject_text', 'groups'], 
+            'fq': u'organization:"test-organisation" groups:"gove" subject_text:"T\xe4tigkeitsbericht" +dataset_type:dataset', 
+            'include_private': True, 
+            'q': u'', 
+            'rows': 20, 
+            'sort': u'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()
+        nt.assert_equal(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': u'2019-08-01', 'ext_startdate': u'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': (
+                u'organization:"test-organisation" groups:"gove" subject_text:"T\xe4tigkeitsbericht" '
+                u'+dataset_type:dataset (+extras_temporal_start:[2019-08-02T00:00:00Z TO 2019-08-01T00:00:00Z] '
+                u'OR +extras_temporal_end:[2019-08-02T00:00:00Z TO 2019-08-01T00:00:00Z]  OR '
+                u'((*:* NOT extras_temporal_end:[* TO *]) AND extras_temporal_start:[* TO 2019-08-01T00:00:00Z]))'
+            )
+        })
+        # act
+        search.before_search(search_params)
+        # assert
+        nt.assert_equal(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': u'some_date', 'ext_startdate': u'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
+        nt.assert_equal(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': u'2019-08-02', 'ext_startdate': u'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': (
+                u'organization:"test-organisation" groups:"gove" '
+                u'subject_text:"T\xe4tigkeitsbericht" +dataset_type:dataset '
+                u'(+extras_temporal_start:[2019-08-01T00:00:00Z TO 2019-08-02T00:00:00Z] '
+                u'OR +extras_temporal_end:[2019-08-01T00:00:00Z TO 2019-08-02T00:00:00Z]  '
+                u'OR (extras_temporal_start:[* TO 2019-08-01T00:00:00Z] AND '
+                u'extras_temporal_end:[2019-08-02T00:00:00Z TO *]) OR '
+                u'((*:* NOT extras_temporal_end:[* TO *]) AND '
+                u'extras_temporal_start:[* TO 2019-08-02T00:00:00Z]))'
+            )
+        })
+        # act
+        search.before_search(search_params)
+        # assert
+        nt.assert_equal(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': u'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': (
+                u'organization:"test-organisation" groups:"gove" '
+                u'subject_text:"T\xe4tigkeitsbericht" +dataset_type:dataset '
+                u'(+extras_temporal_start:[2019-08-01T00:00:00Z TO *] '
+                u'OR +extras_temporal_end:[2019-08-01T00:00:00Z TO *]  '
+                u'OR (*:* NOT extras_temporal_end:[* TO *]))'
+            )
+        })
+        # act
+        search.before_search(search_params)
+        # assert
+        nt.assert_equal(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': u'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': (
+                u'organization:"test-organisation" groups:"gove" '
+                u'subject_text:"T\xe4tigkeitsbericht" +dataset_type:dataset '
+                u'(+extras_temporal_start:[* TO 2019-08-02T00:00:00Z] OR '
+                u'+extras_temporal_end:[* TO 2019-08-02T00:00:00Z]  '
+                u'OR ((*:* NOT extras_temporal_end:[* TO *]) '
+                u'AND extras_temporal_start:[* TO 2019-08-02T00:00:00Z]))'
+            )
+        })
+        # act
+        search.before_search(search_params)
+        # assert
+        nt.assert_equal(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
+        nt.assert_equal(return_value, search_params)
diff --git a/ckanext/odsh/tests_tpsh/test_uri_store.py b/ckanext/odsh/tests_tpsh/test_uri_store.py
new file mode 100644
index 00000000..0fc92f09
--- /dev/null
+++ b/ckanext/odsh/tests_tpsh/test_uri_store.py
@@ -0,0 +1,38 @@
+import nose.tools as nt
+from ckanext.odsh.uri_store import add_uri, get_id_from_uri, _set_uri_to_id, _get_uri_to_id
+
+class Test_uri_store(object):
+    def test_add_uri_adds_values_to_dict(self):
+        _set_uri_to_id({u'http://some_uri': u'some_id'})
+        dataset_dict = {
+            'id': u'some_new_id',
+            u'extras': [
+                {u'key': u'uri', u'value': u'http://some_new_uri'},
+            ]
+        }
+        add_uri(dataset_dict)
+        nt.assert_equal(
+            _get_uri_to_id().get('http://some_uri'),
+            u'some_id'
+        )
+        nt.assert_equal(
+            _get_uri_to_id().get('http://some_new_uri'),
+            u'some_new_id'
+        )
+    
+    def test_get_id_returns_id(self):
+        _set_uri_to_id({u'http://some_uri': u'some_id'})
+        uri = 'http://some_uri'
+        id = get_id_from_uri(uri)
+        id_expected = u'some_id'
+        nt.assert_equal(id, id_expected)
+    
+    def test_get_id_from_uri_returns_None_if_dict_empty(self):
+        _set_uri_to_id({})
+        id = get_id_from_uri('some_uri')
+        nt.assert_equal(id, None)
+    
+    def test_get_id_from_uri_returns_None_if_id_unknown(self):
+        _set_uri_to_id({'uri_to_id': {u'http://some_uri': u'some_id'}})
+        id = get_id_from_uri('some_unknown_id')
+        nt.assert_equal(id, None)
\ No newline at end of file
diff --git a/ckanext/odsh/tools.py b/ckanext/odsh/tools.py
new file mode 100644
index 00000000..ab7c1ba6
--- /dev/null
+++ b/ckanext/odsh/tools.py
@@ -0,0 +1,45 @@
+import os
+from ckanext.odsh.pdf_to_thumbnail.thumbnail import get_filepath_to_resource
+from ckanext.odsh.lib.uploader import calculate_hash
+import ckan.plugins.toolkit as toolkit
+import magic
+import pdftotext
+
+def add_attributes_resources(context, resource):
+    package_id = resource.get('package_id')
+    package = toolkit.get_action('package_show')(context, {'id': package_id})
+    resources = package.get('resources')
+    i = 0
+    for item in resources:    
+        if item.get('id') == resource.get('id'):
+            path = get_filepath_to_resource(resource)
+            if os.path.exists(path):
+                with open(path, 'rb') as file:                  
+                    
+                    #size
+                    if not item.get('size'):
+                        resource_size = os.path.getsize(path)
+                        item.update({'size': resource_size})
+                    
+                    #hash
+                    file.seek(0)
+                    hash = calculate_hash(file)
+                    item.update({'hash':hash})
+                    
+                    #hash algorithm
+                    item.update({'hash_algorithm': 'http://dcat-ap.de/def/hashAlgorithms/md/5'})
+                    
+            
+                    #number of pages
+                    file_type = magic.from_file(path, mime = True)                    
+                    if file_type == 'application/pdf':
+                        file.seek(0)            
+                        pdf = pdftotext.PDF(file)
+                        number_of_pages = len(pdf)
+                        item.update({'number_of_pages':number_of_pages})
+
+                    resources[i] = item 
+            break                         
+        i = i + 1  
+    package.update({'resources':resources})
+    toolkit.get_action('package_update')(context, package)
diff --git a/ckanext/odsh/uri_store/__init__.py b/ckanext/odsh/uri_store/__init__.py
new file mode 100644
index 00000000..8f72f0e2
--- /dev/null
+++ b/ckanext/odsh/uri_store/__init__.py
@@ -0,0 +1 @@
+from modifiers import add_uri, get_id_from_uri, _set_uri_to_id, _get_uri_to_id
\ No newline at end of file
diff --git a/ckanext/odsh/uri_store/modifiers.py b/ckanext/odsh/uri_store/modifiers.py
new file mode 100644
index 00000000..4fc1175b
--- /dev/null
+++ b/ckanext/odsh/uri_store/modifiers.py
@@ -0,0 +1,20 @@
+import store 
+
+import ckanext.odsh.helpers as odsh_helpers
+
+def add_uri(dataset_dict):
+    uri = odsh_helpers.odsh_extract_value_from_extras(
+        dataset_dict.get('extras'), 'uri'
+    )
+    id = dataset_dict.get('id')
+    store.uri_to_id.update({uri: id})
+
+def get_id_from_uri(uri):
+    id = store.uri_to_id.get(uri)
+    return id
+
+def _set_uri_to_id(new_uri_to_id):
+    store.uri_to_id = new_uri_to_id
+
+def _get_uri_to_id():
+    return store.uri_to_id
\ No newline at end of file
diff --git a/ckanext/odsh/uri_store/store.py b/ckanext/odsh/uri_store/store.py
new file mode 100644
index 00000000..1d152d8e
--- /dev/null
+++ b/ckanext/odsh/uri_store/store.py
@@ -0,0 +1 @@
+uri_to_id = {}
\ No newline at end of file
diff --git a/ckanext/odsh/validation.py b/ckanext/odsh/validation.py
index e50cbb43..a1e5338e 100644
--- a/ckanext/odsh/validation.py
+++ b/ckanext/odsh/validation.py
@@ -1,6 +1,6 @@
 # This Python file uses the following encoding: utf-8
 import logging
-import csv
+import unicodecsv as csv
 import re
 import urllib2
 import json
@@ -33,12 +33,13 @@ def _extract_value(data, field):
 
 def validate_extra_groups(data, requireAtLeastOne, errors):
     value = _extract_value(data, 'groups')
+    error_message_no_group = 'at least one group needed'
     if value != None:
         # 'value != None' means the extra key 'groups' was found,
         # so the dataset came from manual editing via the web-frontend.
         if not value:
             if requireAtLeastOne:
-                errors['groups'] = 'at least one group needed'
+                errors['groups'] = error_message_no_group
             data[('groups', 0, 'id')] = ''
             return
 
@@ -49,7 +50,7 @@ def validate_extra_groups(data, requireAtLeastOne, errors):
                 # del data[k]
         if len(groups) == 0:
             if requireAtLeastOne:
-                errors['groups'] = 'at least one group needed'
+                errors['groups'] = error_message_no_group
             return
 
         for num, group in zip(range(len(groups)), groups):
@@ -58,22 +59,59 @@ def validate_extra_groups(data, requireAtLeastOne, errors):
         # dataset might come from a harvest process
         if not data.get(('groups', 0, 'id'), False) and \
            not data.get(('groups', 0, 'name'), False):
-            errors['groups'] = 'at least one group needed'
+            errors['groups'] = error_message_no_group
 
 
 def validate_extras(key, data, errors, context):
     extra_errors = {}
+    
     isStaNord = ('id',) in data and data[('id',)][:7] == 'StaNord'
-
-    validate_extra_groups(data, True, extra_errors)
-    validate_extra_date_new(key, 'issued', data, isStaNord, extra_errors)
-    validate_extra_date_new(key, 'temporal_start',
-                            data, isStaNord, extra_errors)
-    validate_extra_date_new(key, 'temporal_end', data, True, extra_errors)
+    is_optional_temporal_start = toolkit.asbool(
+        config.get('ckanext.odsh.is_optional_temporal_start', False)
+    ) or isStaNord
+
+    require_at_least_one_category = toolkit.asbool(
+        config.get('ckanext.odsh.require_at_least_one_category', False)
+    )
+    validate_extra_groups(
+        data=data, 
+        requireAtLeastOne=require_at_least_one_category, 
+        errors=extra_errors
+    )
+    
+    is_date_start_before_date_end(data, extra_errors)
+    
+    validate_extra_date_new(
+        key=key,
+        field='issued',
+        data=data,
+        optional=isStaNord,
+        errors=extra_errors
+    )
+    validate_extra_date_new(
+        key=key,
+        field='temporal_start',
+        data=data,
+        optional=is_optional_temporal_start, 
+        errors=extra_errors
+    )
+    validate_extra_date_new(
+        key=key,
+        field='temporal_end',
+        data=data,
+        optional=True,
+        errors=extra_errors
+    )
 
     if len(extra_errors.values()):
         raise toolkit.Invalid(extra_errors)
 
+def is_date_start_before_date_end(data, extra_errors):
+    start_date = _extract_value(data, 'temporal_start')
+    end_date = _extract_value(data, 'temporal_end')
+    if start_date and end_date:
+        if start_date > end_date:
+            extra_errors['temporal_start'] = extra_errors['temporal_end'] = 'Please enter a valid period of time.'
 
 def _set_value(data, field, value):
     key = None
@@ -141,7 +179,13 @@ def validate_licenseAttributionByText(key, data, errors, context):
 
 
 def known_spatial_uri(key, data, errors, context):
+    if data.get(('__extras',)) and 'spatial_uri_temp' in data.get(('__extras',)):
+        _copy_spatial_uri_temp_to_extras(data)
     value = _extract_value(data, 'spatial_uri')
+    require_spatial_uri = toolkit.asbool(
+        config.get('ckanext.odsh.require_spatial_uri', False)
+    )
+    error_message_spatial_uri_empty = 'spatial_uri: empty not allowed'
 
     if not value:
         poly = None
@@ -157,8 +201,10 @@ def known_spatial_uri(key, data, errors, context):
             has_old_uri = old_uri != None and len(old_uri) > 0
             if not poly:
                 poly = pkg.extras.get('spatial', None)
-        if not poly or has_old_uri:
-            raise toolkit.Invalid('spatial_uri: empty not allowed')
+        if (not poly) and require_spatial_uri:
+            raise toolkit.Invalid(error_message_spatial_uri_empty)
+        if has_old_uri and require_spatial_uri:
+            raise toolkit.Invalid(error_message_spatial_uri_empty)
         else:
             if poly:
                 new_index = next_extra_index(data)
@@ -175,9 +221,9 @@ def known_spatial_uri(key, data, errors, context):
     not_found = True
     spatial_text = str()
     spatial = str()
-    cr = csv.reader(mapping_file, delimiter="\t")
+    cr = csv.reader(mapping_file, delimiter="\t", encoding='utf-8')
     for row in cr:
-        if row[0].encode('UTF-8') == value:
+        if row[0] == value:
             not_found = False
             spatial_text = row[1]
             loaded = json.loads(row[2])
@@ -195,6 +241,21 @@ def known_spatial_uri(key, data, errors, context):
     data[('extras', new_index+1, 'value')] = spatial
 
 
+def _copy_spatial_uri_temp_to_extras(data):
+    '''
+    copy the field spatial_uri_temp originating 
+    from the user interface to extras
+    '''
+    spatial_uri = data.get(('__extras',)).get('spatial_uri_temp')
+    is_spatial_uri_in_extras = _extract_value(data, 'spatial_uri') is not None
+    if not is_spatial_uri_in_extras:
+        next_index = next_extra_index(data)
+        data[('extras', next_index, 'key')] = 'spatial_uri'
+        data[('extras', next_index, 'value')] = spatial_uri
+    else:
+        _set_value(data, 'spatial_uri', spatial_uri)
+    
+
 def next_extra_index(data):
     current_indexes = [k[1] for k in data.keys()
                        if len(k) > 1 and k[0] == 'extras']
@@ -232,10 +293,65 @@ def tag_string_convert(key, data, errors, context):
         tag_name_validator(tag, context)
 
 
+def _convert_subjectID_to_subjectText(subject_id, flattened_data):
+
+    if not subject_id:
+        return flattened_data
+
+    default_subject_mapping_file_path = '/usr/lib/ckan/default/src/ckanext-odsh/subject_mapping.json'
+    subject_mapping_file_path = config.get(
+        'ckanext.odsh.subject_mapping_file_path', default_subject_mapping_file_path)
+    
+    try:
+        with open(subject_mapping_file_path) as mapping_json:
+             subject_mapping = json.loads(mapping_json.read())
+    except IOError as err:
+        log.error(
+            'Could not load subject mapping file from {}'
+            .format(subject_mapping_file_path)
+        )
+        raise
+    except ValueError as err:
+        log.error(
+            'Could not convert subject mapping file from json. \nSubject mapping file: {}'
+            .format(subject_mapping_file_path)
+        )
+        raise
+    
+    try: 
+        subject_text = subject_mapping[subject_id]
+    except:
+        raise toolkit.Invalid(_('Subject must be a known URI.'))
+        log.warning(
+            'Subject_id "{}" not found in subject mapping dictionary.\nSubject mapping file: {}'
+            .format(subject_id, subject_mapping_file_path)
+        )
+        
+
+    new_index = next_extra_index(flattened_data)
+    flattened_data[('extras', new_index, 'key')] = 'subject_text'
+    flattened_data[('extras', new_index, 'value')] = subject_text
+    return flattened_data
+
+
+def validate_subject(key, flattened_data, errors, context):
+    subject_id = flattened_data[key]
+    require_subject = toolkit.asbool(
+        config.get('ckanext.odsh.require_subject', True)
+    )
+    if not require_subject:
+        flattened_data = _convert_subjectID_to_subjectText(subject_id, flattened_data)
+        return
+    if not subject_id:
+        raise toolkit.Invalid(_('Subject must not be empty.'))
+    flattened_data = _convert_subjectID_to_subjectText(subject_id, flattened_data)
+
+
 def get_validators():
     return {
         'known_spatial_uri': known_spatial_uri,
         'odsh_tag_name_validator': tag_name_validator,
         'odsh_validate_extras': validate_extras,
-        'validate_licenseAttributionByText': validate_licenseAttributionByText
+        'validate_licenseAttributionByText': validate_licenseAttributionByText,
+        'tpsh_validate_subject': validate_subject,
     }
diff --git a/dev-requirements.txt b/dev-requirements.txt
index e69de29b..c574e4ea 100644
--- a/dev-requirements.txt
+++ b/dev-requirements.txt
@@ -0,0 +1,185 @@
+alabaster==0.7.11
+amqp==1.4.9
+anyjson==0.3.3
+arrow==0.13.1
+asn1crypto==0.24.0
+astroid==1.6.6
+atomicwrites==1.3.0
+attrs==19.3.0
+Babel==2.3.4
+backports.functools-lru-cache==1.5
+Beaker==1.8.1
+beautifulsoup4==4.5.1
+billiard==3.3.0.23
+bleach==1.5.0
+blinker==1.4
+celery==3.1.25
+certifi==2018.8.13
+cffi==1.11.5
+chardet==3.0.4
+click==6.7
+configparser==3.7.4
+contextlib2==0.6.0.post1
+cookies==2.2.1
+coverage==4.5.1
+coveralls==1.3.0
+cryptography==2.3
+decorator==4.0.6
+defusedxml==0.6.0
+dnspython==1.16.0
+docopt==0.6.2
+docutils==0.12
+entrypoints==0.3
+enum34==1.1.6
+eventlet==0.24.1
+extras==1.0.0
+factory-boy==2.1.1
+fanstatic==0.12
+filehash==0.1.dev3
+first==2.0.1
+fixtures==3.0.0
+flake8==3.7.8
+Flask==0.11.1
+Flask-DebugToolbar==0.10.0
+FormEncode==1.3.0
+funcsigs==1.0.2
+functools32==3.2.3.post2
+futures==3.3.0
+GeoAlchemy==0.7.2
+GeoAlchemy2==0.4.2
+geolinks==0.2.0
+geomet==0.2.0.post2
+greenlet==0.4.15
+html5lib==0.9999999
+httpretty==0.8.3
+hupper==1.6.1
+idna==2.7
+imagesize==1.0.0
+importlib-metadata==0.23
+ipaddress==1.0.22
+isodate==0.6.0
+isort==4.3.21
+itsdangerous==0.24
+Jinja2==2.8
+json-table-schema==0.2.1
+kombu==3.0.37
+lazy-object-proxy==1.4.1
+linecache2==1.0.0
+lxml==3.6.2
+Mako==1.0.4
+Markdown==2.6.7
+MarkupSafe==0.23
+mccabe==0.6.1
+messytables==0.15.2
+mock==2.0.0
+monotonic==1.5
+more-itertools==5.0.0
+mox3==0.26.0
+multiline-log-formatter==0.1.8
+nose==1.3.7
+ofs==0.4.2
+ordereddict==1.1
+OWSLib==0.16.0
+packaging==17.1
+Pairtree===0.7.1-T
+passlib==1.6.5
+Paste==1.7.5.1
+PasteDeploy==2.0.1
+PasteScript==2.0.2
+pathlib==1.0.1
+pathlib2==2.3.5
+pbr==1.10.0
+pdf2image==1.9.0
+pdftotext==2.1.2
+pika==0.12.0
+Pillow==6.1.0
+pip-tools==1.7.0
+piwikapi==0.3
+pkg-resources==0.0.0
+plaster==1.0
+plaster-pastedeploy==0.7
+pluggy==0.13.0
+polib==1.0.7
+progressbar==2.3
+psycopg2==2.7.3.2
+py==1.8.0
+pyasn1==0.4.8
+pycodestyle==2.5.0
+pycountry==18.5.26
+pycparser==2.18
+pycrypto==2.6.1
+pycryptodome==3.9.0
+pycsw==2.2.0
+pyfakefs==2.9
+pyflakes==2.1.1
+Pygments==2.1.3
+pylint==1.9.5
+Pylons==0.9.7
+pymongo==3.9.0
+pyOpenSSL==18.0.0
+pyparsing==2.2.0
+pyproj==1.9.5.1
+pyramid==1.10.4
+pyramid-exclog==0.1
+-e git+https://github.com/IdentityPython/pysaml2.git@247e2f642b37de90a61c4f5ca49d8403840b6ea2#egg=pysaml2
+pysolr==3.6.0
+pytest==4.6.6
+pytest-cov==2.8.1
+python-dateutil==2.8.0
+python-json-logger==0.1.11
+python-magic==0.4.12
+python-memcached==1.48
+python-mimeparse==1.6.0
+pytz==2016.7
+pyutilib.component.core==4.6.4
+rdflib==4.2.1
+rdflib-jsonld==0.4.0
+redis==2.10.1
+repoze.lru==0.6
+repoze.who==2.3
+repoze.who-friendlyform==1.0.8
+requests==2.11.1
+responses==0.10.6
+rope==0.14.0
+Routes==1.13
+rq==0.6.0
+rq-dashboard==0.4.0
+scandir==1.10.0
+selenium==3.141.0
+Shapely==1.5.17
+simplejson==3.10.0
+singledispatch==3.4.0.3
+six==1.10.0
+snowballstemmer==1.2.1
+SPARQLWrapper==1.8.2
+Sphinx==1.7.1
+sphinx-rtd-theme==0.3.1
+sphinxcontrib-websupport==1.1.0
+SQLAlchemy==0.9.6
+sqlalchemy-migrate==0.10.0
+sqlparse==0.2.2
+Tempita==0.5.2
+testfixtures==6.10.3
+testtools==2.3.0
+traceback2==1.4.0
+translationstring==1.3
+typing==3.6.4
+tzlocal==1.3
+unicodecsv==0.14.1
+unittest2==1.1.0
+urllib3==1.23
+vdm==0.13
+venusian==1.2.0
+vine==1.1.4
+wcwidth==0.1.7
+WebError==0.13.1
+WebHelpers==1.3
+WebOb==1.0.8
+WebTest==1.4.3
+Werkzeug==0.11.10
+wrapt==1.11.2
+xlrd==1.0.0
+xmltodict==0.10.2
+zipp==0.6.0
+zope.deprecation==4.4.0
+zope.interface==4.3.2
diff --git a/language_mapping.json b/language_mapping.json
new file mode 100644
index 00000000..808122e6
--- /dev/null
+++ b/language_mapping.json
@@ -0,0 +1,5 @@
+{
+    "http://publications.europa.eu/resource/authority/language/DAN":"Dänisch",
+    "http://publications.europa.eu/resource/authority/language/DEU":"Deutsch",
+    "http://publications.europa.eu/resource/authority/language/ENG":"Englisch"
+}
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 83c9faa8..524de62f 100755
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,4 +3,8 @@ ckanext-harvest
 ckanext-spatial
 lxml
 piwikapi
-multiline-log-formatter
\ No newline at end of file
+multiline-log-formatter
+filehash==0.1.dev3
+pdf2image==1.9.0
+pathlib
+pdftotext
diff --git a/setup.py b/setup.py
index e1a98ffc..56287f08 100755
--- a/setup.py
+++ b/setup.py
@@ -81,13 +81,14 @@ setup(
     entry_points='''
         [ckan.plugins]
         odsh=ckanext.odsh.plugin:OdshPlugin
-        odsh_icap=ckanext.odsh.plugin:OdshIcapPlugin
+        odsh_icap=ckanext.odsh.plugin_odsh_icap:OdshIcapPlugin
         statistikamtnord_harvester=ckanext.odsh.harvesters:StatistikamtNordHarvester
         kiel_harvester=ckanext.odsh.harvesters:KielHarvester
-        odsh_autocomplete=ckanext.odsh.plugin:OdshAutocompletePlugin
-        odsh_harvest=ckanext.odsh.plugin:OdshHarvestPlugin
-        odsh_dcat_harvest=ckanext.odsh.plugin:OdshDCATHarvestPlugin
-
+        odsh_autocomplete=ckanext.odsh.plugin_odsh_autocomplete:OdshAutocompletePlugin
+        odsh_harvest=ckanext.odsh.plugin_odsh_harvest:OdshHarvestPlugin
+        odsh_dcat_harvest=ckanext.odsh.plugin_odsh_dcat_harvest:OdshDCATHarvestPlugin
+        tpsh_collections=ckanext.odsh.collection.plugin:CollectionsPlugin
+        thumbnail=ckanext.odsh.pdf_to_thumbnail.plugin:ThumbnailPlugin
         [paste.paster_command]
         odsh_initialization = ckanext.odsh.commands.initialization:Initialization
 
diff --git a/subject_mapping.json b/subject_mapping.json
new file mode 100644
index 00000000..97ebe171
--- /dev/null
+++ b/subject_mapping.json
@@ -0,0 +1,25 @@
+{
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Verwaltungsvorschrift": "Verwaltungsvorschrift",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Organisationsplan": "Organisationsplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Geschaeftsverteilungsplan": "Geschäftsverteilungsplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Aktenplan": "Aktenplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Richtlinie": "Richtlinie und Runderlass",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Statistik": "amtliche Statistik",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Taetigkeitsbericht": "Tätigkeitsbericht",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Broschuere": "Broschüre",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Gutachten": "Gutachten",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Studie": "Studie",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Haushaltsplan": "Haushaltsplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Stellenplan": "Stellenplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Wirtschaftsplan": "Wirtschaftsplan",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#ZuwendungAnPerson": "Übersicht über Zuwendungen an juristische Personen des Privatrechts",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#ZuwendungAnLand": "Übersicht über Zuwendungen an das Land Schleswig-Holstein",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#IZGAntwort": "IZG/GvgV-Auskunft",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Gerichtsurteil": "Gerichtsurteil",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#GesetzvorlageLandtag": "Gesetzesvorlage an den Landtag",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#MitteilungLandtag": "Mitteilung an den Landtag",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Unternehmensdaten": "wesentliche Unternehmensdaten von Beteiligungen des Landes",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#VergütungsOG": "jährliche Vergütungen nach dem VergütungsOG",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#Vertrag": "Vertrag",
+    "http://transparenz.schleswig-holstein.de/informationsgegenstand#sonstiges": "zusätzliche freiwillige Information"
+}
-- 
GitLab