[pycsw] 01/01: Imported Upstream version 1.10.2

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Sat Jun 27 13:43:33 UTC 2015


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to annotated tag upstream/1.10.2
in repository pycsw.

commit 8efae41b7d14586c5469ac3df42d522e0b65b869
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sat Jun 27 14:32:09 2015 +0200

    Imported Upstream version 1.10.2
---
 CONTRIBUTING.rst                                   |  48 ++-
 LICENSE.txt                                        |   2 +-
 VERSION.txt                                        |   2 +-
 bin/pycsw-admin.py                                 |   4 +-
 docs/_templates/indexsidebar.html                  |   2 +-
 docs/conf.py                                       |   2 +-
 docs/installation.rst                              |   2 +-
 etc/dist/install_script/install_pycsw.sh           | 106 ------
 etc/dist/osgeolive/install_pycsw.sh                |  64 ----
 pavement.py                                        |  51 +--
 pycsw/__init__.py                                  |   2 +-
 pycsw/admin.py                                     |  16 +-
 pycsw/fes.py                                       |   4 +-
 pycsw/gml.py                                       |   2 +-
 pycsw/metadata.py                                  |  55 +--
 pycsw/opensearch.py                                |   4 +-
 pycsw/plugins/profiles/apiso/apiso.py              |  87 ++++-
 pycsw/plugins/repository/odc/odc.py                |   2 +-
 pycsw/repository.py                                |  16 +-
 pycsw/schemas/ogc/OGC-SOFTWARE-NOTICE.txt          |  17 +
 pycsw/server.py                                    |  70 ++--
 pycsw/util.py                                      |   8 +-
 requirements.txt                                   |   2 +-
 tests/README.txt                                   |   2 +-
 .../suites_default_get_GetRecords-filter.xml       |  16 +
 .../suites_harvesting_post_Harvest-csw-iso.xml     |  76 +++-
 .../suites_harvesting_post_Harvest-sos100.xml      |  18 +-
 .../suites_harvesting_post_Harvest-wcs.xml         | 172 +--------
 .../suites_harvesting_post_Harvest-wfs.xml         |  40 +-
 ...t_Harvest-zzz-post-GetRecords-filter-ows-dc.xml |  58 ++-
 ...t_Harvest-zzz-post-GetRecords-filter-sos-dc.xml |   2 +-
 ..._Harvest-zzz-post-GetRecords-filter-sos-iso.xml | 143 +++++++-
 ..._Harvest-zzz-post-GetRecords-filter-wfs-iso.xml | 370 +++++++++++++++++++
 ..._Harvest-zzz-post-GetRecords-filter-wms-iso.xml | 308 ++++++++++++++++
 ..._harvesting_post_Transaction-000-delete-all.xml |   2 +-
 tests/index.html                                   | 401 +++++++++++----------
 tests/run_tests.py                                 |   2 +-
 tests/suites/default/get/requests.txt              |   1 +
 tests/suites/harvesting/post/Harvest-csw-iso.xml   |   2 +-
 tests/suites/harvesting/post/Harvest-wcs.xml       |   2 +-
 tests/suites/harvesting/post/Harvest-wfs.xml       |   2 +-
 .../Harvest-zzz-post-GetRecords-filter-ows-dc.xml  |   6 +-
 .../Harvest-zzz-post-GetRecords-filter-wfs-iso.xml |  20 +
 .../Harvest-zzz-post-GetRecords-filter-wms-iso.xml |  20 +
 44 files changed, 1476 insertions(+), 755 deletions(-)

diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 87240ac..306f819 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -6,6 +6,40 @@ enhancements/features, etc.).  This document will outline some guidelines on
 contributing to pycsw.  As well, pycsw `community </community.html>`_ is a great place to
 get an idea of how to connect and participate in pycsw community and development.
 
+pycsw has the following modes of contribution:
+
+- GitHub Commit Access
+- GitHub Pull Requests
+
+Contributions and Licensing
+---------------------------
+
+Contributors are asked to confirm that they comply with project `license <https://github.com/geopython/pycsw/blob/master/LICENSE.txt>`_ guidelines.
+
+GitHub Commit Access
+^^^^^^^^^^^^^^^^^^^^
+
+- proposals to provide developers with GitHub commit access shall be emailed to the pycsw-devel `mailing list`_.  Proposals shall be approved by the pycsw development team.  Committers shall be added by the project admin
+- removal of commit access shall be handled in the same manner
+- each committer must send an email to the pycsw mailing list agreeing to the license guidelines (see `Contributions and Licensing Agreement Template <#contributions-and-licensing-agreement-template>`_).  **This is only required once**
+- each committer shall be listed in https://github.com/geopython/pycsw/blob/master/COMMITTERS.txt
+
+GitHub Pull Requests
+^^^^^^^^^^^^^^^^^^^^
+
+- pull requests can provide agreement to license guidelines as text in the pull request or via email to the pycsw `mailing list`_  (see `Contributions and Licensing Agreement Template <#contributions-and-licensing-agreement-template>`_).  **This is only required for a contributor's first pull request.  Subsequent pull requests do not require this step**
+- pull requests may include copyright in the source code header by the contributor if the contribution is significant or the contributor wants to claim copyright on their contribution
+- all contributors shall be listed at https://github.com/geopython/pycsw/graphs/contributors
+- unclaimed copyright, by default, is assigned to the main copyright holders as specified in https://github.com/geopython/pycsw/blob/master/LICENSE.txt
+
+Contributions and Licensing Agreement Template
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``Hi all, I'd like to contribute <feature X|bugfix Y|docs|something else> to pycsw.
+I confirm that my contributions to pycsw will be compatible with the pycsw
+license guidelines at the time of contribution.``
+
+
 GitHub
 ------
 
@@ -27,7 +61,7 @@ Documentation
 Bugs
 ----
 
-pycsw’s `issue tracker <https://github.com/geopython/pycsw/issues>`_ is the place to report bugs or request enhancements. To submit a bug be sure to specify the pycsw version you are using, the appropriate component, a description of how to reproduce the bug, as well as what version of Python and platform. For convenience, you can run ``pycsw-admin.py -c get_sysprof`` and copy/paste the output into your issue.
+pycsw's `issue tracker <https://github.com/geopython/pycsw/issues>`_ is the place to report bugs or request enhancements. To submit a bug be sure to specify the pycsw version you are using, the appropriate component, a description of how to reproduce the bug, as well as what version of Python and platform. For convenience, you can run ``pycsw-admin.py -c get_sysprof`` and copy/paste the output into your issue.
 
 Forking pycsw
 -------------
@@ -99,15 +133,13 @@ your own repository to ensure your pycsw repository is up to date with pycsw mas
   $ git checkout master
   $ git pull upstream master
 
-GitHub Commit Access
---------------------
-
-- proposals to provide developers with GitHub commit access shall be emailed to the pycsw-devel `mailing list </community.html#mailing_list>`_.  Proposals shall be approved by the pycsw development team.  Committers shall be added by the project admin
-- removal of commit access shall be handled in the same manner
-- each committer shall be listed in https://github.com/geopython/pycsw/blob/master/COMMITTERS.txt
-
+.. _`Corporate`: http://www.osgeo.org/sites/osgeo.org/files/Page/corporate_contributor.txt
+.. _`Individual`: http://www.osgeo.org/sites/osgeo.org/files/Page/individual_contributor.txt
+.. _`info at osgeo.org`: mailto:info at osgeo.org
+.. _`OSGeo`: http://www.osgeo.org/content/foundation/legal/licenses.html
 .. _`PEP 8`: http://www.python.org/dev/peps/pep-0008/
 .. _`pep8`: http://pypi.python.org/pypi/pep8/
 .. _`pylint`: http://www.logilab.org/857
 .. _`Sphinx`: http://sphinx-doc.org/
 .. _`developer tasks`: https://github.com/geopython/pycsw/wiki/Developer-Tasks
+.. _`mailing list`: http://pycsw.org/community.html#mailing_list
diff --git a/LICENSE.txt b/LICENSE.txt
index 5dbcb2b..1400127 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2010-2013 Tom Kralidis
+Copyright (c) 2010-2014 Tom Kralidis
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/VERSION.txt b/VERSION.txt
index 4dae298..5ad2491 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-1.10.1
+1.10.2
diff --git a/bin/pycsw-admin.py b/bin/pycsw-admin.py
index 26d8dda..2a18a9f 100755
--- a/bin/pycsw-admin.py
+++ b/bin/pycsw-admin.py
@@ -165,7 +165,7 @@ if len(sys.argv) == 1:
 
 try:
     OPTS, ARGS = getopt.getopt(sys.argv[1:], 'c:f:ho:p:ru:x:s:t:y')
-except getopt.GetoptError, err:
+except getopt.GetoptError as err:
     print '\nERROR: %s' % err
     print usage()
     sys.exit(2)
@@ -250,7 +250,7 @@ elif COMMAND == 'validate_xml':
 if COMMAND == 'setup_db':
     try:
         admin.setup_db(DATABASE, TABLE, HOME)
-    except Exception, err:
+    except Exception as err:
         print err
         print 'ERROR: DB creation error.  Database tables already exist'
         print 'Delete tables or database to reinitialize'
diff --git a/docs/_templates/indexsidebar.html b/docs/_templates/indexsidebar.html
index fabcb43..7f18bd2 100644
--- a/docs/_templates/indexsidebar.html
+++ b/docs/_templates/indexsidebar.html
@@ -7,7 +7,7 @@
 </p>
 
 <p>
-    <a title="OSGeo Project in Incubation" href="https://github.com/geopython/pycsw/wiki/OSGeo-Incubation"><img alt="OSGeo Project in Incubation" src="http://svn.osgeo.org/osgeo/marketing/logo/png8/150/OSGeo_incubation.png" height="64"/></a>
+    <img alt="OSGeo Project" src="http://svn.osgeo.org/osgeo/marketing/logo/png8/150/OSGeo_project.png" height="64"/>
 </p>
 
 <p>
diff --git a/docs/conf.py b/docs/conf.py
index a94111b..6b18ed4 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -42,7 +42,7 @@ master_doc = 'index'
 # General information about the project.
 project = u'pycsw'
 authors = u'Tom Kralidis'
-copyright = u'2010-2014, ' + authors
+copyright = u'2010-2015, ' + authors
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
diff --git a/docs/installation.rst b/docs/installation.rst
index 520ec86..9e0f1b9 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -27,7 +27,7 @@ pycsw requires the following Python supporting libraries:
 Installing from Source
 ----------------------
 
-`Download </download.html>`_ the latest stable version or fetch from Git.
+`Download <http://pycsw.org/download>`_ the latest stable version or fetch from Git.
 
 For Developers and the Truly Impatient
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/etc/dist/install_script/install_pycsw.sh b/etc/dist/install_script/install_pycsw.sh
deleted file mode 100755
index 6f9266d..0000000
--- a/etc/dist/install_script/install_pycsw.sh
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/bin/sh
-# Copyright (c) 2011 The Open Source Geospatial Foundation.
-# Licensed under the GNU LGPL.
-# 
-# This library is free software; you can redistribute it and/or modify it
-# under the terms of the GNU Lesser General Public License as published
-# by the Free Software Foundation, either version 2.1 of the License,
-# or any later version.  This library is distributed in the hope that
-# it will be useful, but WITHOUT ANY WARRANTY, without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the GNU Lesser General Public License for more details, either
-# in the "LICENSE.LGPL.txt" file distributed with this software or at
-# web page "http://www.fsf.org/licenses/lgpl.html".
-
-# About:
-# =====
-# This script will install pycsw, an OGC CSW server implementation
-# written in Python.
-#   http://pycsw.org
-#
-# Running:
-# =======
-# sudo ./install_pycsw.sh
-#
-# Requires: Apache2, python-lxml, python-shapely, python-pyproj and python-sqlalchemy
-#
-# Uninstall:
-# ============
-# sudo rm /etc/apache2/conf.d/pycsw
-# sudo rm -rf /var/www/pycsw*
-
-VERSION=1.2.0
-
-echo -n 'Installing pycsw $VERSION'
-
-echo -n 'Installing dependencies ...'
-
-# install dependencies
-apt-get install apache2 python-lxml python-sqlalchemy python-shapely python-pyproj
-
-# live disc's username is "user"
-USER_NAME=user
-USER_HOME=/home/$USER_NAME
-
-WEB=/var/www
-
-# package specific settings
-PYCSW_HOME=$WEB/pycsw
-PYCSW_TMP=/tmp/build_pycsw
-PYCSW_APACHE_CONF=/etc/apache2/conf.d/pycsw
-
-mkdir -p "$PYCSW_TMP"
-
-echo -n 'Downloading package ...'
-
-# Download pycsw LiveDVD tarball.
-wget -N --progress=dot:mega --no-check-certificate "http://download.osgeo.org/pycsw/pycsw-$VERSION.tar.gz" \
-     -O "$PYCSW_TMP/pycsw-$VERSION.tar.gz"
-
-echo -n 'Extracting package ...'
-
-# Uncompress pycsw LiveDVD tarball.
-tar -zxvf "$PYCSW_TMP/pycsw-$VERSION.tar.gz" -C "$PYCSW_TMP"
-mv "$PYCSW_TMP/pycsw-$VERSION" "$PYCSW_TMP/pycsw"
-mv "$PYCSW_TMP/pycsw" "$WEB"
-
-echo -n "Updating Apache configuration ..."
-# Add pycsw apache configuration
-cat << EOF > "$PYCSW_APACHE_CONF"
-
-        <Directory $PYCSW_HOME>
-	    Options FollowSymLinks +ExecCGI
-	    Allow from all
-	    AddHandler cgi-script .py
-        </Directory>
-
-EOF
-
-echo -n "Generating configuration files ..."
-# Add pycsw configuration files
-
-cp $PYCSW_HOME/default-sample.cfg $PYCSW_HOME/default.cfg
-
-echo -n "Done\n"
-
-#Add Launch icon to desktop
-if [ ! -e /usr/share/applications/pycsw.desktop ] ; then
-   cat << EOF > /usr/share/applications/pycsw.desktop
-[Desktop Entry]
-Type=Application
-Encoding=UTF-8
-Name=pycsw
-Comment=pycsw catalog server
-Categories=Application;Education;Geography;
-Exec=firefox http://localhost/pycsw/tests/index.html
-Icon=/var/www/pycsw/docs/_static/pycsw-logo.png
-Terminal=false
-StartupNotify=false
-Categories=Education;Geography;
-EOF
-fi
-cp /usr/share/applications/pycsw.desktop "$USER_HOME/Desktop/"
-chown "$USER_NAME:$USER_NAME" "$USER_HOME/Desktop/pycsw.desktop"
-
-# Reload Apache
-/etc/init.d/apache2 force-reload
diff --git a/etc/dist/osgeolive/install_pycsw.sh b/etc/dist/osgeolive/install_pycsw.sh
deleted file mode 100755
index 5af5eeb..0000000
--- a/etc/dist/osgeolive/install_pycsw.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/bin/sh
-# Copyright (c) 2013 The Open Source Geospatial Foundation.
-# Licensed under the GNU LGPL.
-# 
-# This library is free software; you can redistribute it and/or modify it
-# under the terms of the GNU Lesser General Public License as published
-# by the Free Software Foundation, either version 2.1 of the License,
-# or any later version.  This library is distributed in the hope that
-# it will be useful, but WITHOUT ANY WARRANTY, without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the GNU Lesser General Public License for more details, either
-# in the "LICENSE.LGPL.txt" file distributed with this software or at
-# web page "http://www.fsf.org/licenses/lgpl.html".
-
-# About:
-# =====
-# This script will install pycsw, an OGC CSW server implementation
-# written in Python.
-#   http://pycsw.org
-#
-# Running:
-# =======
-# sudo ./install_pycsw.sh
-#
-# Requires: Apache2, python-lxml, python-shapely and python-sqlalchemy
-
-SCRIPT="install_pycsw.sh"
-echo "==============================================================="
-echo "$SCRIPT"
-echo "==============================================================="
-
-# live disc's username is "user"
-if [ -z "$USER_NAME" ] ; then
-   USER_NAME="user"
-fi
-USER_HOME="/home/$USER_NAME"
-
-# VERSION=1.10.0
-
-echo 'Installing pycsw dependencies ...'
-
-# install dependencies
-apt-get install --yes apache2 python-lxml python-sqlalchemy \
-   python-shapely python-pyproj
-
-echo 'Installing pycsw ...'
-
-#add-apt-repository --yes ppa:gcpp-kalxas/ppa-tzotsos
-#apt-get -q update
-apt-get install --yes python-owslib python-pycsw pycsw-cgi
-
-
-cp /usr/share/applications/pycsw.desktop "$USER_HOME/Desktop/"
-chown "$USER_NAME:$USER_NAME" "$USER_HOME/Desktop/pycsw.desktop"
-
-# Reload Apache
-#/etc/init.d/apache2 force-reload
-
-echo "==============================================================="
-echo "Finished $SCRIPT"
-echo Disk Usage1:, $SCRIPT, `df . -B 1M | grep "Filesystem" | sed -e "s/  */,/g"`, date
-echo Disk Usage2:, $SCRIPT, `df . -B 1M | grep " /$" | sed -e "s/  */,/g"`, `date`
-echo "==============================================================="
-
diff --git a/pavement.py b/pavement.py
index 7593e00..34e530b 100644
--- a/pavement.py
+++ b/pavement.py
@@ -291,7 +291,7 @@ def start(options):
 def stop():
     """Stop local WSGI server instance"""
 
-    kill('python', 'csw.wsgi')
+    kill_process('python', 'csw.wsgi')
 
 
 @task
@@ -307,43 +307,16 @@ def reset(options):
         sh('git clean -dxf')
 
 
-def kill(arg1, arg2):
-    """Stops a proces that contains arg1 and is filtered by arg2"""
+def kill_process(procname, scriptname):
+    """kill WSGI processes that may be running in development"""
 
-    # from https://github.com/GeoNode/geonode/blob/dev/pavement.py#L443
-    from subprocess import Popen, PIPE
+    # from http://stackoverflow.com/a/2940878
+    import subprocess, signal
+    p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
+    out, err = p.communicate()
 
-    # Wait until ready
-    time0 = time.time()
-    # Wait no more than these many seconds
-    time_out = 30
-    running = True
-
-    while running and time.time() - time0 < time_out:
-        proc = Popen('ps aux | grep %s' % arg1, shell=True,
-                     stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
-
-        lines = proc.stdout.readlines()
-
-        running = False
-        for line in lines:
-
-            if '%s' % arg2 in line:
-                running = True
-
-                # Get pid
-                fields = line.strip().split()
-
-                info('Stopping %s (process number %s)' % (arg1, fields[1]))
-                kill2 = 'kill -9 %s 2> /dev/null' % fields[1]
-                os.system(kill2)
-
-        # Give it a little more time
-        time.sleep(1)
-    else:
-        pass
-
-    if running:
-        raise Exception('Could not stop %s: '
-                        'Running processes are\n%s'
-                        % (arg1, '\n'.join([l.strip() for l in lines])))
+    for line in out.splitlines():
+        if procname in line and scriptname in line:
+            pid = int(line.split()[1])
+            info('Stopping %s %s %d' % (procname, scriptname, pid))
+            os.kill(pid, signal.SIGKILL)
diff --git a/pycsw/__init__.py b/pycsw/__init__.py
index fc5d015..51b9e2d 100644
--- a/pycsw/__init__.py
+++ b/pycsw/__init__.py
@@ -28,4 +28,4 @@
 #
 # =================================================================
 
-__version__ = '1.10.1'
+__version__ = '1.10.2'
diff --git a/pycsw/admin.py b/pycsw/admin.py
index 078e197..d1206c4 100644
--- a/pycsw/admin.py
+++ b/pycsw/admin.py
@@ -330,7 +330,7 @@ def load_records(context, database, table, xml_dirpath, recursive=False, force_u
         # read document
         try:
             exml = etree.parse(recfile)
-        except Exception, err:
+        except Exception as err:
             LOGGER.warn('XML document is not well-formed: %s', str(err))
             continue
 
@@ -344,7 +344,7 @@ def load_records(context, database, table, xml_dirpath, recursive=False, force_u
             try:
                 repo.insert(rec, 'local', util.get_today_and_now())
                 LOGGER.info('Inserted')
-            except RuntimeError, err:
+            except RuntimeError as err:
                 if force_update:
                     LOGGER.info('Record exists. Updating.')
                     repo.update(rec)
@@ -370,7 +370,7 @@ def export_records(context, database, table, xml_dirpath):
         LOGGER.info('Directory %s does not exist.  Creating...', dirpath)
         try:
             os.makedirs(dirpath)
-        except OSError, err:
+        except OSError as err:
             raise RuntimeError('Could not create %s %s' % (dirpath, err))
 
     for record in records.all():
@@ -391,7 +391,7 @@ def export_records(context, database, table, xml_dirpath):
             with open(filename, 'w') as xml:
                 xml.write('<?xml version="1.0" encoding="UTF-8"?>\n')
                 xml.write(record.xml)
-        except Exception, err:
+        except Exception as err:
             raise RuntimeError("Error writing to %s" % filename, err)
 
 
@@ -428,7 +428,7 @@ def refresh_harvested_records(context, database, table, url):
             try:
                 csw.harvest(source, schema)
                 LOGGER.info(csw.response)
-            except Exception, err:
+            except Exception as err:
                 LOGGER.warn(err)
     else:
         LOGGER.info('No harvested records')
@@ -496,7 +496,7 @@ def post_xml(url, xml, timeout=30):
     from owslib.util import http_post
     try:
         return http_post(url=url, request=open(xml).read(), timeout=timeout)
-    except Exception, err:
+    except Exception as err:
         raise RuntimeError(err)
 
 
@@ -556,12 +556,12 @@ def validate_xml(xml, xsd):
     LOGGER.info('Validating %s against schema %s', xml, xsd)
 
     schema = etree.XMLSchema(file=xsd)
-    parser = etree.XMLParser(schema=schema)
+    parser = etree.XMLParser(schema=schema, resolve_entities=False)
 
     try:
         valid = etree.parse(xml, parser)
         return 'Valid'
-    except Exception, err:
+    except Exception as err:
         raise RuntimeError('ERROR: %s' % str(err))
 
 
diff --git a/pycsw/fes.py b/pycsw/fes.py
index be75363..70d30c1 100644
--- a/pycsw/fes.py
+++ b/pycsw/fes.py
@@ -118,7 +118,7 @@ def parse(element, queryables, dbtype, nsmap, orm='sqlalchemy', language='englis
             try:
                 LOGGER.debug('Testing existence of ogc:PropertyName')
                 pname = queryables[elem.find(util.nspath_eval('ogc:Function/ogc:PropertyName', nsmap)).text]['dbcol']
-            except Exception, err:
+            except Exception as err:
                 raise RuntimeError('Invalid PropertyName: %s.  %s' % (elem.find(util.nspath_eval('ogc:Function/ogc:PropertyName', nsmap)).text, str(err)))
 
         else:
@@ -126,7 +126,7 @@ def parse(element, queryables, dbtype, nsmap, orm='sqlalchemy', language='englis
                 LOGGER.debug('Testing existence of ogc:PropertyName')
                 pname = queryables[elem.find(
                     util.nspath_eval('ogc:PropertyName', nsmap)).text]['dbcol']
-            except Exception, err:
+            except Exception as err:
                 raise RuntimeError('Invalid PropertyName: %s.  %s' %
                                    (elem.find(util.nspath_eval('ogc:PropertyName',
                                    nsmap)).text, str(err)))
diff --git a/pycsw/gml.py b/pycsw/gml.py
index 06cec8f..21bd0dc 100644
--- a/pycsw/gml.py
+++ b/pycsw/gml.py
@@ -102,7 +102,7 @@ class Geometry(object):
             LOGGER.debug('transforming geometry to 4326')
             try:
                 self.wkt = self.transform(self.crs.code, DEFAULT_SRS.code)
-            except Exception, err:
+            except Exception as err:
                 raise RuntimeError('Reprojection error: Invalid srsName '
                                    '"%s": %s' % (self.crs.id, str(err)))
 
diff --git a/pycsw/metadata.py b/pycsw/metadata.py
index 6810d4e..e2de548 100644
--- a/pycsw/metadata.py
+++ b/pycsw/metadata.py
@@ -53,7 +53,7 @@ def parse_record(context, record, repos=None,
         # CSW service, not csw:Record
         try:
             return _parse_csw(context, repos, record, identifier, pagesize)
-        except Exception, err:
+        except Exception as err:
             # TODO: implement better exception handling
             if str(err).find('ExceptionReport') != -1:
                 msg = 'CSW harvesting error: %s' % str(err)
@@ -62,7 +62,7 @@ def parse_record(context, record, repos=None,
             LOGGER.debug('Not a CSW, attempting to fetch Dublin Core')
             try:
                 content = util.http_request('GET', record)
-            except Exception, err:
+            except Exception as err:
                 raise RuntimeError('HTTP error: %s' % str(err))
             return [_parse_dc(context, repos, etree.fromstring(content))]
 
@@ -154,7 +154,6 @@ def _parse_csw(context, repos, record, identifier, pagesize=10):
     _set(context, serviceobj, 'pycsw:Schema', 'http://www.opengis.net/cat/csw/2.0.2')
     _set(context, serviceobj, 'pycsw:MdSource', record)
     _set(context, serviceobj, 'pycsw:InsertDate', util.get_today_and_now())
-    _set(context, serviceobj, 'pycsw:XML', md.response)
     _set(context, serviceobj, 'pycsw:AnyText', util.get_anytext(md._exml))
     _set(context, serviceobj, 'pycsw:Type', 'service')
     _set(context, serviceobj, 'pycsw:Title', md.identification.title)
@@ -169,7 +168,7 @@ def _parse_csw(context, repos, record, identifier, pagesize=10):
     _set(context, serviceobj, 'pycsw:Source', record)
     _set(context, serviceobj, 'pycsw:Format', md.identification.type)
 
-    _set(context, serviceobj, 'pycsw:ServiceType', md.identification.type)
+    _set(context, serviceobj, 'pycsw:ServiceType', 'OGC:CSW')
     _set(context, serviceobj, 'pycsw:ServiceTypeVersion', md.identification.version)
     _set(context, serviceobj, 'pycsw:Operation', ','.join([d.name for d in md.operations]))
     _set(context, serviceobj, 'pycsw:CouplingType', 'tight')
@@ -179,6 +178,7 @@ def _parse_csw(context, repos, record, identifier, pagesize=10):
     ]
 
     _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+    _set(context, serviceobj, 'pycsw:XML', caps2iso(serviceobj, md, context))
 
     recobjs.append(serviceobj)
 
@@ -217,7 +217,7 @@ def _parse_csw(context, repos, record, identifier, pagesize=10):
         try:
             md.getrecords2(typenames=csw_typenames, startposition=r,
                            maxrecords=pagesize, outputschema=csw_outputschema, esn='full')
-        except Exception, err:  # this is a CSW, but server rejects query
+        except Exception as err:  # this is a CSW, but server rejects query
             raise RuntimeError(md.response)
         for k, v in md.records.iteritems():
             if csw_typenames == 'gmd:MD_Metadata':
@@ -238,7 +238,7 @@ def _parse_waf(context, repos, record, identifier):
     try:
         parser = etree.HTMLParser()
         tree = etree.fromstring(content, parser=parser)
-    except Exception, err:
+    except Exception as err:
         raise Exception('Could not parse WAF: %s' % str(err))
         
     up = urlparse(record)
@@ -292,7 +292,6 @@ def _parse_wms(context, repos, record, identifier):
     _set(context, serviceobj, 'pycsw:Schema', 'http://www.opengis.net/wms')
     _set(context, serviceobj, 'pycsw:MdSource', record)
     _set(context, serviceobj, 'pycsw:InsertDate', util.get_today_and_now())
-    _set(context, serviceobj, 'pycsw:XML', md.getServiceXML())
     _set(context, serviceobj, 'pycsw:AnyText', util.get_anytext(md.getServiceXML()))
     _set(context, serviceobj, 'pycsw:Type', 'service')
     _set(context, serviceobj, 'pycsw:Title', md.identification.title)
@@ -314,7 +313,7 @@ def _parse_wms(context, repos, record, identifier):
             break
     _set(context, serviceobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
     _set(context, serviceobj, 'pycsw:DistanceUOM', 'degrees')
-    _set(context, serviceobj, 'pycsw:ServiceType', md.identification.type)
+    _set(context, serviceobj, 'pycsw:ServiceType', 'OGC:WMS')
     _set(context, serviceobj, 'pycsw:ServiceTypeVersion', md.identification.version)
     _set(context, serviceobj, 'pycsw:Operation', ','.join([d.name for d in md.operations]))
     _set(context, serviceobj, 'pycsw:OperatesOn', ','.join(list(md.contents)))
@@ -325,6 +324,7 @@ def _parse_wms(context, repos, record, identifier):
     ]
 
     _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+    _set(context, serviceobj, 'pycsw:XML', caps2iso(serviceobj, md, context))
 
     recobjs.append(serviceobj) 
          
@@ -340,7 +340,6 @@ def _parse_wms(context, repos, record, identifier):
         _set(context, recobj, 'pycsw:Schema', 'http://www.opengis.net/wms')
         _set(context, recobj, 'pycsw:MdSource', record)
         _set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
-        _set(context, recobj, 'pycsw:XML', md.getServiceXML())
         _set(context, recobj, 'pycsw:Type', 'dataset')
         _set(context, recobj, 'pycsw:ParentIdentifier', identifier)
         _set(context, recobj, 'pycsw:Title', md.contents[layer].title)
@@ -385,6 +384,7 @@ def _parse_wms(context, repos, record, identifier):
         ]
 
         _set(context, recobj, 'pycsw:Links', '^'.join(links))
+        _set(context, recobj, 'pycsw:XML', caps2iso(recobj, md, context))
 
         recobjs.append(recobj)
 
@@ -406,7 +406,6 @@ def _parse_wfs(context, repos, record, identifier):
     _set(context, serviceobj, 'pycsw:Schema', 'http://www.opengis.net/wfs')
     _set(context, serviceobj, 'pycsw:MdSource', record)
     _set(context, serviceobj, 'pycsw:InsertDate', util.get_today_and_now())
-    _set(context, serviceobj, 'pycsw:XML', etree.tostring(md._capabilities))
     _set(context, serviceobj, 'pycsw:AnyText', util.get_anytext(etree.tostring(md._capabilities)))
     _set(context, serviceobj, 'pycsw:Type', 'service')
     _set(context, serviceobj, 'pycsw:Title', md.identification.title)
@@ -422,7 +421,7 @@ def _parse_wfs(context, repos, record, identifier):
     _set(context, serviceobj, 'pycsw:Format', md.identification.type)
     _set(context, serviceobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
     _set(context, serviceobj, 'pycsw:DistanceUOM', 'degrees')
-    _set(context, serviceobj, 'pycsw:ServiceType', md.identification.type)
+    _set(context, serviceobj, 'pycsw:ServiceType', 'OGC:WFS')
     _set(context, serviceobj, 'pycsw:ServiceTypeVersion', md.identification.version)
     _set(context, serviceobj, 'pycsw:Operation', ','.join([d.name for d in md.operations]))
     _set(context, serviceobj, 'pycsw:OperatesOn', ','.join(list(md.contents)))
@@ -446,7 +445,6 @@ def _parse_wfs(context, repos, record, identifier):
         _set(context, recobj, 'pycsw:Schema', 'http://www.opengis.net/wfs')
         _set(context, recobj, 'pycsw:MdSource', record)
         _set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
-        _set(context, recobj, 'pycsw:XML', etree.tostring(md._capabilities))
         _set(context, recobj, 'pycsw:Type', 'dataset')
         _set(context, recobj, 'pycsw:ParentIdentifier', identifier)
         _set(context, recobj, 'pycsw:Title', md.contents[featuretype].title)
@@ -480,6 +478,7 @@ def _parse_wfs(context, repos, record, identifier):
         ]
 
         _set(context, recobj, 'pycsw:Links', '^'.join(links))
+        _set(context, recobj, 'pycsw:XML', caps2iso(recobj, md, context))
 
         recobjs.append(recobj)
 
@@ -490,6 +489,8 @@ def _parse_wfs(context, repos, record, identifier):
     if bbox_agg is not None:
         _set(context, serviceobj, 'pycsw:BoundingBox', bbox_agg)
 
+    _set(context, serviceobj, 'pycsw:XML', caps2iso(serviceobj, md, context))
+
     recobjs.insert(0, serviceobj)
 
     return recobjs
@@ -510,7 +511,6 @@ def _parse_wcs(context, repos, record, identifier):
     _set(context, serviceobj, 'pycsw:Schema', 'http://www.opengis.net/wcs')
     _set(context, serviceobj, 'pycsw:MdSource', record)
     _set(context, serviceobj, 'pycsw:InsertDate', util.get_today_and_now())
-    _set(context, serviceobj, 'pycsw:XML', etree.tostring(md._capabilities))
     _set(context, serviceobj, 'pycsw:AnyText', util.get_anytext(etree.tostring(md._capabilities)))
     _set(context, serviceobj, 'pycsw:Type', 'service')
     _set(context, serviceobj, 'pycsw:Title', md.identification.title)
@@ -526,7 +526,7 @@ def _parse_wcs(context, repos, record, identifier):
     _set(context, serviceobj, 'pycsw:Format', md.identification.type)
     _set(context, serviceobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
     _set(context, serviceobj, 'pycsw:DistanceUOM', 'degrees')
-    _set(context, serviceobj, 'pycsw:ServiceType', md.identification.type)
+    _set(context, serviceobj, 'pycsw:ServiceType', 'OGC:WCS')
     _set(context, serviceobj, 'pycsw:ServiceTypeVersion', md.identification.version)
     _set(context, serviceobj, 'pycsw:Operation', ','.join([d.name for d in md.operations]))
     _set(context, serviceobj, 'pycsw:OperatesOn', ','.join(list(md.contents)))
@@ -550,7 +550,6 @@ def _parse_wcs(context, repos, record, identifier):
         _set(context, recobj, 'pycsw:Schema', 'http://www.opengis.net/wcs')
         _set(context, recobj, 'pycsw:MdSource', record)
         _set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
-        _set(context, recobj, 'pycsw:XML', etree.tostring(md._capabilities))
         _set(context, recobj, 'pycsw:Type', 'dataset')
         _set(context, recobj, 'pycsw:ParentIdentifier', identifier)
         _set(context, recobj, 'pycsw:Title', md.contents[coverage].title)
@@ -576,6 +575,7 @@ def _parse_wcs(context, repos, record, identifier):
         ]
 
         _set(context, recobj, 'pycsw:Links', '^'.join(links))
+        _set(context, recobj, 'pycsw:XML', caps2iso(recobj, md, context))
 
         recobjs.append(recobj)
 
@@ -586,6 +586,7 @@ def _parse_wcs(context, repos, record, identifier):
     if bbox_agg is not None:
         _set(context, serviceobj, 'pycsw:BoundingBox', bbox_agg)
 
+    _set(context, serviceobj, 'pycsw:XML', caps2iso(serviceobj, md, context))
     recobjs.insert(0, serviceobj)
 
     return recobjs
@@ -604,7 +605,6 @@ def _parse_wps(context, repos, record, identifier):
     _set(context, serviceobj, 'pycsw:Schema', 'http://www.opengis.net/wps/1.0.0')
     _set(context, serviceobj, 'pycsw:MdSource', record)
     _set(context, serviceobj, 'pycsw:InsertDate', util.get_today_and_now())
-    _set(context, serviceobj, 'pycsw:XML', etree.tostring(md._capabilities))
     _set(context, serviceobj, 'pycsw:AnyText', util.get_anytext(md._capabilities))
     _set(context, serviceobj, 'pycsw:Type', 'service')
     _set(context, serviceobj, 'pycsw:Title', md.identification.title)
@@ -619,7 +619,7 @@ def _parse_wps(context, repos, record, identifier):
     _set(context, serviceobj, 'pycsw:Source', record)
     _set(context, serviceobj, 'pycsw:Format', md.identification.type)
 
-    _set(context, serviceobj, 'pycsw:ServiceType', md.identification.type)
+    _set(context, serviceobj, 'pycsw:ServiceType', 'OGC:WPS')
     _set(context, serviceobj, 'pycsw:ServiceTypeVersion', md.identification.version)
     _set(context, serviceobj, 'pycsw:Operation', ','.join([d.name for d in md.operations]))
     _set(context, serviceobj, 'pycsw:OperatesOn', ','.join([o.identifier for o in md.processes]))
@@ -631,6 +631,7 @@ def _parse_wps(context, repos, record, identifier):
     ]
 
     _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+    _set(context, serviceobj, 'pycsw:XML', caps2iso(serviceobj, md, context))
 
     return serviceobj
 
@@ -656,7 +657,6 @@ def _parse_sos(context, repos, record, identifier, version):
     _set(context, serviceobj, 'pycsw:Schema', schema)
     _set(context, serviceobj, 'pycsw:MdSource', record)
     _set(context, serviceobj, 'pycsw:InsertDate', util.get_today_and_now())
-    _set(context, serviceobj, 'pycsw:XML', etree.tostring(md._capabilities))
     _set(context, serviceobj, 'pycsw:AnyText', util.get_anytext(etree.tostring(md._capabilities)))
     _set(context, serviceobj, 'pycsw:Type', 'service')
     _set(context, serviceobj, 'pycsw:Title', md.identification.title)
@@ -672,7 +672,7 @@ def _parse_sos(context, repos, record, identifier, version):
     _set(context, serviceobj, 'pycsw:Format', md.identification.type)
     _set(context, serviceobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
     _set(context, serviceobj, 'pycsw:DistanceUOM', 'degrees')
-    _set(context, serviceobj, 'pycsw:ServiceType', md.identification.type)
+    _set(context, serviceobj, 'pycsw:ServiceType', 'OGC:SOS')
     _set(context, serviceobj, 'pycsw:ServiceTypeVersion', md.identification.version)
     _set(context, serviceobj, 'pycsw:Operation', ','.join([d.name for d in md.operations]))
     _set(context, serviceobj, 'pycsw:OperatesOn', ','.join(list(md.contents)))
@@ -696,7 +696,6 @@ def _parse_sos(context, repos, record, identifier, version):
         _set(context, recobj, 'pycsw:Schema', schema)
         _set(context, recobj, 'pycsw:MdSource', record)
         _set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
-        _set(context, recobj, 'pycsw:XML', etree.tostring(md._capabilities))
         _set(context, recobj, 'pycsw:Type', 'dataset')
         _set(context, recobj, 'pycsw:ParentIdentifier', identifier)
         _set(context, recobj, 'pycsw:Title', md.contents[offering].description)
@@ -731,6 +730,7 @@ def _parse_sos(context, repos, record, identifier, version):
             _set(context, recobj, 'pycsw:DistanceUOM', 'degrees')
             bboxs.append(wkt_polygon)
 
+        _set(context, recobj, 'pycsw:XML', caps2iso(recobj, md, context))
         recobjs.append(recobj)
 
     # Derive a bbox based on aggregated featuretype bbox values
@@ -740,6 +740,7 @@ def _parse_sos(context, repos, record, identifier, version):
     if bbox_agg is not None:
         _set(context, serviceobj, 'pycsw:BoundingBox', bbox_agg)
 
+    _set(context, serviceobj, 'pycsw:XML', caps2iso(serviceobj, md, context))
     recobjs.insert(0, serviceobj)
 
     return recobjs
@@ -991,7 +992,7 @@ def _parse_iso(context, repos, exml):
                         linkstr = '%s,%s,%s,%s' % \
                         (scpt.name, scpt.description, scpt.protocol, scpt.url)
                         links.append(linkstr)
-    except Exception, err:  # srv: identification does not exist
+    except Exception as err:  # srv: identification does not exist
         LOGGER.debug('no srv:SV_ServiceIdentification links found')
 
     if len(links) > 0:
@@ -1078,3 +1079,15 @@ def _parse_dc(context, repos, exml):
 
     return recobj
 
+
+def caps2iso(record, caps, context):
+    """Creates ISO metadata from Capabilities XML"""
+
+    from pycsw.plugins.profiles.apiso.apiso import APISO
+
+    apiso_obj = APISO(context.model, context.namespaces, context)
+    apiso_obj.ogc_schemas_base = 'http://schemas.opengis.net'
+    apiso_obj.url = context.url
+    queryables = dict(apiso_obj.repository['queryables']['SupportedISOQueryables'].items() + apiso_obj.repository['queryables']['SupportedISOQueryables'].items())
+    iso_xml = apiso_obj.write_record(record, 'full', 'http://www.isotc211.org/2005/gmd', queryables, caps)
+    return etree.tostring(iso_xml)
diff --git a/pycsw/opensearch.py b/pycsw/opensearch.py
index 9a6e50d..168770f 100644
--- a/pycsw/opensearch.py
+++ b/pycsw/opensearch.py
@@ -143,7 +143,7 @@ def kvp2filterxml(kvp, context):
                     context.namespaces))
         try:
             el.text = "%s %s" % (bbox_list[0], bbox_list[1])
-        except Exception, err:
+        except Exception as err:
             errortext = 'Exception: OpenSearch bbox not valid.\nError: %s.' % str(err)
             LOGGER.debug(errortext)
         env.append(el)
@@ -151,7 +151,7 @@ def kvp2filterxml(kvp, context):
                     context.namespaces))
         try:
             el.text = "%s %s" % (bbox_list[2], bbox_list[3])
-        except Exception, err:
+        except Exception as err:
             errortext = 'Exception: OpenSearch bbox not valid.\nError: %s.' % str(err)
             LOGGER.debug(errortext)
         env.append(el)
diff --git a/pycsw/plugins/profiles/apiso/apiso.py b/pycsw/plugins/profiles/apiso/apiso.py
index ef18307..fde8b63 100644
--- a/pycsw/plugins/profiles/apiso/apiso.py
+++ b/pycsw/plugins/profiles/apiso/apiso.py
@@ -374,12 +374,18 @@ class APISO(profile.Profile):
         '''Perform extra profile specific checks in the GetDomain request'''
         return None
 
-    def write_record(self, result, esn, outputschema, queryables):
+    def write_record(self, result, esn, outputschema, queryables, caps=None):
         ''' Return csw:SearchResults child as lxml.etree.Element '''
         typename = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Typename'])
-        if (esn == 'full' and typename == 'gmd:MD_Metadata'):
+        is_iso_anyway = False
+
+        xml_blob = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:XML'])
+        if caps is None and xml_blob is not None and xml_blob.startswith('<gmd:MD_Metadata'):
+            is_iso_anyway = True
+
+        if (esn == 'full' and (typename == 'gmd:MD_Metadata' or is_iso_anyway)):
             # dump record as is and exit
-            return etree.fromstring(util.getqattr(result, self.context.md_core_model['mappings']['pycsw:XML']))
+            return etree.fromstring(xml_blob)
 
         if typename == 'csw:Record':  # transform csw:Record -> gmd:MD_Metadata model mappings
             util.transform_mappings(queryables, self.repository['mappings']['csw:Record'])
@@ -412,12 +418,76 @@ class APISO(profile.Profile):
 
         if esn in ['summary', 'full']:
             # contact
-            val = util.getqattr(result, queryables['apiso:OrganisationName']['dbcol'])
             contact = etree.SubElement(node, util.nspath_eval('gmd:contact', self.namespaces))
-            if val:
-                CI_resp = etree.SubElement(contact, util.nspath_eval('gmd:CI_ResponsibleParty', self.namespaces))
-                org_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:organisationName', self.namespaces))
-                etree.SubElement(org_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val
+            if caps is not None:
+                CI_resp = etree.SubElement(contact, util.nspath_eval('gmd:CI_ResponsibleParty', self.namespaces)) 
+                if hasattr(caps.provider.contact, 'name'):
+                    ind_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:individualName', self.namespaces))
+                    etree.SubElement(ind_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.name
+                if hasattr(caps.provider.contact, 'organization'):
+                    if caps.provider.contact.organization is not None:
+                        org_val = caps.provider.contact.organization
+                    else:
+                        org_val = caps.provider.name
+                    org_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:organisationName', self.namespaces))
+                    etree.SubElement(org_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = org_val
+                if hasattr(caps.provider.contact, 'position'):
+                    pos_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:positionName', self.namespaces))
+                    etree.SubElement(pos_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.position
+                contact_info = etree.SubElement(CI_resp, util.nspath_eval('gmd:contactInfo', self.namespaces)) 
+                ci_contact = etree.SubElement(contact_info, util.nspath_eval('gmd:CI_Contact', self.namespaces)) 
+                if hasattr(caps.provider.contact, 'phone'):
+                    phone = etree.SubElement(ci_contact, util.nspath_eval('gmd:phone', self.namespaces)) 
+                    ci_phone = etree.SubElement(phone, util.nspath_eval('gmd:CI_Telephone', self.namespaces)) 
+                    voice = etree.SubElement(ci_phone, util.nspath_eval('gmd:voice', self.namespaces)) 
+                    etree.SubElement(voice, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.phone
+                    if hasattr(caps.provider.contact, 'fax'):
+                        fax = etree.SubElement(ci_phone, util.nspath_eval('gmd:facsimile', self.namespaces)) 
+                        etree.SubElement(fax, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.fax
+                address = etree.SubElement(ci_contact, util.nspath_eval('gmd:address', self.namespaces)) 
+                ci_address = etree.SubElement(address, util.nspath_eval('gmd:CI_Address', self.namespaces)) 
+                if hasattr(caps.provider.contact, 'address'):
+                    delivery_point = etree.SubElement(ci_address, util.nspath_eval('gmd:deliveryPoint', self.namespaces)) 
+                    etree.SubElement(delivery_point, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.address
+                if hasattr(caps.provider.contact, 'city'):
+                    city = etree.SubElement(ci_address, util.nspath_eval('gmd:city', self.namespaces)) 
+                    etree.SubElement(city, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.city
+                if hasattr(caps.provider.contact, 'region'):
+                    admin_area = etree.SubElement(ci_address, util.nspath_eval('gmd:administrativeArea', self.namespaces)) 
+                    etree.SubElement(admin_area, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.region
+                if hasattr(caps.provider.contact, 'postcode'):
+                    postal_code = etree.SubElement(ci_address, util.nspath_eval('gmd:postalCode', self.namespaces)) 
+                    etree.SubElement(postal_code, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.postcode
+                if hasattr(caps.provider.contact, 'country'):
+                    country = etree.SubElement(ci_address, util.nspath_eval('gmd:country', self.namespaces)) 
+                    etree.SubElement(country, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.country
+                if hasattr(caps.provider.contact, 'email'):
+                    email = etree.SubElement(ci_address, util.nspath_eval('gmd:electronicMailAddress', self.namespaces)) 
+                    etree.SubElement(email, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.email
+
+                contact_url = None
+                if hasattr(caps.provider, 'url'):
+                    contact_url = caps.provider.url
+                if hasattr(caps.provider.contact, 'url') and caps.provider.contact.url is not None:
+                    contact_url = caps.provider.contact.url
+
+                if contact_url is not None:
+                    online_resource = etree.SubElement(ci_contact, util.nspath_eval('gmd:onlineResource', self.namespaces)) 
+                    gmd_linkage = etree.SubElement(online_resource, util.nspath_eval('gmd:linkage', self.namespaces)) 
+                    etree.SubElement(gmd_linkage, util.nspath_eval('gmd:URL', self.namespaces)).text = contact_url
+
+                if hasattr(caps.provider.contact, 'role'):
+                    role = etree.SubElement(CI_resp, util.nspath_eval('gmd:role', self.namespaces)) 
+                    role_val = caps.provider.contact.role
+                    if role_val is None:
+                        role_val = 'pointOfContact'
+                    etree.SubElement(role, util.nspath_eval('gmd:CI_RoleCode', self.namespaces), codeListValue=role_val, codeList='%s#CI_RoleCode' % CODELIST).text = role_val
+            else:
+                val = util.getqattr(result, queryables['apiso:OrganisationName']['dbcol'])
+                if val:
+                    CI_resp = etree.SubElement(contact, util.nspath_eval('gmd:CI_ResponsibleParty', self.namespaces))
+                    org_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:organisationName', self.namespaces))
+                    etree.SubElement(org_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val
 
             # date
             val = util.getqattr(result, queryables['apiso:Modified']['dbcol'])
@@ -666,4 +736,3 @@ def _write_codelist_element(codelist_element, codelist_value, nsmap):
     element.text = codelist_value
 
     return element
-
diff --git a/pycsw/plugins/repository/odc/odc.py b/pycsw/plugins/repository/odc/odc.py
index 583f6ab..dd6ab59 100644
--- a/pycsw/plugins/repository/odc/odc.py
+++ b/pycsw/plugins/repository/odc/odc.py
@@ -88,7 +88,7 @@ class OpenDataCatalogRepository(object):
         # if ids are passed which are not int, silently return (does not exist)
         try:
             return self._get_repo_filter(Resource.objects).filter(id__in=[s.split(':')[-1] for s in ids]).all()
-        except Exception, err:
+        except Exception as err:
             return []
 
     def query_domain(self, domain, typenames, domainquerytype='list',
diff --git a/pycsw/repository.py b/pycsw/repository.py
index 3e5a8e6..a8414e3 100644
--- a/pycsw/repository.py
+++ b/pycsw/repository.py
@@ -121,7 +121,7 @@ class Repository(object):
                 self.session.execute(select([func.postgis_version()]))
                 temp_dbtype = 'postgresql+postgis+wkt'
                 LOGGER.debug('PostgreSQL+PostGIS1+WKT detected')
-            except Exception, err:
+            except Exception as err:
                 LOGGER.debug('PostgreSQL+PostGIS1+WKT detection failed')
 
             # check if PostgreSQL is enabled with PostGIS 2.x
@@ -129,7 +129,7 @@ class Repository(object):
                 self.session.execute('select(postgis_version())')
                 temp_dbtype = 'postgresql+postgis+wkt'
                 LOGGER.debug('PostgreSQL+PostGIS2+WKT detected')
-            except Exception, err:
+            except Exception as err:
                 LOGGER.debug('PostgreSQL+PostGIS2+WKT detection failed')
 
             # check if a native PostGIS geometry column exists
@@ -139,7 +139,7 @@ class Repository(object):
                 self.postgis_geometry_column = str(row['f_geometry_column'])
                 temp_dbtype = 'postgresql+postgis+native'
                 LOGGER.debug('PostgreSQL+PostGIS+Native detected')
-            except Exception, err:
+            except Exception as err:
                 LOGGER.debug('PostgreSQL+PostGIS+Native not picked up: %s', str(err))
 
             # check if a native PostgreSQL FTS GIN index exists
@@ -289,7 +289,7 @@ class Repository(object):
             self.session.begin()
             self.session.add(record)
             self.session.commit()
-        except Exception, err:
+        except Exception as err:
             self.session.rollback()
             raise RuntimeError('ERROR: %s' % str(err.orig))
 
@@ -313,9 +313,9 @@ class Repository(object):
             try:
                 self.session.begin()
                 self._get_repo_filter(self.session.query(self.dataset)).filter_by(
-                identifier=identifier).update(update_dict)
+                identifier=identifier).update(update_dict, synchronize_session='fetch')
                 self.session.commit()
-            except Exception, err:
+            except Exception as err:
                 self.session.rollback()
                 raise RuntimeError('ERROR: %s' % str(err.orig))
         else:  # update based on record properties
@@ -348,7 +348,7 @@ class Repository(object):
                         }, synchronize_session='fetch')
                 self.session.commit()
                 return rows
-            except Exception, err:
+            except Exception as err:
                 self.session.rollback()
                 raise RuntimeError('ERROR: %s' % str(err.orig))
 
@@ -376,7 +376,7 @@ class Repository(object):
                     synchronize_session='fetch')
 
             self.session.commit()
-        except Exception, err:
+        except Exception as err:
             self.session.rollback()
             raise RuntimeError('ERROR: %s' % str(err.orig))
 
diff --git a/pycsw/schemas/ogc/OGC-SOFTWARE-NOTICE.txt b/pycsw/schemas/ogc/OGC-SOFTWARE-NOTICE.txt
new file mode 100644
index 0000000..1a85194
--- /dev/null
+++ b/pycsw/schemas/ogc/OGC-SOFTWARE-NOTICE.txt
@@ -0,0 +1,17 @@
+OGC Software Notice
+
+This OGC work (including software, documents, or other related items) is being provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions:
+
+Permission to use, copy, and modify this software and its documentation, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the software and documentation or portions thereof, including modifications, that you make:
+
+    The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
+    Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, a short notice of the following form (hypertext is preferred, text is permitted) should be used within the body of any redistributed or derivative code: "Copyright © [$date-of-document] Open Geospatial Consortium, Inc. All Rights Reserved. http://www.opengeospatial.org/ogc/legal (Hypertext is preferred, but a textual representation is permitted.)
+    Notice of any changes or modifications to the OGC files, including the date changes were made. (We recommend you provide URIs to the location from which the code is derived.) 
+
+ 
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders.
\ No newline at end of file
diff --git a/pycsw/server.py b/pycsw/server.py
index 7368364..4418e48 100644
--- a/pycsw/server.py
+++ b/pycsw/server.py
@@ -95,7 +95,7 @@ class Csw(object):
                     import codecs
                     with codecs.open(rtconfig, encoding='utf-8') as scp:
                         self.config.readfp(scp)
-        except Exception, err:
+        except Exception as err:
             self.response = self.exceptionreport(
             'NoApplicableCode', 'service',
             'Error opening configuration %s' % rtconfig)
@@ -107,6 +107,7 @@ class Csw(object):
         os.path.join(os.path.dirname(__file__), '..')))
 
         self.context.pycsw_home = self.config.get('server', 'home')
+        self.context.url = self.config.get('server', 'url')
 
         # configure transaction support, if specified in config
         self._gen_manager()
@@ -192,7 +193,7 @@ class Csw(object):
                 mappings = imp.load_source(modulename, module)
                 self.context.md_core_model = mappings.MD_CORE_MODEL
                 self.context.refresh_dc(mappings.MD_CORE_MODEL)
-            except Exception, err:
+            except Exception as err:
                 self.response = self.exceptionreport(
                 'NoApplicableCode', 'service',
                 'Could not load repository.mappings %s' % str(err))
@@ -254,7 +255,7 @@ class Csw(object):
                 geonode_.GeoNodeRepository(self.context)
                 LOGGER.debug('GeoNode repository loaded (geonode): %s.' % \
                 self.repository.dbtype)
-            except Exception, err:
+            except Exception as err:
                 self.response = self.exceptionreport(
                 'NoApplicableCode', 'service',
                 'Could not load repository (geonode): %s' % str(err))
@@ -270,7 +271,7 @@ class Csw(object):
                 odc.OpenDataCatalogRepository(self.context)
                 LOGGER.debug('OpenDataCatalog repository loaded (geonode): %s.' % \
                 self.repository.dbtype)
-            except Exception, err:
+            except Exception as err:
                 self.response = self.exceptionreport(
                 'NoApplicableCode', 'service',
                 'Could not load repository (odc): %s' % str(err))
@@ -285,7 +286,7 @@ class Csw(object):
                 self.config.get('repository', 'table'), repo_filter)
                 LOGGER.debug('Repository loaded (local): %s.' \
                 % self.repository.dbtype)
-            except Exception, err:
+            except Exception as err:
                 self.response = self.exceptionreport(
                 'NoApplicableCode', 'service',
                 'Could not load repository (local): %s' % str(err))
@@ -1145,7 +1146,7 @@ class Csw(object):
                                 etree.SubElement(listofvalues,
                                 util.nspath_eval('csw:Value',
                                 self.context.namespaces)).text = val
-                except Exception, err:
+                except Exception as err:
                     LOGGER.debug('No results for propertyname %s: %s.' %
                     (pname2, str(err)))
         return node
@@ -1285,7 +1286,7 @@ class Csw(object):
                         LOGGER.debug('Validating Filter %s.' %
                         self.kvp['constraint'])
                         schema = etree.XMLSchema(file=schema)
-                        parser = etree.XMLParser(schema=schema)
+                        parser = etree.XMLParser(schema=schema, resolve_entities=False)
                         doc = etree.fromstring(self.kvp['constraint'], parser)
                         LOGGER.debug('Filter is valid XML.')
                         self.kvp['constraint'] = {}
@@ -1295,7 +1296,7 @@ class Csw(object):
                         self.repository.queryables['_all'],
                         self.repository.dbtype,
                         self.context.namespaces, self.orm, self.language['text'], self.repository.fts)
-                    except Exception, err:
+                    except Exception as err:
                         errortext = \
                         'Exception: document not valid.\nError: %s.' % str(err)
 
@@ -1325,7 +1326,7 @@ class Csw(object):
                 if name.find('BoundingBox') != -1 or name.find('Envelope') != -1:
                     # it's a spatial sort
                     self.kvp['sortby']['spatial'] = True
-            except Exception, err:
+            except Exception as err:
                 return self.exceptionreport('InvalidParameterValue',
                 'sortby', 'Invalid SortBy propertyname: %s' % name)
 
@@ -1353,7 +1354,7 @@ class Csw(object):
             sortby=self.kvp['sortby'], typenames=self.kvp['typenames'],
             maxrecords=self.kvp['maxrecords'],
             startposition=int(self.kvp['startposition'])-1)
-        except Exception, err:
+        except Exception as err:
             return self.exceptionreport('InvalidParameterValue', 'constraint',
             'Invalid query: %s' % err)
 
@@ -1390,12 +1391,12 @@ class Csw(object):
                             (remotecsw_matches, plural, fedcat)))
 
                             dsresults.append(remotecsw.records)
-                except ExceptionReport, err:
+                except ExceptionReport as err:
                     error_string = 'remote CSW %s returned exception: ' % fedcat
                     dsresults.append(etree.Comment(
                     ' %s\n\n%s ' % (error_string, err)))
                     LOGGER.debug(str(err))
-                except Exception, err:
+                except Exception as err:
                     error_string = 'remote CSW %s returned error: ' % fedcat
                     dsresults.append(etree.Comment(
                     ' %s\n\n%s ' % (error_string, err)))
@@ -1497,7 +1498,7 @@ class Csw(object):
                         write_record(res, self.kvp['elementsetname'],
                         self.kvp['outputschema'],
                         self.repository.queryables['_all']))
-                except Exception, err:
+                except Exception as err:
                     self.response = self.exceptionreport(
                     'NoApplicableCode', 'service',
                     'Record serialization failed: %s' % str(err))
@@ -1628,7 +1629,7 @@ class Csw(object):
 
         try:
             self._test_manager()
-        except Exception, err:
+        except Exception as err:
             return self.exceptionreport('NoApplicableCode', 'transaction',
             str(err))
 
@@ -1645,7 +1646,7 @@ class Csw(object):
                 try:
                     record = metadata.parse_record(self.context,
                     ttype['xml'], self.repository)[0]
-                except Exception, err:
+                except Exception as err:
                     return self.exceptionreport('NoApplicableCode', 'insert',
                     'Transaction (insert) failed: record parsing failed: %s' \
                     % str(err))
@@ -1668,7 +1669,7 @@ class Csw(object):
                     self.context.md_core_model['mappings']['pycsw:Identifier']),
                     'title': getattr(record,
                     self.context.md_core_model['mappings']['pycsw:Title'])})
-                except Exception, err:
+                except Exception as err:
                     return self.exceptionreport('NoApplicableCode',
                     'insert', 'Transaction (insert) failed: %s.' % str(err))
 
@@ -1680,7 +1681,7 @@ class Csw(object):
                         ttype['xml'], self.repository)[0]
                         identifier = getattr(record,
                         self.context.md_core_model['mappings']['pycsw:Identifier'])
-                    except Exception, err:
+                    except Exception as err:
                         return self.exceptionreport('NoApplicableCode', 'insert',
                         'Transaction (update) failed: record parsing failed: %s' \
                         % str(err))
@@ -1698,7 +1699,7 @@ class Csw(object):
                         try:
                             self.repository.update(record)
                             updated += 1
-                        except Exception, err:
+                        except Exception as err:
                             return self.exceptionreport('NoApplicableCode',
                             'update',
                             'Transaction (update) failed: %s.' % str(err))
@@ -1728,7 +1729,7 @@ class Csw(object):
                         updated += self.repository.update(record=None,
                         recprops=ttype['recordproperty'],
                         constraint=ttype['constraint'])
-                    except Exception, err:
+                    except Exception as err:
                         return self.exceptionreport('NoApplicableCode',
                         'update',
                         'Transaction (update) failed: %s.' % str(err))
@@ -1762,7 +1763,7 @@ class Csw(object):
 
         try:
             self._test_manager()
-        except Exception, err:
+        except Exception as err:
             return self.exceptionreport('NoApplicableCode', 'harvest', str(err))
 
         if self.requesttype == 'GET':
@@ -1789,7 +1790,7 @@ class Csw(object):
             LOGGER.debug('Fetching resource %s' % self.kvp['source'])
             try:
                 content = util.http_request('GET', self.kvp['source'])
-            except Exception, err:
+            except Exception as err:
                 errortext = 'Error fetching resource %s.\nError: %s.' % \
                 (self.kvp['source'], str(err))
                 LOGGER.debug(errortext)
@@ -1814,7 +1815,7 @@ class Csw(object):
             records_parsed = metadata.parse_record(self.context,
             content, self.repository, self.kvp['resourcetype'],
             pagesize=self.csw_harvest_pagesize)
-        except Exception, err:
+        except Exception as err:
             LOGGER.exception(err)
             return self.exceptionreport('NoApplicableCode', 'source',
             'Harvest failed: record parsing failed: %s' % str(err))
@@ -1872,7 +1873,7 @@ class Csw(object):
                 inserted += 1
                 try:
                     self.repository.insert(record, source, insert_date)
-                except Exception, err:
+                except Exception as err:
                     return self.exceptionreport('NoApplicableCode',
                     'source', 'Harvest (insert) failed: %s.' % str(err))
             else:  # existing record, it's an update
@@ -1884,7 +1885,7 @@ class Csw(object):
 
                 try:
                     self.repository.update(record)
-                except Exception, err:
+                except Exception as err:
                     return self.exceptionreport('NoApplicableCode',
                     'source', 'Harvest (update) failed: %s.' % str(err))
                 updated += 1
@@ -1937,7 +1938,7 @@ class Csw(object):
         try:
             LOGGER.debug('Parsing %s.' % postdata)
             doc = etree.fromstring(postdata)
-        except Exception, err:
+        except Exception as err:
             errortext = \
             'Exception: document not well-formed.\nError: %s.' % str(err)
 
@@ -1976,7 +1977,7 @@ class Csw(object):
 
                 LOGGER.debug('Validating %s.' % postdata)
                 schema = etree.XMLSchema(file=schema)
-                parser = etree.XMLParser(schema=schema)
+                parser = etree.XMLParser(schema=schema, resolve_entities=False)
                 if hasattr(self, 'soap') and self.soap:
                 # validate the body of the SOAP request
                     doc = etree.fromstring(etree.tostring(doc), parser)
@@ -1985,7 +1986,7 @@ class Csw(object):
                 LOGGER.debug('Request is valid XML.')
             else:  # parse Transaction without validation
                 doc = etree.fromstring(postdata)
-        except Exception, err:
+        except Exception as err:
             errortext = \
             'Exception: the document is not valid.\nError: %s' % str(err)
             LOGGER.debug(errortext)
@@ -2128,7 +2129,7 @@ class Csw(object):
                         elname.find('Envelope') != -1):
                         # it's a spatial sort
                         request['sortby']['spatial'] = True
-                except Exception, err:
+                except Exception as err:
                     errortext = \
                     'Invalid ogc:SortProperty/ogc:PropertyName: %s' % str(err)
                     LOGGER.debug(errortext)
@@ -2379,10 +2380,9 @@ class Csw(object):
             % self.encoding
             appinfo = '<!-- pycsw %s -->\n' % self.context.version
 
-        LOGGER.debug('Response:\n%s' % response)
-
-        s = '%s%s%s' % (xmldecl, appinfo, response)
-        return s.encode(self.encoding)
+        s = (u'%s%s%s' % (xmldecl, appinfo, response)).encode(self.encoding)
+        LOGGER.debug('Response:\n%s', s)
+        return s
 
 
     def _gen_soap_wrapper(self):
@@ -2460,7 +2460,7 @@ class Csw(object):
                 query['where'], query['values'] = fes.parse(tmp,
                 self.repository.queryables['_all'], self.repository.dbtype,
                 self.context.namespaces, self.orm, self.language['text'], self.repository.fts)
-            except Exception, err:
+            except Exception as err:
                 return 'Invalid Filter request: %s' % err
         tmp = element.find(util.nspath_eval('csw:CqlText', self.context.namespaces))
         if tmp is not None:
@@ -2575,7 +2575,7 @@ class Csw(object):
                     uprh.path, body)
                     msg.quit()
                     LOGGER.debug('Email sent successfully.')
-                except Exception, err:
+                except Exception as err:
                     LOGGER.debug('Error processing email: %s.' % str(err))
 
             elif uprh.scheme == 'ftp':
@@ -2591,7 +2591,7 @@ class Csw(object):
                     ftp.storbinary('STOR %s' % uprh.path[1:], StringIO(xml))
                     ftp.quit()
                     LOGGER.debug('FTP sent successfully.')
-                except Exception, err:
+                except Exception as err:
                     LOGGER.debug('Error processing FTP: %s.' % str(err))
 
     def _write_verboseresponse(self, insertresults):
diff --git a/pycsw/util.py b/pycsw/util.py
index 157fa97..718938e 100644
--- a/pycsw/util.py
+++ b/pycsw/util.py
@@ -76,7 +76,7 @@ def get_version_integer(version):
             return -1
         try:
             return int(xyz[0]) * 10000 + int(xyz[1]) * 100 + int(xyz[2])
-        except Exception, err:
+        except Exception as err:
             raise RuntimeError('%s' % str(err))
     else:  # not a valid version string
         return -1
@@ -236,7 +236,7 @@ def get_spatial_overlay_rank(target_geometry, query_geometry):
             else:
                 LOGGER.debug('Spatial Rank: %s', str(((X/Q)**kq)*((X/T)**kt)))
                 return str(((X/Q)**kq)*((X/T)**kt))
-        except Exception, err:
+        except Exception as err:
                 LOGGER.warn('Cannot derive spatial overlay ranking %s', err)
                 return '0'
     return '0'
@@ -254,7 +254,7 @@ def bbox_from_polygons(bboxs):
         bbx = MultiPolygon(polys).bounds
         bstr = '%.2f,%.2f,%.2f,%.2f' % (bbx[0], bbx[1], bbx[2], bbx[3])
         return bbox2wktpolygon(bstr)
-    except Exception, err:
+    except Exception as err:
         raise RuntimeError('Cannot aggregate polygons: %s' % str(err))
 
 
@@ -272,7 +272,7 @@ def update_xpath(nsmap, xml, recprop):
             for node1 in nodes:
                 if node1.text != recprop['value']:  # values differ, update
                     node1.text = recprop['value']
-    except Exception, err:
+    except Exception as err:
         raise RuntimeError('ERROR: %s' % str(err))
 
     return etree.tostring(xml)
diff --git a/requirements.txt b/requirements.txt
index bd2412c..e117383 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
 geolinks==0.0.1
 lxml==3.3.5
-OWSLib==0.8.8
+OWSLib<0.9.0
 pyproj==1.9.3
 Shapely==1.3.1
diff --git a/tests/README.txt b/tests/README.txt
index 6195fa9..a591a07 100644
--- a/tests/README.txt
+++ b/tests/README.txt
@@ -1 +1 @@
-See http://pycsw.org/docs/testing.html#tests
+See http://docs.pycsw.org/en/latest/testing.html
diff --git a/tests/expected/suites_default_get_GetRecords-filter.xml b/tests/expected/suites_default_get_GetRecords-filter.xml
new file mode 100644
index 0000000..25e208e
--- /dev/null
+++ b/tests/expected/suites_default_get_GetRecords-filter.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordsResponse xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ows="http://www.opengis.net/ows" xmlns:fgdc="http://www.opengis.net/cat/csw/csdg [...]
+  <csw:SearchStatus timestamp="PYCSW_TIMESTAMP"/>
+  <csw:SearchResults nextRecord="0" numberOfRecordsMatched="1" numberOfRecordsReturned="1" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+    <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:title>Lorem ipsum</dc:title>
+    <dct:spatial>GR-22</dct:spatial>
+    <dc:subject>Tourism--Greece</dc:subject>
+    <dct:abstract>Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.</dct:abstract>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-csw-iso.xml b/tests/expected/suites_harvesting_post_Harvest-csw-iso.xml
index 6bba882..2e34654 100644
--- a/tests/expected/suites_harvesting_post_Harvest-csw-iso.xml
+++ b/tests/expected/suites_harvesting_post_Harvest-csw-iso.xml
@@ -3,14 +3,22 @@
 <csw:HarvestResponse xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xlink="http://www.w3.org/1999/xlink" xml [...]
   <csw:TransactionResponse version="2.0.2">
     <csw:TransactionSummary>
-      <csw:totalInserted>23</csw:totalInserted>
+      <csw:totalInserted>41</csw:totalInserted>
       <csw:totalUpdated>0</csw:totalUpdated>
       <csw:totalDeleted>0</csw:totalDeleted>
     </csw:TransactionSummary>
     <csw:InsertResult>
       <csw:BriefRecord>
         <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
-        <dc:title>My GeoServer CSW</dc:title>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
       </csw:BriefRecord>
       <csw:BriefRecord>
         <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
@@ -100,6 +108,70 @@
         <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
         <dc:title/>
       </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER_gen0</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER_gen1</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER_gen0</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER_gen1</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
     </csw:InsertResult>
   </csw:TransactionResponse>
 </csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-sos100.xml b/tests/expected/suites_harvesting_post_Harvest-sos100.xml
index a4e2dfe..d331bda 100644
--- a/tests/expected/suites_harvesting_post_Harvest-sos100.xml
+++ b/tests/expected/suites_harvesting_post_Harvest-sos100.xml
@@ -3,7 +3,7 @@
 <csw:HarvestResponse xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xlink="http://www.w3.org/1999/xlink" xml [...]
   <csw:TransactionResponse version="2.0.2">
     <csw:TransactionSummary>
-      <csw:totalInserted>28</csw:totalInserted>
+      <csw:totalInserted>29</csw:totalInserted>
       <csw:totalUpdated>0</csw:totalUpdated>
       <csw:totalDeleted>0</csw:totalDeleted>
     </csw:TransactionSummary>
@@ -17,16 +17,12 @@
         <dc:title>Mooring CML data from the COOA (UNH-COOA) located UNH Coastal Marine Lab Field Station</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-F02</dc:identifier>
-        <dc:title>Mooring F02 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located DeepCwind Castine Test Site</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
         <dc:identifier>PYCSW_IDENTIFIER-F01</dc:identifier>
         <dc:title>Mooring F01 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located Penobscot Bay</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-ALL_PLATFORMS</dc:identifier>
-        <dc:title>Mooring data for all buoys from the Northeastern Regional Association of Coastal Ocean Observing Systems (NERACOOS) located in the NERACOOS Region</dc:title>
+        <dc:identifier>PYCSW_IDENTIFIER-F02</dc:identifier>
+        <dc:title>Mooring F02 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located DeepCwind Castine Test Site</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
         <dc:identifier>PYCSW_IDENTIFIER-SMB-MO-04</dc:identifier>
@@ -101,6 +97,10 @@
         <dc:title>Mooring CO2 data from the COOA (UNH-COOA) located Appledore Island</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-ALL_PLATFORMS</dc:identifier>
+        <dc:title>Mooring data for all buoys from the Northeastern Regional Association of Coastal Ocean Observing Systems (NERACOOS) located in the NERACOOS Region</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
         <dc:identifier>PYCSW_IDENTIFIER-A01</dc:identifier>
         <dc:title>Mooring A01 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located Massachusetts Bay</dc:title>
       </csw:BriefRecord>
@@ -117,6 +117,10 @@
         <dc:title>Mooring I01 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located Eastern Maine Shelf</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-CDIP207</dc:identifier>
+        <dc:title>Mooring CDIP207 data from the COOA (UNH-COOA-CDIP) located Fire Island, NY</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
         <dc:identifier>PYCSW_IDENTIFIER-44060</dc:identifier>
         <dc:title>Mooring 44060 data from the LISICOS (LISICOS) located Eastern Long Island Sound</dc:title>
       </csw:BriefRecord>
diff --git a/tests/expected/suites_harvesting_post_Harvest-wcs.xml b/tests/expected/suites_harvesting_post_Harvest-wcs.xml
index fb27f88..789e1f2 100644
--- a/tests/expected/suites_harvesting_post_Harvest-wcs.xml
+++ b/tests/expected/suites_harvesting_post_Harvest-wcs.xml
@@ -3,182 +3,30 @@
 <csw:HarvestResponse xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xlink="http://www.w3.org/1999/xlink" xml [...]
   <csw:TransactionResponse version="2.0.2">
     <csw:TransactionSummary>
-      <csw:totalInserted>43</csw:totalInserted>
+      <csw:totalInserted>5</csw:totalInserted>
       <csw:totalUpdated>0</csw:totalUpdated>
       <csw:totalDeleted>0</csw:totalDeleted>
     </csw:TransactionSummary>
     <csw:InsertResult>
       <csw:BriefRecord>
         <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
-        <dc:title>Atlas of the Cryosphere: Northern Hemisphere</dc:title>
+        <dc:title>WCS Demo Server for MapServer</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_09</dc:identifier>
-        <dc:title>snow water equivalent, September (1987-2002)</dc:title>
+        <dc:identifier>PYCSW_IDENTIFIER-ndvi</dc:identifier>
+        <dc:title>North Central US MODIS-based NDVI Images for 2002</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_08</dc:identifier>
-        <dc:title>snow water equivalent, August (1987-2002)</dc:title>
+        <dc:identifier>PYCSW_IDENTIFIER-modis-001</dc:identifier>
+        <dc:title>North Central US MODIS Images for 2002-001</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_03</dc:identifier>
-        <dc:title>snow water equivalent, March (1988-2003)</dc:title>
+        <dc:identifier>PYCSW_IDENTIFIER-fpar</dc:identifier>
+        <dc:title>North Central US MODIS-based FPAR Images for 2002</dc:title>
       </csw:BriefRecord>
       <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_02</dc:identifier>
-        <dc:title>snow water equivalent, February (1988-2003)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_01</dc:identifier>
-        <dc:title>snow water equivalent, January (1988-2003)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_12</dc:identifier>
-        <dc:title>snow extent, December (1966-2004)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_06</dc:identifier>
-        <dc:title>snow water equivalent, June (1988-2003)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_10</dc:identifier>
-        <dc:title>snow extent, October (1967-2004)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_11</dc:identifier>
-        <dc:title>snow extent, November (1966-2004)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-greenland_bedrock_elevation</dc:identifier>
-        <dc:title>Greenland bedrock elevation</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-greenland_accumulation</dc:identifier>
-        <dc:title>Greenland snow accumulation (1971-1990)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_08</dc:identifier>
-        <dc:title>sea ice concentration, August (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_09</dc:identifier>
-        <dc:title>sea ice concentration, September (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-greenland_surface_melt</dc:identifier>
-        <dc:title>Greenland surface melt (1979-2004)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_02</dc:identifier>
-        <dc:title>sea ice concentration, February (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_03</dc:identifier>
-        <dc:title>sea ice concentration, March (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_01</dc:identifier>
-        <dc:title>sea ice concentration, January (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_06</dc:identifier>
-        <dc:title>sea ice concentration, June (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_07</dc:identifier>
-        <dc:title>sea ice concentration, July (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_04</dc:identifier>
-        <dc:title>sea ice concentration, April (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_05</dc:identifier>
-        <dc:title>sea ice concentration, May (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_10</dc:identifier>
-        <dc:title>snow water equivalent, October (1987-2002)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-greenland_elevation</dc:identifier>
-        <dc:title>Greenland surface elevation</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_11</dc:identifier>
-        <dc:title>snow water equivalent, November (1987-2002)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_12</dc:identifier>
-        <dc:title>snow water equivalent, December (1987-2002)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_09</dc:identifier>
-        <dc:title>snow extent, September (1967-2004)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_08</dc:identifier>
-        <dc:title>snow extent, August (1967-2004)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_05</dc:identifier>
-        <dc:title>snow extent, May (1967-2005)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_04</dc:identifier>
-        <dc:title>snow extent, April (1967-2005)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_07</dc:identifier>
-        <dc:title>snow extent, July (1967-2004)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_06</dc:identifier>
-        <dc:title>snow extent, June (1967-2004)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_01</dc:identifier>
-        <dc:title>snow extent, January (1967-2005)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_03</dc:identifier>
-        <dc:title>snow extent, March (1967-2005)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_extent_02</dc:identifier>
-        <dc:title>snow extent, February (1967-2005)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-seasonal_snow_classification</dc:identifier>
-        <dc:title>seasonal snow classification</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_05</dc:identifier>
-        <dc:title>snow water equivalent, May (1988-2003)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_04</dc:identifier>
-        <dc:title>snow water equivalent, April (1988-2003)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-greenland_ice_thickness</dc:identifier>
-        <dc:title>Greenland ice sheet thickness</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_11</dc:identifier>
-        <dc:title>sea ice concentration, November (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_10</dc:identifier>
-        <dc:title>sea ice concentration, October (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-sea_ice_concentration_12</dc:identifier>
-        <dc:title>sea ice concentration, December (1979-2007)</dc:title>
-      </csw:BriefRecord>
-      <csw:BriefRecord>
-        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_07</dc:identifier>
-        <dc:title>snow water equivalent, July (1988-2002)</dc:title>
+        <dc:identifier>PYCSW_IDENTIFIER-modis</dc:identifier>
+        <dc:title>North Central US MODIS Images for 2002</dc:title>
       </csw:BriefRecord>
     </csw:InsertResult>
   </csw:TransactionResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-wfs.xml b/tests/expected/suites_harvesting_post_Harvest-wfs.xml
index 1229007..a47baa3 100644
--- a/tests/expected/suites_harvesting_post_Harvest-wfs.xml
+++ b/tests/expected/suites_harvesting_post_Harvest-wfs.xml
@@ -1,7 +1,37 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- PYCSW_VERSION -->
-<ows:ExceptionReport xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xlink="http://www.w3.org/1999/xlink" xml [...]
-  <ows:Exception exceptionCode="NoApplicableCode" locator="source">
-    <ows:ExceptionText>Harvest failed: record parsing failed: HTTP Error 404: Not Found</ows:ExceptionText>
-  </ows:Exception>
-</ows:ExceptionReport>
+<csw:HarvestResponse xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xlink="http://www.w3.org/1999/xlink" xml [...]
+  <csw:TransactionResponse version="2.0.2">
+    <csw:TransactionSummary>
+      <csw:totalInserted>6</csw:totalInserted>
+      <csw:totalUpdated>0</csw:totalUpdated>
+      <csw:totalDeleted>0</csw:totalDeleted>
+    </csw:TransactionSummary>
+    <csw:InsertResult>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>GeoServer Web Feature Service</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-geoss_water_sba:Reservoir</dc:identifier>
+        <dc:title>Reservoir</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-geoss_water_sba:glwd_1</dc:identifier>
+        <dc:title>glwd_1</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-geoss_water_sba:Dams</dc:identifier>
+        <dc:title>Dams</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-geoss_water_sba:glwd_2</dc:identifier>
+        <dc:title>glwd_2</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-geoss_water_sba:Lakes</dc:identifier>
+        <dc:title>Lakes</dc:title>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-ows-dc.xml b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-ows-dc.xml
index 15b9c30..45b4df5 100644
--- a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-ows-dc.xml
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-ows-dc.xml
@@ -2,22 +2,18 @@
 <!-- PYCSW_VERSION -->
 <csw:GetRecordsResponse xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xlink="http://www.w3.org/1999/xlink"  [...]
   <csw:SearchStatus timestamp="PYCSW_TIMESTAMP"/>
-  <csw:SearchResults nextRecord="6" numberOfRecordsMatched="7" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+  <csw:SearchResults nextRecord="6" numberOfRecordsMatched="8" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
     <csw:Record>
       <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
-      <dc:title>My GeoServer CSW</dc:title>
+      <dc:title></dc:title>
       <dc:type>service</dc:type>
-      <dc:subject>CSW</dc:subject>
-      <dc:subject>Catalog Services For The Web</dc:subject>
-      <dc:subject>GEOSERVER</dc:subject>
+      <dc:subject></dc:subject>
       <dc:format>CSW</dc:format>
-      <dct:references scheme="OGC:CSW">http://suite.opengeo.org/geoserver/ows</dct:references>
-      <dct:abstract>This is a description of your Catalog Services For The Web.</dct:abstract>
-      <dc:creator>Boundless</dc:creator>
-      <dc:publisher>Boundless</dc:publisher>
-      <dc:contributor>Boundless</dc:contributor>
-      <dc:source>http://suite.opengeo.org/geoserver/ows</dc:source>
-      <dc:rights>NONE</dc:rights>
+      <dct:references scheme="OGC:CSW">http://sdi.georchestra.org/geoserver/ows</dct:references>
+      <dc:creator>geOrchestra PSC</dc:creator>
+      <dc:publisher>geOrchestra</dc:publisher>
+      <dc:contributor>geOrchestra PSC</dc:contributor>
+      <dc:source>http://sdi.georchestra.org/geoserver/ows</dc:source>
     </csw:Record>
     <csw:Record>
       <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
@@ -72,7 +68,7 @@
       <dc:source>http://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</dc:source>
       <dc:rights>NONE</dc:rights>
       <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
-        <ows:LowerCorner>40.88 -73.73</ows:LowerCorner>
+        <ows:LowerCorner>40.58 -73.73</ows:LowerCorner>
         <ows:UpperCorner>47.79 -54.05</ows:UpperCorner>
       </ows:BoundingBox>
     </csw:Record>
@@ -101,35 +97,23 @@
     </csw:Record>
     <csw:Record>
       <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
-      <dc:title>Atlas of the Cryosphere: Northern Hemisphere</dc:title>
+      <dc:title>WCS Demo Server for MapServer</dc:title>
       <dc:type>service</dc:type>
-      <dc:subject>Arctic</dc:subject>
-      <dc:subject>Cryosphere</dc:subject>
-      <dc:subject>Earth Science</dc:subject>
-      <dc:subject>Ice Extent</dc:subject>
-      <dc:subject>Ice Sheets</dc:subject>
-      <dc:subject>Northern Hemisphere</dc:subject>
-      <dc:subject>Oceans</dc:subject>
-      <dc:subject>Polar</dc:subject>
-      <dc:subject>Sea Ice</dc:subject>
-      <dc:subject>Sea Ice Concentration</dc:subject>
-      <dc:subject>Snow/Ice</dc:subject>
-      <dc:subject>Snow Cover</dc:subject>
-      <dc:subject>Snow Melt</dc:subject>
-      <dc:subject>Snow Water Equivalent</dc:subject>
+      <dc:subject>WCS</dc:subject>
+      <dc:subject>MODIS</dc:subject>
+      <dc:subject>NDVI</dc:subject>
       <dc:format>OGC:WCS</dc:format>
-      <dct:references scheme="OGC:WCS">http://nsidc.org/cgi-bin/atlas_north</dct:references>
-      <dct:abstract>The National Snow and Ice Data Center (NSIDC) Atlas of the Cryosphere is a map server that provides data and information pertinent to the frozen regions of Earth, including monthly climatologies of sea ice extent and concentration, snow cover extent, and snow water equivalent, in addition to glacier outlines, permafrost extent and classification, ice sheet elevation and accumulation, and more. In order to support polar projections, the Atlas is divided into two separa [...]
-      <dc:creator>NSIDC User Services</dc:creator>
-      <dc:publisher>National Snow and Ice Data Center</dc:publisher>
-      <dc:contributor>NSIDC User Services</dc:contributor>
-      <dc:source>http://nsidc.org/cgi-bin/atlas_north</dc:source>
+      <dct:references scheme="OGC:WCS">http://demo.mapserver.org/cgi-bin/wcs</dct:references>
+      <dc:creator>Steve Lime</dc:creator>
+      <dc:publisher>Minnesota DNR</dc:publisher>
+      <dc:contributor>Steve Lime</dc:contributor>
+      <dc:source>http://demo.mapserver.org/cgi-bin/wcs</dc:source>
       <dc:rights>
-    none
+    NONE
   </dc:rights>
       <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
-        <ows:LowerCorner>-89.32 -180.0</ows:LowerCorner>
-        <ows:UpperCorner>89.59 179.98</ows:UpperCorner>
+        <ows:LowerCorner>41.03 -97.71</ows:LowerCorner>
+        <ows:UpperCorner>49.67 -80.68</ows:UpperCorner>
       </ows:BoundingBox>
     </csw:Record>
   </csw:SearchResults>
diff --git a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-dc.xml b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-dc.xml
index b05073e..921f77b 100644
--- a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-dc.xml
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-dc.xml
@@ -38,7 +38,7 @@
       <dc:source>http://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</dc:source>
       <dc:rights>NONE</dc:rights>
       <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
-        <ows:LowerCorner>40.88 -73.73</ows:LowerCorner>
+        <ows:LowerCorner>40.58 -73.73</ows:LowerCorner>
         <ows:UpperCorner>47.79 -54.05</ows:UpperCorner>
       </ows:BoundingBox>
     </csw:Record>
diff --git a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-iso.xml b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-iso.xml
index af710b4..92e0af7 100644
--- a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-iso.xml
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-iso.xml
@@ -15,9 +15,59 @@
       </gmd:hierarchyLevel>
       <gmd:contact>
         <gmd:CI_ResponsibleParty>
-          <gmd:organisationName>
+          <gmd:individualName>
             <gco:CharacterString>Eric Bridger</gco:CharacterString>
+          </gmd:individualName>
+          <gmd:organisationName>
+            <gco:CharacterString>NERACOOS</gco:CharacterString>
           </gmd:organisationName>
+          <gmd:positionName>
+            <gco:CharacterString>DMAC Coordinator</gco:CharacterString>
+          </gmd:positionName>
+          <gmd:contactInfo>
+            <gmd:CI_Contact>
+              <gmd:phone>
+                <gmd:CI_Telephone>
+                  <gmd:voice>
+                    <gco:CharacterString>207 228-1662</gco:CharacterString>
+                  </gmd:voice>
+                  <gmd:facsimile>
+                    <gco:CharacterString/>
+                  </gmd:facsimile>
+                </gmd:CI_Telephone>
+              </gmd:phone>
+              <gmd:address>
+                <gmd:CI_Address>
+                  <gmd:deliveryPoint>
+                    <gco:CharacterString>350 Commercial St.</gco:CharacterString>
+                  </gmd:deliveryPoint>
+                  <gmd:city>
+                    <gco:CharacterString>Portland</gco:CharacterString>
+                  </gmd:city>
+                  <gmd:administrativeArea>
+                    <gco:CharacterString>ME</gco:CharacterString>
+                  </gmd:administrativeArea>
+                  <gmd:postalCode>
+                    <gco:CharacterString>04101</gco:CharacterString>
+                  </gmd:postalCode>
+                  <gmd:country>
+                    <gco:CharacterString>US</gco:CharacterString>
+                  </gmd:country>
+                  <gmd:electronicMailAddress>
+                    <gco:CharacterString>ebridger at gmri.org</gco:CharacterString>
+                  </gmd:electronicMailAddress>
+                </gmd:CI_Address>
+              </gmd:address>
+              <gmd:onlineResource>
+                <gmd:linkage>
+                  <gmd:URL>http://www.neracoos.org/</gmd:URL>
+                </gmd:linkage>
+              </gmd:onlineResource>
+            </gmd:CI_Contact>
+          </gmd:contactInfo>
+          <gmd:role>
+            <gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" codeListValue="pointOfContact">pointOfContact</gmd:CI_RoleCode>
+          </gmd:role>
         </gmd:CI_ResponsibleParty>
       </gmd:contact>
       <gmd:dateStamp>
@@ -201,7 +251,7 @@
                     <gco:Decimal>-54.05</gco:Decimal>
                   </gmd:eastBoundLongitude>
                   <gmd:southBoundLatitude>
-                    <gco:Decimal>40.88</gco:Decimal>
+                    <gco:Decimal>40.58</gco:Decimal>
                   </gmd:southBoundLatitude>
                   <gmd:northBoundLatitude>
                     <gco:Decimal>47.79</gco:Decimal>
@@ -229,16 +279,6 @@
                 <gco:CharacterString>GetObservation</gco:CharacterString>
               </srv:operationName>
               <srv:identifier>
-                <gco:CharacterString>F02</gco:CharacterString>
-              </srv:identifier>
-            </srv:SV_CoupledResource>
-          </srv:coupledResource>
-          <srv:coupledResource>
-            <srv:SV_CoupledResource>
-              <srv:operationName>
-                <gco:CharacterString>GetObservation</gco:CharacterString>
-              </srv:operationName>
-              <srv:identifier>
                 <gco:CharacterString>F01</gco:CharacterString>
               </srv:identifier>
             </srv:SV_CoupledResource>
@@ -249,7 +289,7 @@
                 <gco:CharacterString>GetObservation</gco:CharacterString>
               </srv:operationName>
               <srv:identifier>
-                <gco:CharacterString>ALL_PLATFORMS</gco:CharacterString>
+                <gco:CharacterString>F02</gco:CharacterString>
               </srv:identifier>
             </srv:SV_CoupledResource>
           </srv:coupledResource>
@@ -439,6 +479,16 @@
                 <gco:CharacterString>GetObservation</gco:CharacterString>
               </srv:operationName>
               <srv:identifier>
+                <gco:CharacterString>ALL_PLATFORMS</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetObservation</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
                 <gco:CharacterString>A01</gco:CharacterString>
               </srv:identifier>
             </srv:SV_CoupledResource>
@@ -479,6 +529,16 @@
                 <gco:CharacterString>GetObservation</gco:CharacterString>
               </srv:operationName>
               <srv:identifier>
+                <gco:CharacterString>CDIP207</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetObservation</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
                 <gco:CharacterString>44060</gco:CharacterString>
               </srv:identifier>
             </srv:SV_CoupledResource>
@@ -544,9 +604,8 @@
             </srv:SV_OperationMetadata>
           </srv:containsOperations>
           <srv:operatesOn uuidref="CML" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-CML"/>
-          <srv:operatesOn uuidref="F02" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-F02"/>
           <srv:operatesOn uuidref="F01" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-F01"/>
-          <srv:operatesOn uuidref="ALL_PLATFORMS" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-ALL_PLATFORMS"/>
+          <srv:operatesOn uuidref="F02" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-F02"/>
           <srv:operatesOn uuidref="SMB-MO-04" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-SMB-MO-04"/>
           <srv:operatesOn uuidref="LDLC3" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-LDLC3"/>
           <srv:operatesOn uuidref="CDIP154" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-CDIP154"/>
@@ -565,10 +624,12 @@
           <srv:operatesOn uuidref="44098" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-44098"/>
           <srv:operatesOn uuidref="WLIS" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-WLIS"/>
           <srv:operatesOn uuidref="CO2" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-CO2"/>
+          <srv:operatesOn uuidref="ALL_PLATFORMS" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-ALL_PLATFORMS"/>
           <srv:operatesOn uuidref="A01" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-A01"/>
           <srv:operatesOn uuidref="MDS02" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-MDS02"/>
           <srv:operatesOn uuidref="GREAT_BAY" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-GREAT_BAY"/>
           <srv:operatesOn uuidref="I01" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-I01"/>
+          <srv:operatesOn uuidref="CDIP207" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-CDIP207"/>
           <srv:operatesOn uuidref="44060" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-44060"/>
         </srv:SV_ServiceIdentification>
       </gmd:identificationInfo>
@@ -609,9 +670,59 @@
       </gmd:hierarchyLevel>
       <gmd:contact>
         <gmd:CI_ResponsibleParty>
-          <gmd:organisationName>
+          <gmd:individualName>
             <gco:CharacterString>Boyan Brodaric</gco:CharacterString>
+          </gmd:individualName>
+          <gmd:organisationName>
+            <gco:CharacterString>Geological Survey of Canada, Earth Sciences Sector, Natural Resources Canada, Government of Canada</gco:CharacterString>
           </gmd:organisationName>
+          <gmd:positionName>
+            <gco:CharacterString>Research Scientist</gco:CharacterString>
+          </gmd:positionName>
+          <gmd:contactInfo>
+            <gmd:CI_Contact>
+              <gmd:phone>
+                <gmd:CI_Telephone>
+                  <gmd:voice>
+                    <gco:CharacterString>+1-613-992-3562</gco:CharacterString>
+                  </gmd:voice>
+                  <gmd:facsimile>
+                    <gco:CharacterString>+1-613-995-9273</gco:CharacterString>
+                  </gmd:facsimile>
+                </gmd:CI_Telephone>
+              </gmd:phone>
+              <gmd:address>
+                <gmd:CI_Address>
+                  <gmd:deliveryPoint>
+                    <gco:CharacterString>615 Booth Street</gco:CharacterString>
+                  </gmd:deliveryPoint>
+                  <gmd:city>
+                    <gco:CharacterString>Ottawa</gco:CharacterString>
+                  </gmd:city>
+                  <gmd:administrativeArea>
+                    <gco:CharacterString/>
+                  </gmd:administrativeArea>
+                  <gmd:postalCode>
+                    <gco:CharacterString>K1A 0E9</gco:CharacterString>
+                  </gmd:postalCode>
+                  <gmd:country>
+                    <gco:CharacterString>Canada</gco:CharacterString>
+                  </gmd:country>
+                  <gmd:electronicMailAddress>
+                    <gco:CharacterString>brodaric at nrcan dot gc dot ca</gco:CharacterString>
+                  </gmd:electronicMailAddress>
+                </gmd:CI_Address>
+              </gmd:address>
+              <gmd:onlineResource>
+                <gmd:linkage>
+                  <gmd:URL>http://gw-info.net</gmd:URL>
+                </gmd:linkage>
+              </gmd:onlineResource>
+            </gmd:CI_Contact>
+          </gmd:contactInfo>
+          <gmd:role>
+            <gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" codeListValue="pointOfContact">pointOfContact</gmd:CI_RoleCode>
+          </gmd:role>
         </gmd:CI_ResponsibleParty>
       </gmd:contact>
       <gmd:dateStamp>
diff --git a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wfs-iso.xml b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wfs-iso.xml
new file mode 100644
index 0000000..a869821
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wfs-iso.xml
@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordsResponse xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xlink="http://www.w3.org/1999/xlink"  [...]
+  <csw:SearchStatus timestamp="PYCSW_TIMESTAMP"/>
+  <csw:SearchResults nextRecord="0" numberOfRecordsMatched="1" numberOfRecordsReturned="1" recordSchema="http://www.isotc211.org/2005/gmd" elementSet="full">
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd">
+      <gmd:fileIdentifier>
+        <gco:CharacterString>PYCSW_IDENTIFIER</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:language>
+        <gco:CharacterString/>
+      </gmd:language>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="service" codeSpace="ISOTC211/19115">service</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:contact>
+        <gmd:CI_ResponsibleParty>
+          <gmd:individualName>
+            <gco:CharacterString>Matt Austin</gco:CharacterString>
+          </gmd:individualName>
+          <gmd:organisationName>
+            <gco:CharacterString>National Oceanic and Atmospheric Administration</gco:CharacterString>
+          </gmd:organisationName>
+          <gmd:positionName>
+            <gco:CharacterString/>
+          </gmd:positionName>
+          <gmd:contactInfo>
+            <gmd:CI_Contact>
+              <gmd:phone>
+                <gmd:CI_Telephone>
+                  <gmd:voice>
+                    <gco:CharacterString/>
+                  </gmd:voice>
+                  <gmd:facsimile>
+                    <gco:CharacterString/>
+                  </gmd:facsimile>
+                </gmd:CI_Telephone>
+              </gmd:phone>
+              <gmd:address>
+                <gmd:CI_Address>
+                  <gmd:deliveryPoint>
+                    <gco:CharacterString/>
+                  </gmd:deliveryPoint>
+                  <gmd:city>
+                    <gco:CharacterString>Silver Spring</gco:CharacterString>
+                  </gmd:city>
+                  <gmd:administrativeArea>
+                    <gco:CharacterString>Maryland</gco:CharacterString>
+                  </gmd:administrativeArea>
+                  <gmd:postalCode>
+                    <gco:CharacterString>20910</gco:CharacterString>
+                  </gmd:postalCode>
+                  <gmd:country>
+                    <gco:CharacterString>USA</gco:CharacterString>
+                  </gmd:country>
+                  <gmd:electronicMailAddress>
+                    <gco:CharacterString/>
+                  </gmd:electronicMailAddress>
+                </gmd:CI_Address>
+              </gmd:address>
+            </gmd:CI_Contact>
+          </gmd:contactInfo>
+          <gmd:role>
+            <gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" codeListValue="pointOfContact">pointOfContact</gmd:CI_RoleCode>
+          </gmd:role>
+        </gmd:CI_ResponsibleParty>
+      </gmd:contact>
+      <gmd:dateStamp>
+        <gco:Date/>
+      </gmd:dateStamp>
+      <gmd:metadataStandardName>
+        <gco:CharacterString>ISO19119</gco:CharacterString>
+      </gmd:metadataStandardName>
+      <gmd:metadataStandardVersion>
+        <gco:CharacterString>2005/PDAM 1</gco:CharacterString>
+      </gmd:metadataStandardVersion>
+      <gmd:identificationInfo>
+        <srv:SV_ServiceIdentification id="PYCSW_IDENTIFIER">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>GeoServer Web Feature Service</gco:CharacterString>
+              </gmd:title>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:abstract>
+            <gco:CharacterString>This is the reference implementation of WFS 1.0.0 and WFS 1.1.0, supports all WFS operations including Transaction.</gco:CharacterString>
+          </gmd:abstract>
+          <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>WFS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>WMS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>GEOSERVER</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </gmd:descriptiveKeywords>
+          <gmd:language>
+            <gco:CharacterString/>
+          </gmd:language>
+          <srv:serviceType>
+            <gco:LocalName>OGC:WFS</gco:LocalName>
+          </srv:serviceType>
+          <srv:serviceTypeVersion>
+            <gco:CharacterString>1.1.0</gco:CharacterString>
+          </srv:serviceTypeVersion>
+          <srv:keywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>WFS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>WMS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>GEOSERVER</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </srv:keywords>
+          <srv:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>-189.85</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>190.98</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>-176.73</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>212.97</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </srv:extent>
+          <srv:couplingType>
+            <srv:SV_CouplingType codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#SV_CouplingType" codeListValue="tight">tight</srv:SV_CouplingType>
+          </srv:couplingType>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetFeature</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>geoss_water_sba:Reservoir</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetFeature</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>geoss_water_sba:glwd_1</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetFeature</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>geoss_water_sba:Dams</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetFeature</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>geoss_water_sba:glwd_2</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetFeature</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>geoss_water_sba:Lakes</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetCapabilities</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>DescribeFeatureType</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetFeature</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetGmlObject</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>LockFeature</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetFeatureWithLock</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>Transaction</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:operatesOn uuidref="geoss_water_sba:Reservoir" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-geoss_water_sba:Reservoir"/>
+          <srv:operatesOn uuidref="geoss_water_sba:glwd_1" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-geoss_water_sba:glwd_1"/>
+          <srv:operatesOn uuidref="geoss_water_sba:Dams" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-geoss_water_sba:Dams"/>
+          <srv:operatesOn uuidref="geoss_water_sba:glwd_2" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-geoss_water_sba:glwd_2"/>
+          <srv:operatesOn uuidref="geoss_water_sba:Lakes" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-geoss_water_sba:Lakes"/>
+        </srv:SV_ServiceIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>OGC:WFS</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>PYCSW_IDENTIFIER</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>OGC-WFS Web Feature Service</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wms-iso.xml b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wms-iso.xml
new file mode 100644
index 0000000..b918a00
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wms-iso.xml
@@ -0,0 +1,308 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordsResponse xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xlink="http://www.w3.org/1999/xlink"  [...]
+  <csw:SearchStatus timestamp="PYCSW_TIMESTAMP"/>
+  <csw:SearchResults nextRecord="0" numberOfRecordsMatched="1" numberOfRecordsReturned="1" recordSchema="http://www.isotc211.org/2005/gmd" elementSet="full">
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd">
+      <gmd:fileIdentifier>
+        <gco:CharacterString>PYCSW_IDENTIFIER</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:language>
+        <gco:CharacterString/>
+      </gmd:language>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="service" codeSpace="ISOTC211/19115">service</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:contact>
+        <gmd:CI_ResponsibleParty>
+          <gmd:individualName>
+            <gco:CharacterString>Daryl Herzmann</gco:CharacterString>
+          </gmd:individualName>
+          <gmd:organisationName>
+            <gco:CharacterString>Iowa State University</gco:CharacterString>
+          </gmd:organisationName>
+          <gmd:positionName>
+            <gco:CharacterString/>
+          </gmd:positionName>
+          <gmd:contactInfo>
+            <gmd:CI_Contact>
+              <gmd:address>
+                <gmd:CI_Address>
+                  <gmd:deliveryPoint>
+                    <gco:CharacterString/>
+                  </gmd:deliveryPoint>
+                  <gmd:city>
+                    <gco:CharacterString/>
+                  </gmd:city>
+                  <gmd:administrativeArea>
+                    <gco:CharacterString/>
+                  </gmd:administrativeArea>
+                  <gmd:postalCode>
+                    <gco:CharacterString/>
+                  </gmd:postalCode>
+                  <gmd:country>
+                    <gco:CharacterString/>
+                  </gmd:country>
+                  <gmd:electronicMailAddress>
+                    <gco:CharacterString/>
+                  </gmd:electronicMailAddress>
+                </gmd:CI_Address>
+              </gmd:address>
+              <gmd:onlineResource>
+                <gmd:linkage>
+                  <gmd:URL>http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi?</gmd:URL>
+                </gmd:linkage>
+              </gmd:onlineResource>
+            </gmd:CI_Contact>
+          </gmd:contactInfo>
+        </gmd:CI_ResponsibleParty>
+      </gmd:contact>
+      <gmd:dateStamp>
+        <gco:Date/>
+      </gmd:dateStamp>
+      <gmd:metadataStandardName>
+        <gco:CharacterString>ISO19119</gco:CharacterString>
+      </gmd:metadataStandardName>
+      <gmd:metadataStandardVersion>
+        <gco:CharacterString>2005/PDAM 1</gco:CharacterString>
+      </gmd:metadataStandardVersion>
+      <gmd:identificationInfo>
+        <srv:SV_ServiceIdentification id="PYCSW_IDENTIFIER">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>IEM WMS Service</gco:CharacterString>
+              </gmd:title>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:abstract>
+            <gco:CharacterString>IEM generated CONUS composite of NWS WSR-88D level III base reflectivity.</gco:CharacterString>
+          </gmd:abstract>
+          <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString/>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </gmd:descriptiveKeywords>
+          <gmd:language>
+            <gco:CharacterString/>
+          </gmd:language>
+          <srv:serviceType>
+            <gco:LocalName>OGC:WMS</gco:LocalName>
+          </srv:serviceType>
+          <srv:serviceTypeVersion>
+            <gco:CharacterString>1.1.1</gco:CharacterString>
+          </srv:serviceTypeVersion>
+          <srv:keywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString/>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </srv:keywords>
+          <srv:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>-126.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>-66.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>50.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </srv:extent>
+          <srv:couplingType>
+            <srv:SV_CouplingType codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#SV_CouplingType" codeListValue="tight">tight</srv:SV_CouplingType>
+          </srv:couplingType>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetMap</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>time_idx</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetMap</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>nexrad-n0r-wmst</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetMap</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>nexrad_base_reflect</gco:CharacterString>
+              </srv:identifier>
+            </srv:SV_CoupledResource>
+          </srv:coupledResource>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetCapabilities</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetMap</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetFeatureInfo</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>DescribeLayer</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetLegendGraphic</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetStyles</gco:CharacterString>
+              </srv:operationName>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPGet">HTTPGet</srv:DCPList>
+              </srv:DCP>
+              <srv:DCP>
+                <srv:DCPList codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#DCPList" codeListValue="HTTPPost">HTTPPost</srv:DCPList>
+              </srv:DCP>
+              <srv:connectPoint>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:operatesOn uuidref="time_idx" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-time_idx"/>
+          <srv:operatesOn uuidref="nexrad-n0r-wmst" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-nexrad-n0r-wmst"/>
+          <srv:operatesOn uuidref="nexrad_base_reflect" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=PYCSW_IDENTIFIER-nexrad_base_reflect"/>
+        </srv:SV_ServiceIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>OGC:WMS</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>PYCSW_IDENTIFIER</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>OGC-WMS Web Map Service</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_harvesting_post_Transaction-000-delete-all.xml b/tests/expected/suites_harvesting_post_Transaction-000-delete-all.xml
index 4781e5a..866312a 100644
--- a/tests/expected/suites_harvesting_post_Transaction-000-delete-all.xml
+++ b/tests/expected/suites_harvesting_post_Transaction-000-delete-all.xml
@@ -4,6 +4,6 @@
   <csw:TransactionSummary>
     <csw:totalInserted>0</csw:totalInserted>
     <csw:totalUpdated>0</csw:totalUpdated>
-    <csw:totalDeleted>121</csw:totalDeleted>
+    <csw:totalDeleted>108</csw:totalDeleted>
   </csw:TransactionSummary>
 </csw:TransactionResponse>
diff --git a/tests/index.html b/tests/index.html
index 936fc72..bfb5977 100644
--- a/tests/index.html
+++ b/tests/index.html
@@ -66,202 +66,204 @@
                     <td>
                         <select class="xml">
                             <option value="none">Select a CSW Request</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Transaction-delete.xml">suites/default/post/Transaction-delete.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetCapabilities-SOAP.xml">suites/default/post/GetCapabilities-SOAP.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-and-nested-or2.xml">suites/default/post/GetRecords-filter-and-nested-or2.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-or-nested-and.xml">suites/default/post/GetRecords-filter-or-nested-and.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetCapabilities-updatesequence.xml">suites/default/post/GetCapabilities-updatesequence.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetDomain-parameter.xml">suites/default/post/GetDomain-parameter.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-anytext-equal.xml">suites/default/post/GetRecords-filter-anytext-equal.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-and-nested-or.xml">suites/default/post/GetRecords-filter-and-nested-or.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-bbox-filter-crs84.xml">suites/default/post/GetRecords-bbox-filter-crs84.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all.xml">suites/default/post/GetRecords-all.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-or-bbox-freetext.xml">suites/default/post/GetRecords-filter-or-bbox-freetext.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/DescribeRecord.xml">suites/default/post/DescribeRecord.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Transaction-update-full.xml">suites/default/post/Transaction-update-full.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Transaction-update-recordproperty.xml">suites/default/post/Transaction-update-recordproperty.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Harvest-response-handler.xml">suites/default/post/Harvest-response-handler.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-function-bad.xml">suites/default/post/GetRecords-filter-function-bad.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecordById.xml">suites/default/post/GetRecordById.xml</option>
+                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/GetRecords-filter-bbox-full.xml">suites/ebrim/post/GetRecords-filter-bbox-full.xml</option>
+                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/GetCapabilities.xml">suites/ebrim/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/GetRecords-filter-bbox.xml">suites/ebrim/post/GetRecords-filter-bbox.xml</option>
+                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/DescribeRecord.xml">suites/ebrim/post/DescribeRecord.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-and-bbox-freetext.xml">suites/default/post/GetRecords-filter-and-bbox-freetext.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-bbox-reproject.xml">suites/default/post/GetRecords-filter-bbox-reproject.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-distributedsearch.xml">suites/default/post/GetRecords-distributedsearch.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all-sortby-bbox.xml">suites/default/post/GetRecords-all-sortby-bbox.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Exception-GetRecords-badsrsname.xml">suites/default/post/Exception-GetRecords-badsrsname.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Exception-GetRecords-elementname.xml">suites/default/post/Exception-GetRecords-elementname.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-between.xml">suites/default/post/GetRecords-filter-between.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-maxrecords.xml">suites/default/post/GetRecords-maxrecords.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetCapabilities-sections.xml">suites/default/post/GetCapabilities-sections.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-function.xml">suites/default/post/GetRecords-filter-function.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-anytext.xml">suites/default/post/GetRecords-filter-anytext.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Exception-GetRecords-badsrsname.xml">suites/default/post/Exception-GetRecords-badsrsname.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all-json.xml">suites/default/post/GetRecords-all-json.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Harvest-default.xml">suites/default/post/Harvest-default.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all-resulttype-hits.xml">suites/default/post/GetRecords-all-resulttype-hits.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-requestid.xml">suites/default/post/GetRecords-requestid.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-cql-title.xml">suites/default/post/GetRecords-cql-title.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Transaction-insert.xml">suites/default/post/Transaction-insert.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/DescribeRecord-json.xml">suites/default/post/DescribeRecord-json.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/Exception-GetRecords-invalid-xml.xml">suites/default/post/Exception-GetRecords-invalid-xml.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-not-bbox.xml">suites/default/post/GetRecords-filter-not-bbox.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetRecordById-json.xml">suites/default/post/GetRecordById-json.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-or-title-abstract.xml">suites/default/post/GetRecords-filter-or-title-abstract.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all-resulttype-validate.xml">suites/default/post/GetRecords-all-resulttype-validate.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Exception-GetRecords-invalid-xml.xml">suites/default/post/Exception-GetRecords-invalid-xml.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-requestid.xml">suites/default/post/GetRecords-requestid.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetCapabilities-sections.xml">suites/default/post/GetCapabilities-sections.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all.xml">suites/default/post/GetRecords-all.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetCapabilities.xml">suites/default/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-bbox-filter-crs84.xml">suites/default/post/GetRecords-bbox-filter-crs84.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-bbox-reproject.xml">suites/default/post/GetRecords-filter-bbox-reproject.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-anytext-equal.xml">suites/default/post/GetRecords-filter-anytext-equal.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetDomain-property.xml">suites/default/post/GetDomain-property.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-or-title-abstract.xml">suites/default/post/GetRecords-filter-or-title-abstract.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-anytext-and-not.xml">suites/default/post/GetRecords-filter-anytext-and-not.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-bbox-sortby.xml">suites/default/post/GetRecords-filter-bbox-sortby.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetCapabilities.xml">suites/default/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Transaction-update-full.xml">suites/default/post/Transaction-update-full.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-and-nested-or.xml">suites/default/post/GetRecords-filter-and-nested-or.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-or-nested-and.xml">suites/default/post/GetRecords-filter-or-nested-and.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-bbox.xml">suites/default/post/GetRecords-filter-bbox.xml</option>
-                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-not-bbox.xml">suites/default/post/GetRecords-filter-not-bbox.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetCapabilities-SOAP.xml">suites/default/post/GetCapabilities-SOAP.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-function.xml">suites/default/post/GetRecords-filter-function.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetDomain-parameter.xml">suites/default/post/GetDomain-parameter.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-anytext.xml">suites/default/post/GetRecords-filter-anytext.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Exception-GetRecords-elementname.xml">suites/default/post/Exception-GetRecords-elementname.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Transaction-insert.xml">suites/default/post/Transaction-insert.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetCapabilities-updatesequence.xml">suites/default/post/GetCapabilities-updatesequence.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all-resulttype-validate.xml">suites/default/post/GetRecords-all-resulttype-validate.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-end.xml">suites/default/post/GetRecords-end.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-distributedsearch.xml">suites/default/post/GetRecords-distributedsearch.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-function-bad.xml">suites/default/post/GetRecords-filter-function-bad.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Harvest-response-handler.xml">suites/default/post/Harvest-response-handler.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all-sortby-bbox.xml">suites/default/post/GetRecords-all-sortby-bbox.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-or-bbox-freetext.xml">suites/default/post/GetRecords-filter-or-bbox-freetext.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-and-nested-or2.xml">suites/default/post/GetRecords-filter-and-nested-or2.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/DescribeRecord.xml">suites/default/post/DescribeRecord.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Transaction-update-recordproperty.xml">suites/default/post/Transaction-update-recordproperty.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-cql-title.xml">suites/default/post/GetRecords-cql-title.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Transaction-delete.xml">suites/default/post/Transaction-delete.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-between.xml">suites/default/post/GetRecords-filter-between.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-all-resulttype-hits.xml">suites/default/post/GetRecords-all-resulttype-hits.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecordById.xml">suites/default/post/GetRecordById.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/Harvest-default.xml">suites/default/post/Harvest-default.xml</option>
                             <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-elementname.xml">suites/default/post/GetRecords-elementname.xml</option>
-                            <option value="tests/suites/dif/default.cfg,suites/dif/post/DescribeRecord.xml">suites/dif/post/DescribeRecord.xml</option>
-                            <option value="tests/suites/dif/default.cfg,suites/dif/post/GetCapabilities.xml">suites/dif/post/GetCapabilities.xml</option>
-                            <option value="tests/suites/dif/default.cfg,suites/dif/post/GetRecords-filter-bbox.xml">suites/dif/post/GetRecords-filter-bbox.xml</option>
-                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/DescribeRecord.xml">suites/ebrim/post/DescribeRecord.xml</option>
-                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/GetRecords-filter-bbox-full.xml">suites/ebrim/post/GetRecords-filter-bbox-full.xml</option>
-                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/GetCapabilities.xml">suites/ebrim/post/GetCapabilities.xml</option>
-                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/GetRecords-filter-bbox.xml">suites/ebrim/post/GetRecords-filter-bbox.xml</option>
-                            <option value="tests/suites/utf-8/default.cfg,suites/utf-8/post/GetCapabilities.xml">suites/utf-8/post/GetCapabilities.xml</option>
-                            <option value="tests/suites/repofilter/default.cfg,suites/repofilter/post/GetRecords-all.xml">suites/repofilter/post/GetRecords-all.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/GetRecords-filter-bbox-sortby.xml">suites/default/post/GetRecords-filter-bbox-sortby.xml</option>
+                            <option value="tests/suites/default/default.cfg,suites/default/post/DescribeRecord-json.xml">suites/default/post/DescribeRecord-json.xml</option>
+                            <option value="tests/suites/atom/default.cfg,suites/atom/post/GetCapabilities.xml">suites/atom/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/atom/default.cfg,suites/atom/post/GetRecords-filter-bbox.xml">suites/atom/post/GetRecords-filter-bbox.xml</option>
+                            <option value="tests/suites/atom/default.cfg,suites/atom/post/DescribeRecord.xml">suites/atom/post/DescribeRecord.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-dc.xml">suites/harvesting/post/Harvest-dc.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-layer.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-layer.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-waf.xml">suites/harvesting/post/Harvest-waf.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-dc.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-dc.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-sos200.xml">suites/harvesting/post/Harvest-sos200.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-csw-run1.xml">suites/harvesting/post/Harvest-csw-run1.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-iso.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-iso.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-csw-iso.xml">suites/harvesting/post/Harvest-csw-iso.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/GetCapabilities.xml">suites/harvesting/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-csw-run2.xml">suites/harvesting/post/Harvest-csw-run2.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Exception-Havest-csw-404.xml">suites/harvesting/post/Exception-Havest-csw-404.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-fgdc.xml">suites/harvesting/post/Harvest-fgdc.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-sos100.xml">suites/harvesting/post/Harvest-sos100.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/GetDomain-parameter.xml">suites/harvesting/post/GetDomain-parameter.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-rdf.xml">suites/harvesting/post/Harvest-rdf.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Clear-000-delete-all.xml">suites/harvesting/post/Clear-000-delete-all.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Transaction-000-delete-all.xml">suites/harvesting/post/Transaction-000-delete-all.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wms-run2.xml">suites/harvesting/post/Harvest-wms-run2.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-iso.xml">suites/harvesting/post/Harvest-iso.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wps.xml">suites/harvesting/post/Harvest-wps.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-dc.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-dc.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wfs.xml">suites/harvesting/post/Harvest-wfs.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wms-run1.xml">suites/harvesting/post/Harvest-wms-run1.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wfs-iso.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wfs-iso.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-iso.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-iso.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wcs.xml">suites/harvesting/post/Harvest-wcs.xml</option>
                             <option value="tests/suites/repofilter/default.cfg,suites/repofilter/post/GetRecordById-masked.xml">suites/repofilter/post/GetRecordById-masked.xml</option>
+                            <option value="tests/suites/repofilter/default.cfg,suites/repofilter/post/GetRecords-all.xml">suites/repofilter/post/GetRecords-all.xml</option>
+                            <option value="tests/suites/fgdc/default.cfg,suites/fgdc/post/GetCapabilities.xml">suites/fgdc/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/fgdc/default.cfg,suites/fgdc/post/GetRecords-filter-bbox.xml">suites/fgdc/post/GetRecords-filter-bbox.xml</option>
+                            <option value="tests/suites/fgdc/default.cfg,suites/fgdc/post/DescribeRecord.xml">suites/fgdc/post/DescribeRecord.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-05-delete.xml">suites/manager/post/Transaction-iso-05-delete.xml</option>
                             <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-00-delete-all.xml">suites/manager/post/Transaction-iso-00-delete-all.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/GetDomain-parameter.xml">suites/manager/post/GetDomain-parameter.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-04-update-recprop-no-matches.xml">suites/manager/post/Transaction-iso-04-update-recprop-no-matches.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-03-update-recprop.xml">suites/manager/post/Transaction-iso-03-update-recprop.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-dc-02-update-full.xml">suites/manager/post/Transaction-dc-02-update-full.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/GetCapabilities.xml">suites/manager/post/GetCapabilities.xml</option>
                             <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-dc-01-insert.xml">suites/manager/post/Transaction-dc-01-insert.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-01-insert.xml">suites/manager/post/Transaction-iso-01-insert.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-fgdc-02-update-recprop.xml">suites/manager/post/Transaction-fgdc-02-update-recprop.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-04-update-recprop-no-matches.xml">suites/manager/post/Transaction-iso-04-update-recprop-no-matches.xml</option>
                             <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-xxx-delete-all.xml">suites/manager/post/Transaction-xxx-delete-all.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/GetDomain-parameter.xml">suites/manager/post/GetDomain-parameter.xml</option>
                             <option value="tests/suites/manager/default.cfg,suites/manager/post/Clear-000-delete-all.xml">suites/manager/post/Clear-000-delete-all.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-fgdc-01-insert.xml">suites/manager/post/Transaction-fgdc-01-insert.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-03-update-recprop.xml">suites/manager/post/Transaction-iso-03-update-recprop.xml</option>
                             <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-000-delete-all.xml">suites/manager/post/Transaction-000-delete-all.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-01-insert.xml">suites/manager/post/Transaction-iso-01-insert.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-dc-02-update-full.xml">suites/manager/post/Transaction-dc-02-update-full.xml</option>
                             <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-fgdc-03-delete-all.xml">suites/manager/post/Transaction-fgdc-03-delete-all.xml</option>
+                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-fgdc-01-insert.xml">suites/manager/post/Transaction-fgdc-01-insert.xml</option>
                             <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-02-update-full.xml">suites/manager/post/Transaction-iso-02-update-full.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-iso-05-delete.xml">suites/manager/post/Transaction-iso-05-delete.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/GetCapabilities.xml">suites/manager/post/GetCapabilities.xml</option>
-                            <option value="tests/suites/manager/default.cfg,suites/manager/post/Transaction-fgdc-02-update-recprop.xml">suites/manager/post/Transaction-fgdc-02-update-recprop.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-servicetype.xml">suites/apiso/post/GetRecords-filter-servicetype.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-all.xml">suites/apiso/post/GetRecords-all.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/DescribeRecord.xml">suites/apiso/post/DescribeRecord.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-and-nested-spatial-or-dateline.xml">suites/apiso/post/GetRecords-filter-and-nested-spatial-or-dateline.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecordById-srv-brief.xml">suites/apiso/post/GetRecordById-srv-brief.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-anytext.xml">suites/apiso/post/GetRecords-filter-anytext.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecordById-brief.xml">suites/apiso/post/GetRecordById-brief.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecordById-full-dc.xml">suites/apiso/post/GetRecordById-full-dc.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-cql-title.xml">suites/apiso/post/GetRecords-cql-title.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecordById-full.xml">suites/apiso/post/GetRecordById-full.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-all-csw-output.xml">suites/apiso/post/GetRecords-all-csw-output.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetDomain-property.xml">suites/apiso/post/GetDomain-property.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetCapabilities.xml">suites/apiso/post/GetCapabilities.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-bbox.xml">suites/apiso/post/GetRecords-filter-bbox.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-bbox-csw-output.xml">suites/apiso/post/GetRecords-filter-bbox-csw-output.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-elementname.xml">suites/apiso/post/GetRecords-elementname.xml</option>
+                            <option value="tests/suites/utf-8/default.cfg,suites/utf-8/post/GetCapabilities.xml">suites/utf-8/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/dif/default.cfg,suites/dif/post/GetCapabilities.xml">suites/dif/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/dif/default.cfg,suites/dif/post/GetRecords-filter-bbox.xml">suites/dif/post/GetRecords-filter-bbox.xml</option>
+                            <option value="tests/suites/dif/default.cfg,suites/dif/post/DescribeRecord.xml">suites/dif/post/DescribeRecord.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/test.xml">suites/apiso/data/test.xml</option>
                             <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_pmoed_DTM_1996_276401.xml">suites/apiso/data/T_pmoed_DTM_1996_276401.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_ortho_RAS_1998_288395.xml">suites/apiso/data/T_ortho_RAS_1998_288395.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_pmoed_DTM_1996_280395.xml">suites/apiso/data/T_pmoed_DTM_1996_280395.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_ortho_RAS_1998_288404.xml">suites/apiso/data/T_ortho_RAS_1998_288404.xml</option>
                             <option value="tests/suites/apiso/default.cfg,suites/apiso/data/3e9a8c05.xml">suites/apiso/data/3e9a8c05.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000012.xml">suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000012.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000014.xml">suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000014.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/pacioos-NS06agg.xml">suites/apiso/data/pacioos-NS06agg.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_ortho_RAS_1998_288395.xml">suites/apiso/data/T_ortho_RAS_1998_288395.xml</option>
                             <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_ortho_RAS_1998_288401.xml">suites/apiso/data/T_ortho_RAS_1998_288401.xml</option>
                             <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_ortho_RAS_1998_284404.xml">suites/apiso/data/T_ortho_RAS_1998_284404.xml</option>
                             <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000013.xml">suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000013.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000015.xml">suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000015.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_ortho_RAS_1998_288398.xml">suites/apiso/data/T_ortho_RAS_1998_288398.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_pmoed_DTM_1996_276398.xml">suites/apiso/data/T_pmoed_DTM_1996_276398.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_pmoed_DTM_1996_276395.xml">suites/apiso/data/T_pmoed_DTM_1996_276395.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_ortho_RAS_1998_288404.xml">suites/apiso/data/T_ortho_RAS_1998_288404.xml</option>
-                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/test.xml">suites/apiso/data/test.xml</option>
                             <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_pmoed_DTM_1996_276404.xml">suites/apiso/data/T_pmoed_DTM_1996_276404.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_pmoed_DTM_1996_280395.xml">suites/apiso/data/T_pmoed_DTM_1996_280395.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000012.xml">suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000012.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_pmoed_DTM_1996_276395.xml">suites/apiso/data/T_pmoed_DTM_1996_276395.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_pmoed_DTM_1996_276398.xml">suites/apiso/data/T_pmoed_DTM_1996_276398.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/pacioos-NS06agg.xml">suites/apiso/data/pacioos-NS06agg.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000014.xml">suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000014.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_ortho_RAS_1998_288398.xml">suites/apiso/data/T_ortho_RAS_1998_288398.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000015.xml">suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000015.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecordById-full-dc.xml">suites/apiso/post/GetRecordById-full-dc.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-and-nested-spatial-or-dateline.xml">suites/apiso/post/GetRecords-filter-and-nested-spatial-or-dateline.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-all.xml">suites/apiso/post/GetRecords-all.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetCapabilities.xml">suites/apiso/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecordById-full.xml">suites/apiso/post/GetRecordById-full.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-servicetype.xml">suites/apiso/post/GetRecords-filter-servicetype.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetDomain-property.xml">suites/apiso/post/GetDomain-property.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecordById-srv-brief.xml">suites/apiso/post/GetRecordById-srv-brief.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-bbox-csw-output.xml">suites/apiso/post/GetRecords-filter-bbox-csw-output.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-bbox.xml">suites/apiso/post/GetRecords-filter-bbox.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecordById-brief.xml">suites/apiso/post/GetRecordById-brief.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-filter-anytext.xml">suites/apiso/post/GetRecords-filter-anytext.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/DescribeRecord.xml">suites/apiso/post/DescribeRecord.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-all-csw-output.xml">suites/apiso/post/GetRecords-all-csw-output.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-cql-title.xml">suites/apiso/post/GetRecords-cql-title.xml</option>
+                            <option value="tests/suites/apiso/default.cfg,suites/apiso/post/GetRecords-elementname.xml">suites/apiso/post/GetRecords-elementname.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml">suites/cite/data/Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml">suites/cite/data/Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml">suites/cite/data/Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml">suites/cite/data/Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml">suites/cite/data/Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml">suites/cite/data/Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml">suites/cite/data/Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml">suites/cite/data/Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml">suites/cite/data/Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml">suites/cite/data/Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml">suites/cite/data/Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml">suites/cite/data/Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/5c5861bc-f742-40a5-9998-5342615d674b.xml">suites/cite/post/5c5861bc-f742-40a5-9998-5342615d674b.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/19d2a6ed-be28-4866-ae15-e3bb634486cb.xml">suites/cite/post/19d2a6ed-be28-4866-ae15-e3bb634486cb.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/4735d649-a2b1-42fd-a101-14e1d7e4607f.xml">suites/cite/post/4735d649-a2b1-42fd-a101-14e1d7e4607f.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/f7d79701-f10b-4087-a33c-f62df0a04fd1.xml">suites/cite/post/f7d79701-f10b-4087-a33c-f62df0a04fd1.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml">suites/cite/post/dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/c8588f47-8e65-45f5-ad34-ff4524cad84d.xml">suites/cite/post/c8588f47-8e65-45f5-ad34-ff4524cad84d.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml">suites/cite/post/418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml">suites/cite/post/c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml">suites/cite/post/948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml">suites/cite/post/87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/c311a342-72e3-4983-be39-868e6ed9740f.xml">suites/cite/post/c311a342-72e3-4983-be39-868e6ed9740f.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml">suites/cite/post/da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml">suites/cite/post/e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/78297c88-4850-4927-adc6-511cd9a3d539.xml">suites/cite/post/78297c88-4850-4927-adc6-511cd9a3d539.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml">suites/cite/post/8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml">suites/cite/post/fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml">suites/cite/post/1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml">suites/cite/post/1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml">suites/cite/post/9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/928c1896-52d4-4ac7-9832-f98e3eb65f02.xml">suites/cite/post/928c1896-52d4-4ac7-9832-f98e3eb65f02.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/fe20960f-a26c-4f13-852d-470a0d3233f9.xml">suites/cite/post/fe20960f-a26c-4f13-852d-470a0d3233f9.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/420b745e-0c4b-404e-9f2d-61fa580ff05a.xml">suites/cite/post/420b745e-0c4b-404e-9f2d-61fa580ff05a.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/7e2cd105-daec-4d25-bc8e-d49d21364912.xml">suites/cite/post/7e2cd105-daec-4d25-bc8e-d49d21364912.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/c02d1c85-df9f-45ee-bea7-345c35e02a98.xml">suites/cite/post/c02d1c85-df9f-45ee-bea7-345c35e02a98.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml">suites/cite/post/948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml">suites/cite/post/c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/898cd63b-2585-4ec0-8720-d554bd324174.xml">suites/cite/post/898cd63b-2585-4ec0-8720-d554bd324174.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/af39c020-7b1d-429c-b474-f45c3164cb79.xml">suites/cite/post/af39c020-7b1d-429c-b474-f45c3164cb79.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml">suites/cite/post/1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/0c976d98-c896-4b10-b1fe-a22ef50434e7.xml">suites/cite/post/0c976d98-c896-4b10-b1fe-a22ef50434e7.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/225f455a-0035-486b-a94e-fee7ae881b2b.xml">suites/cite/post/225f455a-0035-486b-a94e-fee7ae881b2b.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/ba9b0107-dcee-46ef-823a-a2e25a911a96.xml">suites/cite/post/ba9b0107-dcee-46ef-823a-a2e25a911a96.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/2102a460-5d62-465f-9668-d70b3faafbfa.xml">suites/cite/post/2102a460-5d62-465f-9668-d70b3faafbfa.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml">suites/cite/post/73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml">suites/cite/post/7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml">suites/cite/post/87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml">suites/cite/post/b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/ad61686c-d304-42d1-b845-8c1f3070c83e.xml">suites/cite/post/ad61686c-d304-42d1-b845-8c1f3070c83e.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/928c1896-52d4-4ac7-9832-f98e3eb65f02.xml">suites/cite/post/928c1896-52d4-4ac7-9832-f98e3eb65f02.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml">suites/cite/post/88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/898cd63b-2585-4ec0-8720-d554bd324174.xml">suites/cite/post/898cd63b-2585-4ec0-8720-d554bd324174.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/f7976c55-a156-4421-8199-bc0487da4b0f.xml">suites/cite/post/f7976c55-a156-4421-8199-bc0487da4b0f.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/c02d1c85-df9f-45ee-bea7-345c35e02a98.xml">suites/cite/post/c02d1c85-df9f-45ee-bea7-345c35e02a98.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml">suites/cite/post/6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/f7d79701-f10b-4087-a33c-f62df0a04fd1.xml">suites/cite/post/f7d79701-f10b-4087-a33c-f62df0a04fd1.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml">suites/cite/post/418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/34a019a9-1581-42cb-9827-fbfdda2773b7.xml">suites/cite/post/34a019a9-1581-42cb-9827-fbfdda2773b7.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/2d53ffea-60e4-4652-abf5-36eb23042fd5.xml">suites/cite/post/2d53ffea-60e4-4652-abf5-36eb23042fd5.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/3e76fd38-e035-41c9-83dc-61356f680c97.xml">suites/cite/post/3e76fd38-e035-41c9-83dc-61356f680c97.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/78297c88-4850-4927-adc6-511cd9a3d539.xml">suites/cite/post/78297c88-4850-4927-adc6-511cd9a3d539.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/e308f030-c097-4036-a838-44bad74c9ef7.xml">suites/cite/post/e308f030-c097-4036-a838-44bad74c9ef7.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/af39c020-7b1d-429c-b474-f45c3164cb79.xml">suites/cite/post/af39c020-7b1d-429c-b474-f45c3164cb79.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/5c5861bc-f742-40a5-9998-5342615d674b.xml">suites/cite/post/5c5861bc-f742-40a5-9998-5342615d674b.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/bb66ebc5-7121-48b5-9f53-b56537d9561b.xml">suites/cite/post/bb66ebc5-7121-48b5-9f53-b56537d9561b.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/0c976d98-c896-4b10-b1fe-a22ef50434e7.xml">suites/cite/post/0c976d98-c896-4b10-b1fe-a22ef50434e7.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml">suites/cite/post/1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml">suites/cite/post/6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml">suites/cite/post/9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml">suites/cite/post/dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/93bdbb9d-2734-4f01-92fb-48634cca41de.xml">suites/cite/post/93bdbb9d-2734-4f01-92fb-48634cca41de.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml">suites/cite/post/dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/19d2a6ed-be28-4866-ae15-e3bb634486cb.xml">suites/cite/post/19d2a6ed-be28-4866-ae15-e3bb634486cb.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml">suites/cite/post/b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/f7976c55-a156-4421-8199-bc0487da4b0f.xml">suites/cite/post/f7976c55-a156-4421-8199-bc0487da4b0f.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml">suites/cite/post/fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml">suites/cite/post/73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml">suites/cite/post/8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml">suites/cite/post/da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/7e2cd105-daec-4d25-bc8e-d49d21364912.xml">suites/cite/post/7e2cd105-daec-4d25-bc8e-d49d21364912.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/fe20960f-a26c-4f13-852d-470a0d3233f9.xml">suites/cite/post/fe20960f-a26c-4f13-852d-470a0d3233f9.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/420b745e-0c4b-404e-9f2d-61fa580ff05a.xml">suites/cite/post/420b745e-0c4b-404e-9f2d-61fa580ff05a.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml">suites/cite/post/e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/bb66ebc5-7121-48b5-9f53-b56537d9561b.xml">suites/cite/post/bb66ebc5-7121-48b5-9f53-b56537d9561b.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml">suites/cite/post/1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/ba9b0107-dcee-46ef-823a-a2e25a911a96.xml">suites/cite/post/ba9b0107-dcee-46ef-823a-a2e25a911a96.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml">suites/cite/post/7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/c8588f47-8e65-45f5-ad34-ff4524cad84d.xml">suites/cite/post/c8588f47-8e65-45f5-ad34-ff4524cad84d.xml</option>
                             <option value="tests/suites/cite/default.cfg,suites/cite/post/a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml">suites/cite/post/a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/ad61686c-d304-42d1-b845-8c1f3070c83e.xml">suites/cite/post/ad61686c-d304-42d1-b845-8c1f3070c83e.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/post/34a019a9-1581-42cb-9827-fbfdda2773b7.xml">suites/cite/post/34a019a9-1581-42cb-9827-fbfdda2773b7.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml">suites/cite/data/Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml">suites/cite/data/Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml">suites/cite/data/Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml">suites/cite/data/Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml">suites/cite/data/Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml">suites/cite/data/Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml">suites/cite/data/Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml">suites/cite/data/Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml">suites/cite/data/Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml">suites/cite/data/Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml">suites/cite/data/Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml</option>
-                            <option value="tests/suites/cite/default.cfg,suites/cite/data/Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml">suites/cite/data/Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml</option>
-                            <option value="tests/suites/atom/default.cfg,suites/atom/post/DescribeRecord.xml">suites/atom/post/DescribeRecord.xml</option>
-                            <option value="tests/suites/atom/default.cfg,suites/atom/post/GetCapabilities.xml">suites/atom/post/GetCapabilities.xml</option>
-                            <option value="tests/suites/atom/default.cfg,suites/atom/post/GetRecords-filter-bbox.xml">suites/atom/post/GetRecords-filter-bbox.xml</option>
-                            <option value="tests/suites/fgdc/default.cfg,suites/fgdc/post/DescribeRecord.xml">suites/fgdc/post/DescribeRecord.xml</option>
-                            <option value="tests/suites/fgdc/default.cfg,suites/fgdc/post/GetCapabilities.xml">suites/fgdc/post/GetCapabilities.xml</option>
-                            <option value="tests/suites/fgdc/default.cfg,suites/fgdc/post/GetRecords-filter-bbox.xml">suites/fgdc/post/GetRecords-filter-bbox.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-dc.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-dc.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/GetDomain-parameter.xml">suites/harvesting/post/GetDomain-parameter.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-sos200.xml">suites/harvesting/post/Harvest-sos200.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-iso.xml">suites/harvesting/post/Harvest-iso.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-iso.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-iso.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Exception-Havest-csw-404.xml">suites/harvesting/post/Exception-Havest-csw-404.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-csw-run2.xml">suites/harvesting/post/Harvest-csw-run2.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wms-run1.xml">suites/harvesting/post/Harvest-wms-run1.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-rdf.xml">suites/harvesting/post/Harvest-rdf.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-csw-run1.xml">suites/harvesting/post/Harvest-csw-run1.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-dc.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-dc.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wps.xml">suites/harvesting/post/Harvest-wps.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-waf.xml">suites/harvesting/post/Harvest-waf.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Clear-000-delete-all.xml">suites/harvesting/post/Clear-000-delete-all.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wms-run2.xml">suites/harvesting/post/Harvest-wms-run2.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Transaction-000-delete-all.xml">suites/harvesting/post/Transaction-000-delete-all.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-layer.xml">suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-layer.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wfs.xml">suites/harvesting/post/Harvest-wfs.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-sos100.xml">suites/harvesting/post/Harvest-sos100.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-wcs.xml">suites/harvesting/post/Harvest-wcs.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-fgdc.xml">suites/harvesting/post/Harvest-fgdc.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/GetCapabilities.xml">suites/harvesting/post/GetCapabilities.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-csw-iso.xml">suites/harvesting/post/Harvest-csw-iso.xml</option>
-                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-dc.xml">suites/harvesting/post/Harvest-dc.xml</option>
+                            <option value="tests/suites/cite/default.cfg,suites/cite/post/dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml">suites/cite/post/dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml</option>
 
                         </select>
                         <input type="button" class="send" value="Send"/>
@@ -291,6 +293,44 @@
 <li><a href="../csw.py?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full&resulttype=results&sortby=dc:title:D">GetRecords-sortby-desc</a></li>
 <li><a href="../csw.py?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full&resulttype=results&sortby=dc:titlei:A">GetRecords-sortby-invalid-propertyname</a></li>
 <li><a href="../csw.py?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full&resulttype=results&sortby=dc:title:FOO">GetRecords-sortby-invalid-order</a></li>
+<li><a href="../csw.py?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full&resulttype=results&constraintlanguage=FILTER&constraint=%3Cogc%3AFilter%20xmlns%3Aogc%3D%22http%3A%2F%2Fwww.opengis.net%2Fogc%22%3E%3Cogc%3APropertyIsEqualTo%3E%3Cogc%3APropertyName%3Edc%3Atitle%3C%2Fogc%3APropertyName%3E%3Cogc%3ALiteral%3ELorem%20ipsum%3C%2Fogc%3ALiteral%3E%3C%2Fogc%3APropertyIsEqualTo%3E%3C% [...]
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&resulttype=results&elementsetname=brief">opensearch</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetCapabilities">opensearch-description</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&q=greece">opensearch-ogc-q</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&bbox=-180,-90,180,90">opensearch-ogc-bbox</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=2001/2004">opensearch-ogc-time</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=2004/">opensearch-ogc-timestart</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=/2004">opensearch-ogc-timeend</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=2001/2007&q=vitae">opensearch-ogc-q-and-time</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=2001/2007&bbox=-180,-90,180,90">opensearch-ogc-bbox-and-time</a></li>
+<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&q=vegetation&bbox=-180,-90,180,90">opensearch-ogc-q-and-bbox</a></li>
+<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest">Exception-Harvest-missing-resourcetype</a></li>
+<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=http://www.opengis.net/wms">Exception-Harvest-missing-source</a></li>
+<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=http://www.opengis.net/wms1234&source=http://demo.pycsw.org/cite/csw">Exception-Harvest-invalid-resourcetype</a></li>
+<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=urn:geoss:waf&source=http://demo.pycsw.org">Exception-Harvest-waf-no-records-found</a></li>
+<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=urn:geoss:waf&source=badvalue">Exception-Harvest-waf-bad-value</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh">empty</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&">empty_with_amp</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=foo">bad_verb</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=foo&foo=bar">illegal_verb</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=Identify">Identify</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListSets">ListSets</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListMetadataFormats">ListMetadataFormats</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=GetRecord&identifier=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f&metadataPrefix=csw-record">GetRecord_dc</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=GetRecord&identifier=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f&metadataPrefix=csw-recordd">GetRecord_bad_metadata_prefix</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=GetRecord&identifier=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f&metadataPrefix=oai_dc">GetRecord_oai_dc</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=GetRecord&identifier=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f&metadataPrefix=iso19139">GetRecord_iso</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers">ListIdentifiers_missing_metadata_prefix</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers&metadataPrefix=csw-record">ListIdentifiers_dc</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers&metadataPrefix=iso19139">ListIdentifiers_iso</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers&metadataPrefix=oai_dc">ListIdentifiers_oai_dc</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers&metadataPrefix=foo">ListIdentifiers_bad_metadata_prefix</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListRecords&metadataPrefix=csw-record">ListRecords_dc</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListRecords&metadataPrefix=csw-recording">ListRecords_dc_bad_metadata_prefix</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListRecords&metadataPrefix=oai_dc">ListRecords_oai_dc</a></li>
+<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListRecords&metadataPrefix=iso19139">ListRecords_iso19139</a></li>
+<li><a href="../csw.py?config=tests/suites/apiso-inspire/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities">GetCapabilities</a></li>
+<li><a href="../csw.py?config=tests/suites/apiso-inspire/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities&lang=gre">GetCapabilities-lang</a></li>
 <li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities">27e17158-c57a-4493-92ac-dba8934cf462</a></li>
 <li><a href="../csw.py?config=tests/suites/cite/default.cfg&Service=CSW&Version=2.0.2&Request=GetRecordById&ElementSetName=brief&ID=urn%3Auuid%3A19887a8a-f6b0-4a63-ae56-7fba0e17801f">27f69b66-5f05-4311-a89c-73ca55c2686b</a></li>
 <li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities&acceptversions=2.0.2&date=2006-10-20">2ab7d1fa-885b-459f-80e4-b6282eab4f8c</a></li>
@@ -313,48 +353,11 @@
 <li><a href="../csw.py?config=tests/suites/cite/default.cfg&request=GetCapabilities">c4ea754f-c158-4d8d-8253-dc8f86021b52</a></li>
 <li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities">f4692ec5-9547-4a05-88ab-e6154af2640a</a></li>
 <li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&id=urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63">f997f25e-c865-4d53-a362-0ed1846337f2</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh">empty</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&">empty_with_amp</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=foo">bad_verb</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=foo&foo=bar">illegal_verb</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=Identify">Identify</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListSets">ListSets</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListMetadataFormats">ListMetadataFormats</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=GetRecord&identifier=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f&metadataPrefix=csw-record">GetRecord_dc</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=GetRecord&identifier=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f&metadataPrefix=csw-recordd">GetRecord_bad_metadata_prefix</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=GetRecord&identifier=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f&metadataPrefix=oai_dc">GetRecord_oai_dc</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=GetRecord&identifier=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f&metadataPrefix=iso19139">GetRecord_iso</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers">ListIdentifiers_missing_metadata_prefix</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers&metadataPrefix=csw-record">ListIdentifiers_dc</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers&metadataPrefix=iso19139">ListIdentifiers_iso</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers&metadataPrefix=oai_dc">ListIdentifiers_oai_dc</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListIdentifiers&metadataPrefix=foo">ListIdentifiers_bad_metadata_prefix</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListRecords&metadataPrefix=csw-record">ListRecords_dc</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListRecords&metadataPrefix=csw-recording">ListRecords_dc_bad_metadata_prefix</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListRecords&metadataPrefix=oai_dc">ListRecords_oai_dc</a></li>
-<li><a href="../csw.py?config=tests/suites/oaipmh/default.cfg&mode=oaipmh&verb=ListRecords&metadataPrefix=iso19139">ListRecords_iso19139</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&resulttype=results&elementsetname=brief">opensearch</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetCapabilities">opensearch-description</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&q=greece">opensearch-ogc-q</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&bbox=-180,-90,180,90">opensearch-ogc-bbox</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=2001/2004">opensearch-ogc-time</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=2004/">opensearch-ogc-timestart</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=/2004">opensearch-ogc-timeend</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=2001/2007&q=vitae">opensearch-ogc-q-and-time</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&time=2001/2007&bbox=-180,-90,180,90">opensearch-ogc-bbox-and-time</a></li>
-<li><a href="../csw.py?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=full&resulttype=results&typenames=csw:Record&q=vegetation&bbox=-180,-90,180,90">opensearch-ogc-q-and-bbox</a></li>
 <li><a href="../csw.py?config=tests/suites/sru/default.cfg&mode=sru">explain</a></li>
 <li><a href="../csw.py?config=tests/suites/sru/default.cfg&mode=sru&version=1.1&operation=searchRetrieve&query=lor">search</a></li>
 <li><a href="../csw.py?config=tests/suites/sru/default.cfg&mode=sru&operation=searchRetrieve&query=lor&maximumRecords=2">search_maxrecords</a></li>
 <li><a href="../csw.py?config=tests/suites/sru/default.cfg&mode=sru&operation=searchRetrieve&query=lor&maximumRecords=2&startRecord=1">search_startrecord_maxrecords</a></li>
 <li><a href="../csw.py?config=tests/suites/sru/default.cfg&mode=sru&operation=searchRetrieve&query=dc:title%20like%20'%lor%'&maximumRecords=5">search_cql</a></li>
-<li><a href="../csw.py?config=tests/suites/apiso-inspire/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities">GetCapabilities</a></li>
-<li><a href="../csw.py?config=tests/suites/apiso-inspire/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities&lang=gre">GetCapabilities-lang</a></li>
-<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest">Exception-Harvest-missing-resourcetype</a></li>
-<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=http://www.opengis.net/wms">Exception-Harvest-missing-source</a></li>
-<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=http://www.opengis.net/wms1234&source=http://demo.pycsw.org/cite/csw">Exception-Harvest-invalid-resourcetype</a></li>
-<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=urn:geoss:waf&source=http://demo.pycsw.org">Exception-Harvest-waf-no-records-found</a></li>
-<li><a href="../csw.py?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=urn:geoss:waf&source=badvalue">Exception-Harvest-waf-bad-value</a></li>
 
             </ul>
         <hr/>
diff --git a/tests/run_tests.py b/tests/run_tests.py
index 799d9e8..16f18ec 100644
--- a/tests/run_tests.py
+++ b/tests/run_tests.py
@@ -207,7 +207,7 @@ REMOTE = False
 
 try:
     OPTS, ARGS = getopt.getopt(sys.argv[1:], 'u:l:s:d:rh')
-except getopt.GetoptError, err:
+except getopt.GetoptError as err:
     print '\nERROR: %s' % err
     print usage()
     sys.exit(2)
diff --git a/tests/suites/default/get/requests.txt b/tests/suites/default/get/requests.txt
index 897622a..ad0fa8e 100644
--- a/tests/suites/default/get/requests.txt
+++ b/tests/suites/default/get/requests.txt
@@ -5,3 +5,4 @@ GetRecords-sortby-asc,PYCSW_SERVER?config=tests/suites/default/default.cfg&servi
 GetRecords-sortby-desc,PYCSW_SERVER?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full&resulttype=results&sortby=dc:title:D
 GetRecords-sortby-invalid-propertyname,PYCSW_SERVER?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full&resulttype=results&sortby=dc:titlei:A
 GetRecords-sortby-invalid-order,PYCSW_SERVER?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full&resulttype=results&sortby=dc:title:FOO
+GetRecords-filter,PYCSW_SERVER?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full&resulttype=results&constraintlanguage=FILTER&constraint=%3Cogc%3AFilter%20xmlns%3Aogc%3D%22http%3A%2F%2Fwww.opengis.net%2Fogc%22%3E%3Cogc%3APropertyIsEqualTo%3E%3Cogc%3APropertyName%3Edc%3Atitle%3C%2Fogc%3APropertyName%3E%3Cogc%3ALiteral%3ELorem%20ipsum%3C%2Fogc%3ALiteral%3E%3C%2Fogc%3APropertyIsEqualTo%3E%3C%2Fogc%3AFilter%3E
diff --git a/tests/suites/harvesting/post/Harvest-csw-iso.xml b/tests/suites/harvesting/post/Harvest-csw-iso.xml
index c1baa3c..dd8d736 100644
--- a/tests/suites/harvesting/post/Harvest-csw-iso.xml
+++ b/tests/suites/harvesting/post/Harvest-csw-iso.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/cat/csw/2.0.2 htt
 p://schemas.opengis.net/csw/2.0.2/CSW-publication.xsd" service="CSW" version="2.0.2">
-  <Source>http://suite.opengeo.org/geoserver/ows</Source>
+  <Source>http://sdi.georchestra.org/geoserver/ows</Source>
   <ResourceType>http://www.opengis.net/cat/csw/2.0.2</ResourceType>
   <ResourceFormat>application/xml</ResourceFormat>
 </Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-wcs.xml b/tests/suites/harvesting/post/Harvest-wcs.xml
index 1767aef..f59f4cc 100644
--- a/tests/suites/harvesting/post/Harvest-wcs.xml
+++ b/tests/suites/harvesting/post/Harvest-wcs.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-publication.xsd" service="CSW" version="2.0.2">
-  <Source>http://nsidc.org/cgi-bin/atlas_north</Source>
+  <Source>http://demo.mapserver.org/cgi-bin/wcs</Source>
   <ResourceType>http://www.opengis.net/wcs</ResourceType>
   <ResourceFormat>application/xml</ResourceFormat>
 </Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-wfs.xml b/tests/suites/harvesting/post/Harvest-wfs.xml
index 4eb45ed..72e28fb 100644
--- a/tests/suites/harvesting/post/Harvest-wfs.xml
+++ b/tests/suites/harvesting/post/Harvest-wfs.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-publication.xsd" service="CSW" version="2.0.2">
-    <Source>http://services.ogc.noaa.gov/geoserver/geoss_water_sba</Source>
+    <Source>http://services.ogc.noaa.gov/geoserver/geoss_water_sba/wfs</Source>
   <ResourceType>http://www.opengis.net/wfs</ResourceType>
   <ResourceFormat>application/xml</ResourceFormat>
 </Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml
index 10591ec..5fe7eff 100644
--- a/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml
@@ -11,7 +11,7 @@
           </ogc:PropertyIsEqualTo>
           <ogc:PropertyIsEqualTo>
             <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
-            <ogc:Literal>WPS</ogc:Literal>
+            <ogc:Literal>OGC:WPS</ogc:Literal>
           </ogc:PropertyIsEqualTo>
           <ogc:PropertyIsEqualTo>
             <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
@@ -19,11 +19,11 @@
           </ogc:PropertyIsEqualTo>
           <ogc:PropertyIsEqualTo>
             <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
-            <ogc:Literal>WFS</ogc:Literal>
+            <ogc:Literal>OGC:WFS</ogc:Literal>
           </ogc:PropertyIsEqualTo>
           <ogc:PropertyIsEqualTo>
             <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
-            <ogc:Literal>CSW</ogc:Literal>
+            <ogc:Literal>OGC:CSW</ogc:Literal>
           </ogc:PropertyIsEqualTo>
           <ogc:PropertyIsEqualTo>
             <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
diff --git a/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wfs-iso.xml b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wfs-iso.xml
new file mode 100644
index 0000000..3e26f62
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wfs-iso.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" service="CSW" version="2.0.2" resultType="results" startPosition="1" maxRecords="5" outputFormat="application/xml" outputSchema="http://www.isotc211.org/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd" xml [...]
+  <csw:Query typeNames="gmd:MD_Metadata">
+    <csw:ElementSetName>full</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:And>      
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:Type</ogc:PropertyName>
+            <ogc:Literal>service</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+            <ogc:Literal>OGC:WFS</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+        </ogc:And>      
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-iso.xml b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-iso.xml
new file mode 100644
index 0000000..f4300e7
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-iso.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" service="CSW" version="2.0.2" resultType="results" startPosition="1" maxRecords="5" outputFormat="application/xml" outputSchema="http://www.isotc211.org/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+  <csw:Query typeNames="gmd:MD_Metadata">
+    <csw:ElementSetName>full</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:And>      
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:Type</ogc:PropertyName>
+            <ogc:Literal>service</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+            <ogc:Literal>OGC:WMS</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+        </ogc:And>      
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pycsw.git



More information about the Pkg-grass-devel mailing list